Как един модел може да се актуализира, да кажем като „статус“ на нещо в Cassandra CQL3 и да може да прави заявки за това състояние?

Това е малко измислен пример, за да илюстрира въпроса ми, но да кажем, че имам обект Car, който съдържа обекти Lightbulb. Една кола има няколко електрически крушки, всяка от които може да бъде "включена", "изключена" или "счупена".

Всеки тип електрическа крушка има уникален идентификатор. (ляв фар = 100, десен фар = 101... такива неща)

Състоянието на електрическа крушка трябва постоянно да се актуализира.

Това, което бих искал да направя, е да направя заявка за конкретна кола за комплект електрически крушки с конкретно състояние.

нещо като: "дайте ми всички електрически крушки с статус "включени" за кола "chevy" модел "nova" vin "xyz-123"".

create table lightbulbstatus (
   bulbid uuid,
   carmake text,
   carmodel text,
   carvin uuid,
   lastupdate timestamp,
   status int,  
                   /* row key *                /* col keys  */
   PRIMARY KEY( (carmake, carmodel, carvin), ?   ?    ?    ?)
);

Вярвам, че ключът на реда трябва да съдържа координатите на автомобила, но освен това съм малко изгубен. Предполагам, че всеки път, когато има промяна на състоянието на крушка, добавяме колона. Но не съм сигурен какви трябва да са ключовете в колоната, за да работи заявката.

Мисля, че в RDBMS-land можете да направите подизбрана или вложена заявка, за да намерите крушки със статус = включено.

select * from lightbulbstatus where status = 1 and lastupdate > (select lastupdate from lightbulbstatus where status != 1);

Нямам идея как бихте направили това в CQL3. Очевидно подизборите не са разрешени.


person marathon    schedule 04.11.2014    source източник
comment
Защо бихте добавили ред за всяка промяна на състоянието? Трябва ли да следите промените или текущото състояние е достатъчно? Разбира се, във вашия измислен пример няма особен смисъл да проследявате колко често и кога се включва или изключва светлина за посока. В действителния ви случай на употреба може да е необходимо.   -  person Marius Waldal    schedule 05.11.2014
comment
Намерението ми беше да добавя нова колона с id/статус/час на крушка за всяка промяна на състоянието. моят ключ за дял трябва да е идентификаторът на колата.   -  person marathon    schedule 05.11.2014
comment
Да, това е, което предположих. Просто се чудех дали това е необходимо във вашия действителен случай на употреба или може би е по-добре да имате обект на електрическа крушка със състояние включено/изключено/счупено, което може да бъде променено. Това е, ако ви трябва само текущото състояние, а не историята на статусите.   -  person Marius Waldal    schedule 05.11.2014
comment
@Handsomeguy Е, всъщност нямам нужда от история на статусите. Аз съм малко нов в nosql и останах с впечатлението, че е по-добре да напиша нов запис, отколкото да актуализирам някои съществуващи данни. Може би не в този пример обаче.   -  person marathon    schedule 06.11.2014
comment
Е, cassandra е оптимизирана за писане, което означава, че е по-бързо да се пише, отколкото да се чете или актуализира. Въпреки това, натискането на данни, които не са необходими само защото са по-бързи, не е нещо, което бих препоръчал. Освен ако не трябва да актуализирате статуса МНОГО често, четенето срещу запис няма значение. И това също би означавало, че имате МНОГО остарели данни в хранилището си. Ще се опитам да ви предложа решение.   -  person Marius Waldal    schedule 06.11.2014


Отговори (1)


Тъй като не е нужно да поддържате хронология на състоянието, бих предложил да имате един ред за всяка крушка чрез следния първичен ключ:

PRIMARY KEY( (carmake, carmodel, carvin), bulbid)

За да направите заявка за електрически крушки по статус, трябва да създадете вторичен индекс:

CREATE INDEX lightbulb_by_status ON lightbulbstatus (status);

SELECT * FROM lightbulbstatus 
  WHERE status = 1 
    AND carmake = 'chevy' 
    AND carmodel = 'nova'
    AND carvin = cfe638e9-5cd9-43c2-b5f4-4cc9a0e6b0ff;

Въпреки че кардиналността на състоянието е ниска, заявката ви включва ключа за дял и е много ефективна.
Ако броят на редовете, които трябва да се филтрират, са много малки (като броя на електрическите крушки в кола), може да обмислите да филтрирате електрическите крушки по статус в приложението (и да пропуснете вторичния индекс).

Ако трябва да се справите със случай, че остаряла актуализация на състоянието на електрическа крушка може да замени по-скорошна актуализация на състоянието (както предполага вашата заявка за RDBMS), помислете за използването на леки транзакции:

UPDATE lightbulbstatus set status = 0, lastupdate = '2014-11-08 23:50:30+0019'
  WHERE carmake = 'chevy' 
    AND carmodel = 'nova' 
    AND carvin = cfe638e9-5cd9-43c2-b5f4-4cc9a0e6b0ff 
    AND bulbid = 9124f318-8253-4d94-b865-3be07899c8ff 
  IF status = 1 AND lastupdate < '2014-11-08 23:50:30+0019';

Дано помогне.

person Ohad Bruker    schedule 08.11.2014