2014-06-24 3 views
0

나는 예에 대한 어떤 수있는 훈련 여러 수준 아래로 테이블을 만들려고하고카산드라의 중첩 데이터 데이터 모델링?

각 프로젝트는 다수의 이정표를 가지고 있으며, 각각의 이정표하여 여러개의 작업을 가지고 있으며, 각 작업은 설명, 저자는, 할당 (같은, 자신의 특성 작업과 함께 몇 가지 하위있다).

CRUD 작업을 수행하고 사용자가 프로젝트를 탐색합니다.

카산드라 2.0.7 | CQL 사양 3.1.1

복합 키 또는 다른 더 나은 방법을 사용하려면 어떻게해야합니까? 최적의 디자인은 모든 방법에 매우 의존 사전

답변

0

덕분에 당신은 또한 모든 수준에있는 항목의 예상 수에 데이터 세트를 조회 할 계획입니다.

당신이 드릴 다운되어 필요로하는 것은, 다음 디자인은 일할 수있는 경우 : 당신은 당신도 분할 충분한 사업이있는 경우 확인해야합니다 있도록

CREATE TABLE SubTask 
(
    ProjectId int, 
    <Project fields>, 
    MilestoneId int, 
    <Milestone fields>, 
    TaskId int, 
    <Task fields>, 
    SubTaskId int, 
    <SubTask fields>, 
    PRIMARY KEY (ProjectId, MilestoneId, TaskId, SubTaskId) 
); 

프로젝트 ID는, 파티션 키가 될 것입니다 클러스터 노드 사이. 복합 파티션 키 (PRIMARY KEY ((ProjectId, MilestoneId), TaskId, SubTaskId)을 사용할 수도 있지만 프로젝트를 검색 할 수있는 가능성은 제한됩니다.

실제 ID가> 0이고 규칙 필드에 ID 0 인 행을 보관할 수 있습니다. 즉, TaskId = 0 인 행에서만 특정 제품의 중요 시점 필드를 완료하면 데이터 중복을 피할 수 있습니다.

다음과 같이 이정표에 대한 모든 작업 및 하위 작업을 조회 할 수

:

CREATE INDEX ON SubTask(SubTaskId); 

: 당신은 작업 필드를하기 만한다면

SELECT <task fields>, <subtask fields> 
FROM SubTask 
WHERE ProjectId=xxx AND MilestoneId=yyy; 

, 당신은 SubTaskId 필드에 인덱스를 필요 다음과 같이 선택하십시오.

SELECT <task fields> 
FROM SubTask 
WHERE ProjectId=xxx AND MilestoneId=yyy AND SubTaskId=0; 

다른 해결책은 sep 모든 엔티티 (Project, Milestone, Task, SubTask)에 대해 arate 테이블을 만들었지 만 작업 및 하위 작업을 검색하려면 두 가지 쿼리가 필요합니다.

또한 작업의 하위 작업 수가 너무 높으면 Cassandra 2.1의 user defined types (현재 베타 버전)을 시험해 볼 수 있습니다.

+0

감사합니다. 현명한 더 나은 성능이 될 것입니다 ... 당신이 제안한 것처럼 각 엔티티 또는 하나의 매우 넓은 테이블에 대한 별도의 테이블 ??? – prankyrules

+0

이 질문에 대한 일반적인 답은 없습니다. 카산드라 데이터 모델링에 대한 올바른 접근 방식은 ** ALL ** 쿼리를 열거하는 것부터 시작하여 이러한 쿼리를 효율적으로 실행할 수 있도록 테이블을 디자인하는 것입니다. Cassandra에서는 일부 데이터 중복 및 비정규 화가 문제가되지 않습니다. – medvekoma