2014-02-27 1 views
3

여러 클러스터링 열 클러스터링 순서 :카산드라 CQL -이 같은 기본 키 정의와 열 가족이

... 
PRIMARY KEY ((website_id, item_id), user_id, date) 

같은 쿼리를 사용하여 조회 할 것이다 :

SELECT * FROM myCF 
WHERE website_id = 30 AND item_id = 10 
AND user_id = 0 AND date > 'some_date' ; 

그러나, 나는 SELECT date FROM myCF ;과 같이 날짜순으로 내 가족을 정렬하려면 가장 최근에 삽입 한 날짜를 반환합니다.

열을 클러스터링하는 순서 때문에 사용자 ID 당 주문 당 주문이 있습니다. I가 기본 키 정의를 변경하는 경우 는 :

PRIMARY KEY ((website_id, item_id), date, user_id) 

제한해야 날짜가 USER_ID이다 나는 더 이상 같은 쿼리를 실행할 수 없습니다.

... 
    PRIMARY KEY ((website_id, shop_id), store_id, date) 
) WITH CLUSTERING ORDER BY (store_id RANDOMPLEASE, date DESC) ; 

하지만 존재하지 않는 것 :

나는이 말을 할 수있는 방법이 될 줄 알았는데. 최악의 경우, 어쩌면 이것은 완전히 어리 석고 나는 이유를 알지 못합니다.

이 방법이 있습니까? 내가 놓친 게 있니?

감사합니다.

답변

5

쿼리 예제는 두 번째 테이블 형식으로 작업 할 수 있도록 user_id를 제한합니다. 실제로, 당신이 그 쿼리를 처리하기 위해 만들어 추가 테이블이 필요

다음
SELECT * FROM myCF 
WHERE website_id = 30 AND item_id = 10 
AND date > 'some_date' 

같은 쿼리를 실행하려고한다면 그것은 단지 날짜에 위해하지에 사용자 ID

Create Table LookupByDate ... PRIMARY KEY ((website_id, item_id), date) 
+0

답장을 보내 주셔서 감사합니다. @RussS. 두 번째 형식 :'PRIMARY KEY ((website_id, item_id), date, user_id)'는 user_id보다 먼저 나오고 non-EQ에 의해 제한되기 때문에'AND user_id = 0 AND date> 'some_date'; 방정식. 파티션 열로 user_id가없는 두 번째 해결 방법은 유니티가 3 중 트랩 (website_id, item_id, date)에 의해 제약되므로 사용자 당 데이터를 가질 수 없습니다. 어딘가 잘못 됐습니까? – kevad

+3

아니요 * 두 테이블 모두 사용하면 안됩니다. 쓰기 시간에 둘 다 삽입하십시오. 각 쿼리 형식에 대해 하나의 테이블이 필요합니다. – RussS

+0

알겠습니다. 나는 당신이 의미하는 바를 이해합니다. 답변 주셔서 감사 드리며 설명해 주셔서 감사합니다! – kevad

1

에서와 기본 쿼리 외에 추가로 "최신 삽입 날짜 반환"을 얻으려고하면 추가 테이블이 필요하지 않을 수 있습니다. "정적 열"을 사용하여 파티션 당 마지막 업데이트 시간을 저장할 수 있습니다. CASSANDRA-6561