在Cassandra中嵌套数据数据建模?

时间:2014-06-24 15:47:50

标签: cassandra data-modeling cql3 cassandra-2.0

我正在尝试创建可以深入到多个级别的表格,例如

每个项目都有多个里程碑,每个里程碑都有多个任务,每个任务都有很少的子任务以及任务属性(如描述,作者,分配给)..

我将在其上执行CRUD操作,用户将浏览项目。

Cassandra 2.0.7 | CQL规范3.1.1

我如何使用复合键或任何其他更好的方法。

先谢谢

1 个答案:

答案 0 :(得分: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是&gt;的惯例。 0,并保留描述字段的ID为0的行。换句话说,您只能在具有TaskId = 0的行上完成特定产品的里程碑字段,从而避免数据重复。

您可以按如下方式查询里程碑的所有任务和子任务:

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

如果您只需要任务字段,则需要SubTaskId字段的索引:

CREATE INDEX ON SubTask(SubTaskId);

然后选择如下:

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

另一种解决方案是为每个实体(Project,Milestone,Task,SubTask)创建一个单独的表,但是您需要两个查询来检索任务和子任务。)

此外,如果任务中的子任务数量不能太高,您可以尝试使用Cassandra 2.1&#39; user defined types(目前处于测试阶段)。