Cassandra数据建模-确定最佳行键

时间:2018-08-07 06:56:32

标签: cassandra

我有一个平台,其中各种应用程序都放置注释,注释由note_id标识,应用程序由app_key标识,note_idapp_key都是唯一的,并且我所有的查询都仅限于单个应用程序密钥,而无需在多个应用程序中查询笔记。

现在我必须选择一个主键。

如果我仅选择app_key作为分区键,而选择note_id作为群集键,则将有 个宽行 。也就是说,单个应用程序的所有音符将在一个分区中与app_key分组。

所以:

  1. 查找notes中的所有app都是有效的(单分区查找)。
  2. 找到note中的一个app会很有效。
  3. 删除notes中的所有app会很有效。
  4. 删除note中的一个app是有效的。

但是,不能保证行的宽度是多少,即单个notes可以拥有的app个数量没有限制。数据分布将不均匀。 notes中的所有app都将位于单个分区中,因此具有大量app的{​​{1}}将创建一个巨大的分区,从而导致热点

现在让我们检查选项B,分区键将同时为notesapp_key

在这种情况下,note_key的分区计数将取决于它拥有的app的数量

  1. 找到notes中的所有notes(不可能)

  2. 找到app中的一个note(高效地假设寻求分区的速度很快)

  3. 删除app中的所有notes(不可能)

  4. 删除单个app很快(假设与上面相同)


所以我的问题是:

  • 这里的正确余额是多少?
  • 我缺少任何概念吗?
  • 热点真的重要吗?
  • 在第二个选项中,不可能进行整个查询,是否有替代方法可以对此建模?

1 个答案:

答案 0 :(得分:1)

我的建议是,根据吞吐量将您的分区划分为基于时间的存储分区(例如:每日/每周/每月/每年),以免遭受宽行分区的困扰。

例如,在每日分区的情况下,您的分区密钥将为(app-key,insert_day)。.其中insert_day是日期,例如8-8-2018-00:00:00:000 ....

现在,当要通过应用程序键读取所有注释时,您需要从当日开始迭代,直到没有更多数据找到的日子为止。.与delete ..选择存储桶一样,以减少迭代次数。

note-id(集群键)可以采用time-uuid类型(将从插入日期生成)。现在要通过note-id和appkey进行选择。节点ID值所需的插入天数(即note-id-> insert-date-> insert-day)