cassandra - Cassandra 数据建模 - 识别最佳行键
问题描述
我有一个平台,各种应用程序都放了笔记,笔记由 标识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
拥有大量notes
将创建一个巨大的分区,从而导致热点。
现在让我们检查选项 B,分区键将是app_key
note_key
在这种情况下,分区数app
将取决于notes
它将拥有的数量
查找所有
notes
(app
不可能)查找其中
note
一个app
(假设查找分区很快)删除所有
notes
(app
不可能)删除单
note
条速度很快(假设同上)
所以我的问题是:
- 这里的正确平衡是什么?
- 我错过了任何概念吗?
- 热点真的很重要吗?
- 与第二个选项一样,整个查询是不可能的,是否有任何替代方法可以对此进行建模?
解决方案
我的建议是您根据吞吐量将您划分为基于时间的存储桶(例如:每天/每周/每月/每年),这样您就不会受到宽行分区的影响。
例如,在每日分区的情况下,您的分区键将是 (app-key, insert_day)..这里 insert_day 是日期,例如 8-8-2018-00:00:00:000 ....
现在,当通过应用程序键读取所有笔记时,您需要从当天迭代到您不再找到数据的日子。删除也是如此。选择存储桶以减少迭代次数。
note-id (集群键)你可以把它的类型 time-uuid (它将从插入日期生成)..现在当涉及到通过 note-id 和 appkey 选择时.. 你可以计算所需的插入 -从节点 ID 值开始的日期(即,note-id -> insert-date ->insert-day)
推荐阅读
- javascript - javascript中的四舍五入
- html - 如何在.row下的两个div之间添加图像(使用bootstrap 4)
- powershell - ReadinessReportCreator.exe 的 Powershell 命令
- design-patterns - 工厂(方法)模式和对深/长链中其他方法或其他工厂的标注
- asp.net-core - 安装 Mailkit 并设置 IEmailSender
- javascript - 如何使用 Selenium 和 Javascript 执行器查询 Canvas?
- apache-kafka - 如何在消费者组kafka中动态添加消费者
- excel - 根据同一行的两列中的值隐藏行
- linux - 在嵌入式设计中使用 Linux 时钟
- excel - 将行中的月份和年份与另一个单元格中的月份和年份匹配