2014-01-26 1 views
0

저는 Casssandra를 처음 사용하고있어서 데이터 모델을 구현하기가 어렵습니다.Cassandra 데이터 모델을 정의하는 데 어려움이 있습니다.

저는 하나의 테이블을 디자인하는 데 많은 어려움을 겪었습니다.

내가 테이블 정의를 언급하기 전에 내가 당신에게 우리가 내가 모든 카산드라 정의 된 규칙을 따라야합니다 테이블을 만들려면

select * from email where username='suresh' and inactive='N' and type='outbound' 
    order by insert_ts desc allow filtering; 
update email set inactive='Y' where username='suresh' and inactive='N' 
    and id=101; 

기록을 검색하고 업데이트 할 수있는 방법을 보여주고 싶어요. 테이블

에 대한 인덱스를 만드는 동안 내가 기록을 검색 할 수 있어요하지만 난 업데이 트를 수행 할 때, 내가 말하는 오류가 발생하고이

PRIMARY KEY(username, inactive,type,insert_ts); 

같은 기본 키를 만들 경우 나는 문제에 직면하고있다 "기본 키 부분에서 발견 된 "오류가 발생했습니다.

내가 기본 키와 내가 갱신을 할 수 있어요하지만 난 검색 할 때, 내가 말하는 오류를 얻고있다

PRIMARY KEY(username, type,insert_ts); 
Secondary index = inactive; 

"보조 인덱스가 ORDER BY 절에서 허용되지 않습니다"아래 같은 보조 키를 생성하는 경우

내가 나를 어떻게 내 쿼리를 만족 이메일 테이블을 생성하는 것이 좋습니다하시기 바랍니다

Create table email(id int, username varchar, comment text, 
    inactive boolean, insert_ts timestamp, type varchar, 
PRIMARY KEY(<<some columns yet to decide>>)); 

같은 CQL을 사용하여 이메일 테이블을 만들었습니다.

답변

0

귀하의 정보에 따르면 inactive은 새로운 행을 만들지 않고 시간이 지남에 따라 변경하려는 의도가 있으므로 기본 키의 일부가 아니어야합니다. 이것을 기본 가정으로 사용하면 PRIMARY KEY(username, type, insert_ts);을 사용해야합니다.

보조 색인별로 필터링하고 ORDER BY [anything]을 동시에 사용할 수 없습니다. 질의 엔진은 2.0.3 버전에서 이것을 허용하지 않습니다. 두 가지 완화 방법이 가능합니다.

1) inactive을 색인으로 사용하지 말고 필터링에 사용하지 마십시오.

inactive은 낮은 카디널리티 값 (Y 또는 N)을 것으로 보인다, 귀하의 사례를 감안할 때, 또한, 한 번 (당신이 username 및/또는 id에 의해 모두 쿼리 제한)에 몇 행을 조작한다. 따라서 결과의 수와 관련하여 쿼리에서 inactive을 생략하면 비용이 많이 들지 않습니다. SELECT을 사용할 때 클라이언트 측에서 inactive 행을 필터링 할 수 있습니다.

2) ORDER BY 타임 스탬프를 사용하지 마십시오.

클라이언트에서 필터링하는 대신 클라이언트에서 정렬하는 것을 제외하고 위와 같습니다.

어떤 완화 조치가 더 적절한 지에 대한 결정은 데이터 및 사용 사례를 통해 알려야합니다. 내 직감은 # 1이 가장 좋은 방법이라는 것입니다. 극히 낮은 카디널리티를 도입했기 때문에 자주 업데이트 된 편의성이 훨씬 낮은 것으로 보이는 색인이 자주 업데이트됩니다.

0

답장을 보내 주셔서 감사합니다.

귀하의 제안에 따라 카디널리티가 낮은 비활성 열은 기본 키에서 제거되어야 함을 이해합니다. 나는 좋다, 나는 클라이언트 쪽에서 비활성 필터링을 할 것이다. 그러나, 클라이언트 측에서 insert_ts를 필터링하는 것은 내 문제를 해결하지 못할 것입니다. 그 테이블에 수천 개의 이메일 레코드가있을 것이기 때문입니다.

Create table email(id int, username varchar, comment text, 
    inactive boolean, insert_ts timestamp, type varchar, 
PRIMARY KEY(username,type,insert_ts, id)) 
With Clustering(Type ASC, insert_ts desc, id asc); 

또한 우리가 100 카산드라의 한계와 이메일 기록을 표시하는 요구 사항 제한 조항을 가지고 있기 때문에 내가 필터링을 담당, 기본 키에 ID 열을 추가하고 싶습니다 그리고 난 찾을 id 값을 사용할 수 있습니다 다음 100 레코드. 예를 들어

:이 경우

Select * from email where username='suresh' and type='outbound' 
    order by type,insert_ts desc, id 
Limit 101; 

내가 101 레코드 ID를 알고 난 다음에 100 개 개의 레코드를 가져올 필요가 요청을 위해 사용합니다.

나는 그것을 잘 이해하기를 바랍니다. 어떤 차이가 있다면 조언 해주세요.

+0

지금까지 제공 한 것부터 insert_ts를 기준으로 필터링이나 정렬에 문제가 없어야합니다. 행을 삽입 한 후에는 변경되지 않으므로 기본 키에 추가 한 다음 원래 게시물의 첫 번째 SELECT 쿼리에 따라 WHERE 또는 ORDER BY에서 사용할 수 있습니다 (단, 유일한 차이점은 더 이상 어디서나 비활성 상태입니다.) –

+0

id에 관해서는, 당신이 원하는 것을하기 위해 여분의 컬럼이 필요하다고는 생각하지 않습니다. 기본 키의 마지막 반환 값 (username + type + insert_ts)을 저장하고이 값을 페이징에 사용하면 여분의 열은 필요 없습니다. 자세한 내용은이 답변을 참조하십시오 : http://stackoverflow.com/questions/11832886/cassandra-cql-method-for-paging-through-all-rows. –

관련 문제