2013-07-18 6 views
7

CQL3의 행 키 이외의 복합 키로 데이터 필터링을 쿼리하려고합니다. 이 내 쿼리는 다음과 같습니다Cassandra의 행 키가 아닌 복합 키를 사용하여 쿼리

CREATE TABLE grades (id int, 
    date timestamp, 
    subject text, 
    status text, 
    PRIMARY KEY (id, subject, status, date) 
); 

나는 시도하고 데이터에 액세스,

SELECT * FROM grades where id = 1098; //works fine 
SELECT * FROM grades where subject = 'English' ALLOW FILTERING; //works fine 
SELECT * FROM grades where status = 'Active' ALLOW FILTERING; //gives an error 

잘못된 요청 : PRIMARY KEY 부분의 상태가 제한 될 수 없습니다 (위의 부분 대상이 제한되지 않거나 비 EQ로 관계)

그냥 실험하기 위해, 나는 shuf 'ID'를 항상 내 기본 행 키로 유지하는 데 열쇠를 피했다. 위의 예를 고려하여 기본 행 키 또는 두 번째 키를 사용하여 쿼리 할 수 ​​있습니다. 주체 키와 상태를 바꿔서 상태를 쿼리 할 수 ​​있지만 수행하려고하면 비슷한 오류가 발생합니다. 주제 또는 시간.

내가 잘못 했나요? CQL3에서 다른 복합 키를 사용하여 데이터를 쿼리 할 수 ​​있습니까? Cassandra 1.2.6 및 CQL3을 사용하고 있습니다.

답변

12

카산드라 복합 키 모델 (http://www.datastax.com/docs/1.2/cql_cli/cql/SELECT)에 따라 정상적인 동작을합니다. Cassandra 데이터 모델은 데이터를 저장하고 색인을 생성하는 방식에 "제한"을 초래하는 쿼리를 실행한다는 것을 인정할 때 NoSQL의 일반적인 생각을 목표로합니다. "항상 주체의 이전 부분을 제한해야합니다."기본 키에서.

쿼리의 기본 키 목록에있는 요소를 바꿀 수는 없습니다 (SQL의 더 많은 생각). 복합 키의 여러 요소를 사용하려면 항상 기본 키의 이전 요소를 "제약"/ "제한"해야합니다. 즉, 복합 키 = (id, subject, status, date)가 있고 "status"를 쿼리하려는 경우 "id"및/또는 "subject"를 제한해야합니다 ("or"는 "허용 필터링", 즉 "제목"만 제한하고 "ID"를 제한 할 필요는 없습니다.) 따라서 "상태"에 대한 쿼리를 수행하려면 다음 두 가지 방법으로 쿼리 할 수 ​​있습니다.

select * from grades id = '1093'및 subject = 'English'및 status = 'Active' ;

또는 제목 = '영어'및 상태 = '활성'이 필터링을 허용 등급에서

선택 *;

첫 번째는 특정 "학생"을위한 것이며, 두 번째는 status = "Active"인 주제의 모든 "학생"입니다.

+0

멋진 설명! –

+0

알았습니다! 고마워요, 지금 나에게 훨씬 더 의미가 있습니다. 내 쿼리를 통해 반복하고 상태를 얻을 수 있도록 항상 제목을 제한 할 필요가 없기 때문에 내가 구조화하고 싶은지 확인할 것입니다. – user988544

+0

많이 도와 줬어! 고마워 – kn0x