Cassandra数据建模-确定最佳行键
我有一个平台,在这个平台上,各种应用程序都会放置注释,注释由Cassandra数据建模-确定最佳行键,cassandra,Cassandra,我有一个平台,在这个平台上,各种应用程序都会放置注释,注释由note\u id标识,应用程序由app\u key标识,note\u id和app\u key都是唯一的,我的所有查询仅限于单个应用程序密钥,我不需要跨多个应用程序查询注释 现在我必须选择一个主键 如果我只选择app\u key作为分区键和note\u id作为集群键,则会出现宽行。也就是说,单个应用程序的所有注释将在单个分区中根据app\u key进行分组 所以: 查找应用程序的所有注释将是有效的(单分区搜索) 查找一个应用程序的注
note\u id
标识,应用程序由app\u key
标识,note\u id
和app\u key
都是唯一的,我的所有查询仅限于单个应用程序密钥,我不需要跨多个应用程序查询注释
现在我必须选择一个主键
如果我只选择app\u key
作为分区键和note\u id
作为集群键,则会出现宽行。也就是说,单个应用程序的所有注释将在单个分区中根据app\u key
进行分组
所以:
应用程序的所有注释
将是有效的(单分区搜索)
应用程序的注释将是有效的
应用程序的所有注释将是有效的
应用程序的注释是有效的
应用程序可以拥有的注释的数量没有限制。数据分布将不均匀。应用程序
的所有注释
都将位于一个分区,因此具有大量注释的应用程序
将创建一个巨大分区,从而产生热点
现在让我们检查选项B,分区键将同时是app\u键
和note\u键
在这种情况下,应用程序
的分区计数将取决于它将具有的注释的数量
查找应用程序的所有注释
(不可能)
查找一个应用程序的注释
(如果快速查找分区,效率会很高)
删除应用程序的所有注释
(不可能)
删除单个注释很快(假设与上述相同)
所以我的问题是:
- 这里的正确余额是多少李>
- 我遗漏了什么概念吗李>
- 热点真的重要吗
- 在第二个选项中,整个查询是不可能的,是否有其他方法可以对此建模
我的建议是,您可以根据吞吐量将分区划分为基于时间的桶(例如:每日/每周/每月/每年),这样您就不会受到宽行分区的影响
例如,在每日分区的情况下,您的分区密钥将是(应用程序密钥,insert_day)…此处insert_day是日期,例如8-8-2018-00:00:00:000
现在,当要按应用程序键读取所有注释时,您需要从当前日期迭代到不再查找数据的日期。。删除也是如此。。选择bucket以减少迭代次数
注释id(集群键)您可以采用时间uuid类型(将从插入日期生成)…现在是按注释id和appkey进行选择。。您可以从节点id值计算所需的插入日期(即,note id->insert date->insert day)请注意,对于复合分区键(选项B),您必须限制构成分区键的所有列的值(包括
app_key
和note_id
)。如果你需要查找某个应用程序的所有注释,那么查询怎么可能?好的,我没有注意到,编辑如果查找单个应用程序的所有注释是你的要求之一,那么我发现选项B根本无效。对于选项A,我发现您需要使用真实数据运行性能测试,以查看可能形成的热点的严重性,以及您的解决方案需要什么硬件规格(即机器数量和机器规格)。这可能是一种方法,而我仍在尝试解决此问题,您认为二级索引或物化视图是否可以启用选项B中的其他查询?由于性能问题,我们最好避免二级索引,尽管在某些特定情况下它可以工作,但不确定在这种情况下您将如何计划使用SI。就MV而言,它是否已准备好生产是一个关键讨论,