【问题标题】:Nested data data modelling in Cassandra?Cassandra中的嵌套数据数据建模?
【发布时间】:2014-08-14 23:24:46
【问题描述】:

我正在尝试创建可以向下钻取到多个级别的表格,例如

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

我将对其执行 CRUD 操作,用户将在项目中导航。

卡桑德拉 2.0.7 | CQL 规范 3.1.1

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

提前致谢

【问题讨论】:

    标签: cassandra data-modeling cql3 cassandra-2.0


    【解决方案1】:

    最佳设计很大程度上取决于您计划查询这组数据的所有方式,以及每个级别的估计项目数。

    如果您只需要向下钻取,那么以下设计可以工作:

    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(目前处于测试阶段)。

    【讨论】:

    • 谢谢!!哪个会更好的性能......每个实体的单独表或一个非常宽的表,就像你建议的那样???
    • 这个问题没有通用的答案。 Cassandra 数据建模的正确方法是从枚举您将需要的 ALL 查询开始,设计您的表以便可以有效地执行这些查询。 Cassandra 可以进行一些数据复制和非规范化。
    猜你喜欢
    • 2018-11-22
    • 2016-12-14
    • 2018-05-14
    • 1970-01-01
    • 2015-12-25
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多