2014-04-08 4 views
0

저는 cassandra에서 현재 SQL 데이터를 모델링 할 수있는 방법을 알고 싶어하는 cassandra 초보자입니다. 데이터베이스는 다른 데이터 호스트 중 document_id, last_modified_time, size_in_bytes를 포함하는 문서 메타 데이터를 저장하며 문서 수는 임의로 커질 수 있으므로 저장 및 쿼리를위한 확장 가능한 솔루션을 찾고 있습니다. 2 범위의 요구카산드라 데이터 모델

  1. 모든 문서를 선택하는 쿼리가

    여기서 last_modified_time이> = X 및 last_modified_time이

  2. 모든 문서를 선택 여기서 크기> = X 크기 < = Y

또한 특정 메타 데이터별로 그룹화해야하는 쿼리 집합

  1. 모든 문서를 선택한 경우 (X, Y, Z)

이 쿼리를 기반으로 데이터 모델을 설계하는 가장 좋은 방법은 무엇입니까에서 사용자?

내 초기 생각은

테이블 t_document ( 가 document_ID의 BIGINT를 만들

,
last_mod_time BIGINT, 크기 BIGINT를 다음과 같이 보조 인덱스로 last_mod_time와 (카산드라 2.0, CQL 3.0) 테이블을 가지고있다, 사용자 텍스트, .... 기본 키 (document_ID 아, last_mod_time) 은}

이 쿼리의주의를 기울여야한다 1.

쿼리 2의 기본 키가 (document_id, size) 인 다른 테이블을 생성해야합니까? 아니면 같은 테이블의 기본 키에 세 번째 항목으로 크기를 추가 할 수 있습니까? (document_id, last_mod_time, size). 하지만이 경우 두 번째 쿼리는 where 절에서 last_mod_time을 사용하지 않고 작동하게됩니까?

하나 이상의 사용자에 대한 모든 문서 인 쿼리 3의 경우 기본 키가 (user, doc_id) 인 t_user_doc 테이블을 만드는 것이 가장 좋습니다. 또는 더 나은 접근법은 동일한 t_document 테이블에서 사용자에 대한 2 차 인덱스를 만드는 것입니다.

도움 주셔서 감사합니다.

답변

0

불평등에 관해서, 당신은 카산드라에서 많은 선택권이 없습니다. 클러스터링 컬럼 (또는 2 차 인덱스)을 선도해야합니다. 그래서 데이터 모델은 다음과 같습니다

CREATE TABLE docs_by_time (
dummy int, 
last_modified_time timestamp, 
document_id bigint, 
size_in_bytes bigint, 
PRIMARY KEY ((dummy),last_modified_time,document_id)); 

은 "더미"열

항상 같은 값으로 설정하고, 모든 데이터를 하나의 파티션에 저장하여, 자리 표시 자 파티션 키로 소송을 제기한다.

이러한 데이터 모델의 단점은 사실 모든 데이터가 단일 파티션에 저장된다는 것입니다. 파티션 당 최대 20 억 개의 셀이 있지만 더 중요한 것은 단일 파티션이 노드를 차지하지 않는다는 것입니다. 따라서이 접근법은 확장되지 않습니다.

당신은 테이블에 보조 인덱스를 만들 수 있습니다

CREATE TABLE docs (
document_id bigint, 
last_modified_time timestamp,  
size_in_bytes bigint, 
PRIMARY KEY ((dummy),last_modified_time,document_id)); 

CREATE INDEX docs_last_modified on docs(last_modified); 

그러나 보조 인덱스가 중요한 단점 (http://www.slideshare.net/edanuff/indexing-in-cassandra)가, 높은 기수와 데이터를 사용하지 않는 것이 좋습니다. 예를 들어 day 구성 요소 만 저장하여 last_modified_time의 정밀도를 줄임으로써 카디널리티 문제를 다소 완화 할 수 있습니다.