我正在尝试创建可以深入到多个级别的表格,例如
每个项目都有多个里程碑,每个里程碑都有多个任务,每个任务都有很少的子任务以及任务属性(如描述,作者,分配给)..
我将在其上执行CRUD操作,用户将浏览项目。
Cassandra 2.0.7 | CQL规范3.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(目前处于测试阶段)。