2014-11-04 3 views
0

이것은 내 질문을 설명하기 위해 고안된 약간의 예이지만 전구 전구체가 포함 된 Car 엔티티가 있다고 가정 해 보겠습니다. 자동차에는 여러 개의 전구가 있으며 각 전구는 "켜짐", "꺼짐"또는 "깨짐"일 수 있습니다.Cassandra CQL3의 "상태"와 같이 어떻게이 모델을 업데이트 할 수 있고이 상태를 쿼리 할 수 ​​있습니까?

각 유형의 전구에는 고유 한 ID가 있습니다. (왼쪽 헤드 라이트 = 100, 오른쪽 헤드 라이트 = 101 ... 그런 종류)

전구 상태는 지속적으로 업데이트해야합니다.

내가 원하는 것은 특정 상태의 전구 세트에 대한 특정 차량을 쿼리하는 것입니다. 같은

뭔가 : 는 시보레 "모델"노바 "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에서 subselected 또는 중첩 된 쿼리를 사용하여 status = on 인 전구를 찾을 수 있다고 생각합니다.

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

당신이 CQL3에서이 작업을 수행 할 방법을 모르고. 물론 하위 선택은 허용되지 않습니다.

+0

각 상태 변경에 대해 행을 추가하는 이유는 무엇입니까? 변경 사항을 추적해야합니까, 아니면 현재 상태입니까? 물론, 인위적인 예에서 방향 조명이 켜지거나 꺼지는 빈도를 추적하는 것은별로 의미가 없습니다. 실제 사용 사례에서는 필요할 수 있습니다. – Moonwalkr

+0

나의 상태는 각 상태 변경에 대해 전구 ID/상태/시간이있는 새 열을 추가하려는 것이 었습니다. 내 파티션 키는 자동차 식별자 여야합니다. – marathon

+0

예, 그것이 제가 추측 한 것입니다. 나는 그것이 실제 사용 사례에서 필요한 것인지 궁금하거나, 변경 될 수있는 on/off/broken 상태의 전구 엔티티를 갖는 것이 더 나은지 궁금하다.즉, 현재 상태 만 필요하고 상태 기록은 필요하지 않습니다. – Moonwalkr

답변

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; 

상태의 카디널리티가 낮지 만 your query includes the partition key and is highly efficient.
필터링 할 행 수가 매우 적은 경우 (예 : 자동차의 전구 수) 전구의 상태를 애플리케이션에서 필터링하고 보조 색인을 건너 뛸 수 있습니다. (당신의 RDBMS 쿼리에서 알 수 있듯이) 당신이 오래된 전구의 상태 업데이트가 최신 상태 업데이트를 무시할 수있는 경우를 처리해야하는 경우

, lightweight transactions을 사용하는 것이 좋습니다 :

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'; 

그것이 도움이되기를 바랍니다.