首页 > 解决方案 > 在 cassandra 中设计分区所需的建议

问题描述

我必须为客户设计数据库,为他们在未来 24 个月内通过多个供应商获得的数百万种材料定价。因此,该数据库将在未来 24 个月内每天存储特定供应商提供的每种材料的价格。所以我们保留过去的数据。现在查找将发生在:

  1. 查找供应商截至客户特定日期的材料价格。
  2. 查找客户在一段时间内由供应商提供的材料价格。

我可以认为主键为:

  1. 分区键:(客户 ID、材料 ID、供应商 ID、日期)——这是否会导致性能问题,因为从长远来看它会产生如此多的分区?
  2. 分区键:(客户 ID、材料 ID、供应商 ID、月桶),集群键:日期——月桶将按月在同一分区上存储材料的数据,并且对于 2020 年 2 月的日期,其值类似于“202002”。

另一个问题是如何确保我的数据在节点之间均匀分布。

笔记:

  1. 客户、材料、供应商和日期的组合是独一无二的。
  2. 两个客户可以有相似的材料 ID。

要点: 1. 一些客户的数据集很小,而另一些客户的数据量很大。由于日期是所有客户的常量字段,我们可以在多大程度上均匀地跨分区分配数据。此外,不同客户之间的材料 ID 可以相同,因为存在内部表示(可能是数字或字母数字)

  1. 每个客户和材料 ID 的供应商数量从 1 到 20 不等。你有什么建议或问题吗?

谢谢。

标签: design-patternscassandradatabase-partitioning

解决方案


这取决于每个客户有多少供应商。因为您总是对客户 ID 和材料 ID 进行查询,所以我建议至少将这些列设置为分区键。如果您的供应商太多,您也可以将其移动到分区键中。而且我会避免每月存储桶 - 这会使查询变得困难。

因此,您可以使用以下主键:

  1. ((customer, material, supplier), date)
  2. ((customer, material) supplier, date)

两者都将允许同时进行两个查询:

  1. select * from table where customer = ... and material = ... and supplier = ... and date = ...
  2. select * from table where customer = ... and material = ... and supplier = ... and date >= start and date <= end

但我建议使用第一个分区,分区不会太大,也不会太小。


推荐阅读