【问题标题】:Cassandra data modeling: choosing partition key and composite keyCassandra 数据建模:选择分区键和复合键
【发布时间】:2019-09-29 00:29:10
【问题描述】:

我正在尝试使用 Cassandra 进行数据建模,但我对应该选择什么作为分区键和复合键感到困惑。我的表格如下所示

CREATE TABLE mykeyspace.mytable ( 
id UUID,
A text,
B text,
C text,
D text,
... other columns
PRIMARY KEY(id)
);

我在表中引入了一个id列,并把它作为主键,这样用id查询就更快了。

我面临的问题是列集 (A,B,C,D) 唯一标识数据,每当我执行插入时,我想防止重复和搜索列集 (A,B, C,D) 可能很昂贵,因为它不是我的主键的一部分。

我随机生成 id,我认为的一种方法是散列 4 列,然后它可以解决重复问题,但我怀疑如果我开始为 id 获取散列,数据将如何分布。

我想到的其他方法是将 (A,B,C,D) 作为集群键,这样我的主键现在看起来像 ((id), A,B,C,D) 并在插入之前使用集群键以防止重复,这里我不确定仅使用聚类键的搜索效率如何? 上述哪种数据建模方法更适合,还是有其他方法?

【问题讨论】:

  • 根据您想要查询的方式设计您的表,而不是按照您想要插入的方式(写入非常便宜,读取相对昂贵)。如果您想以多种方式访问​​数据,您可能最终会出现重复,这没关系。
  • 我建议在academy.datastax.com上参加 DS220 课程

标签: database cassandra nosql data-modeling datastax-enterprise


【解决方案1】:

如果您最关心的是数据完整性(没有欺骗性),那么您真的别无选择,只能将 (A, B, C, D) 设为您的主键。至于选择这些列的哪个子集作为分区键,有几个考虑因素。其中之一是为了获得更好的可扩展性,您希望在分区之间大致均匀分布数据。因此,如果 D 只能有 2 个值,其中一个用于 99% 的行,不要让 D 成为唯一的分区列。另一个考虑因素是您希望如何查询数据。如果您希望能够按列的子集进行查询——例如,按 (A, B, C) 和 (B, C, D) 查询,那么您的分区键选择仅限于 B 或 C,或者(B, C)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2014-09-23
    • 2014-05-26
    • 1970-01-01
    • 2021-06-07
    • 2019-07-29
    相关资源
    最近更新 更多