我有一个平台,其中各种应用程序都放置注释,注释由note_id
标识,应用程序由app_key
标识,note_id
和app_key
都是唯一的,并且我所有的查询都仅限于单个应用程序密钥,而无需在多个应用程序中查询笔记。
现在我必须选择一个主键。
如果我仅选择app_key
作为分区键,而选择note_id
作为群集键,则将有 个宽行 。也就是说,单个应用程序的所有音符将在一个分区中与app_key
分组。
所以:
notes
中的所有app
都是有效的(单分区查找)。note
中的一个app
会很有效。notes
中的所有app
会很有效。note
中的一个app
是有效的。但是,不能保证行的宽度是多少,即单个notes
可以拥有的app
个数量没有限制。数据分布将不均匀。 notes
中的所有app
都将位于单个分区中,因此具有大量app
的{{1}}将创建一个巨大的分区,从而导致热点。
现在让我们检查选项B,分区键将同时为notes
和app_key
在这种情况下,note_key
的分区计数将取决于它拥有的app
的数量
找到notes
中的所有notes
(不可能)
找到app
中的一个note
(高效地假设寻求分区的速度很快)
删除app
中的所有notes
(不可能)
删除单个app
很快(假设与上面相同)
所以我的问题是:
答案 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)