Cassandra分区设计建议

7ajki6be  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(482)

我必须为客户设计数据库,让他们在未来24个月内通过多个供应商获得数百万种材料的价格。因此,该数据库将在未来24个月内每天存储特定供应商供应的每种材料的价格。所以我们保留过去的数据。现在将在以下位置进行查找:
由供应商根据客户指定的日期查找物料的价格。
查找供应商在客户指定的时间段内对物料的价格。
我可以认为主键是:
分区键:(customer id,material id,supplier id,date)--从长远来看,这会导致性能问题吗?
分区键:(customer id,material id,supplier id,monthbucket),集群键:date——monthbucket将每月在同一分区上存储物料的数据,对于2020年2月的日期,其值类似于'202002'。
另一个问题是如何确保数据在节点间均匀分布。
注:
客户、材料、供应商和日期的组合是唯一的。
两个客户可以有相似的物料ID。
重点:1。一些客户可以拥有非常小的数据集,而另一些客户可以拥有巨大的数据集。对于所有客户来说,日期是一个不变的字段,因此我们如何在分区之间均匀地分布数据。此外,不同客户之间的物料ID可以相同,因为存在内部表示(可能是数字或字母数字)
每个客户和物料id的供应商数量从1到20不等。你有什么建议或问题吗?
谢谢。

svgewumm

svgewumm1#

这取决于每个客户有多少供应商。因为您总是对customer-id和material-id进行查询,所以我建议至少将列作为分区键。如果你有太多的供应商,你可以把它移动到分区键以及。我会避免每个月都有一个bucket——这会让查询变得很困难。
因此,您可以使用以下主键:
((customer, material, supplier), date) ((customer, material) supplier, date) 两者都允许有两个查询:
select * from table where customer = ... and material = ... and supplier = ... and date = ... select * from table where customer = ... and material = ... and supplier = ... and date >= start and date <= end 但是我建议用第一个分区,分区不要太大,也不要太小。

相关问题