【发布时间】:2014-08-14 23:24:46
【问题描述】:
我正在尝试创建可以向下钻取到多个级别的表格,例如
每个项目都有多个里程碑,每个里程碑都有多个任务,每个任务都有很少的子任务以及任务的属性(如描述、作者、分配给)..
我将对其执行 CRUD 操作,用户将在项目中导航。
卡桑德拉 2.0.7 | CQL 规范 3.1.1
我如何使用复合键或任何其他更好的方法。
提前致谢
【问题讨论】:
标签: cassandra data-modeling cql3 cassandra-2.0
我正在尝试创建可以向下钻取到多个级别的表格,例如
每个项目都有多个里程碑,每个里程碑都有多个任务,每个任务都有很少的子任务以及任务的属性(如描述、作者、分配给)..
我将对其执行 CRUD 操作,用户将在项目中导航。
卡桑德拉 2.0.7 | CQL 规范 3.1.1
我如何使用复合键或任何其他更好的方法。
提前致谢
【问题讨论】:
标签: cassandra data-modeling cql3 cassandra-2.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 的行上完成特定产品的里程碑字段,从而避免数据重复。
您可以查询里程碑的所有任务和子任务,如下所示:
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;
另一种解决方案是为每个实体(项目、里程碑、任务、子任务)创建一个单独的表,但是您需要两个查询来检索任务和子任务。
此外,如果任务中的子任务数量不能太多,您可以尝试 Cassandra 2.1 的 user defined types(目前处于测试阶段)。
【讨论】: