【问题标题】:Cassandra: updrage and search partition keys are differentCassandra:升级和搜索分区键不同
【发布时间】:2020-10-05 03:37:45
【问题描述】:
我需要检索所有具有特定状态的申请。
我考虑过创建一个包含两列的表:
Requisiton ID || Status
但是有一个问题:当我想更新状态时,我搜索requisiton id(因此这将是我的分区键)。但是当我查询时,我会搜索 status(以获取具有特定状态的所有申请),因此将最后一个作为我的分区键。
在这种情况下如何选择分区键?让 status 和 requisition ID 都假设这个角色似乎不是很有效(因为每条记录都可能最终位于不同的节点中)。也许建议使用不同的数据库模型?
提前致谢!
【问题讨论】:
标签:
database-design
cassandra
data-modeling
【解决方案1】:
Partition Key 用于标识必须写入哪些节点数据/存在哪些节点数据。
Clustering key 用于根据列对分区内的数据进行排序。
假设状态列不会有高基数,最好使用其他列作为分区键。例如,如果您有 10 个节点的集群,则将 status 作为分区键和 status 列只能有 2 个可能的值,那么数据将不会分布在所有节点上。一两个节点会超载,其他节点根本没有数据。
你可以像这样创建你的表,除非你有一个更好的分区键列:
CREATE TABLE requisition_status (id bigint, status text, PRIMARY KEY(id,status));
以这种方式定义主键将使您的id 作为分区键,status 作为集群键,您可以在查询 where 子句中使用它们。