在cassandra中设计分区所需的建议
Suggestion required to design partitioning in cassandra
我必须为在接下来的 24 个月内通过多个供应商获得的数百万 material 的客户设计数据库。因此,数据库将在接下来的 24 个月内每天存储特定供应商提供的每个 material 的价格。所以我们保留过去的数据。现在查找将发生在:
- 查找供应商在客户指定日期的 material 价格。
- 查找供应商在客户的一段时间内 material 的价格。
我可以认为主键为:
- 分区键:(客户 Id,material Id,供应商 Id,日期)
-- 这会导致性能问题吗,因为它会在 运行 中产生如此多的分区?
- Partition Key: (customer Id, material Id, supplier Id, monthbucket), 聚类键: date
-- monthbucket 将按月在同一分区上存储 material 的数据,并将
2020 年 2 月日期的值类似于“202002”。
另一个问题是如何确保我的数据在节点之间均匀分布。
注:
- 客户、material、供应商和日期的组合是唯一的。
- 两个客户可以有相似的 material ID。
要点:
1. 一些客户可能拥有非常小的数据集,而另一些客户可能拥有庞大的数据。由于日期是所有客户的常量字段,因此我们可以如何在分区之间均匀分布数据。此外,material ID 在不同客户之间可以相同,因为存在内部表示(可能是数字或字母数字)
- 每个客户的供应商数量和 material id 在 1 - 20 之间变化。
你有什么建议或问题吗?
谢谢。
这取决于每个客户有多少供应商。因为您总是对客户 ID 和 material ID 有查询,所以我建议至少将这些列制作成分区键。如果你有太多的供应商,你也可以把它移到分区键中。而且我会避免使用每月存储桶 - 这会使查询变得困难。
因此您可以使用以下主键:
((customer, material, supplier), date)
((customer, material) supplier, date)
both 将允许有两个查询:
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
但我建议使用第一个分区不会太大,也不会太小。
我必须为在接下来的 24 个月内通过多个供应商获得的数百万 material 的客户设计数据库。因此,数据库将在接下来的 24 个月内每天存储特定供应商提供的每个 material 的价格。所以我们保留过去的数据。现在查找将发生在:
- 查找供应商在客户指定日期的 material 价格。
- 查找供应商在客户的一段时间内 material 的价格。
我可以认为主键为:
- 分区键:(客户 Id,material Id,供应商 Id,日期) -- 这会导致性能问题吗,因为它会在 运行 中产生如此多的分区?
- Partition Key: (customer Id, material Id, supplier Id, monthbucket), 聚类键: date -- monthbucket 将按月在同一分区上存储 material 的数据,并将 2020 年 2 月日期的值类似于“202002”。
另一个问题是如何确保我的数据在节点之间均匀分布。
注:
- 客户、material、供应商和日期的组合是唯一的。
- 两个客户可以有相似的 material ID。
要点: 1. 一些客户可能拥有非常小的数据集,而另一些客户可能拥有庞大的数据。由于日期是所有客户的常量字段,因此我们可以如何在分区之间均匀分布数据。此外,material ID 在不同客户之间可以相同,因为存在内部表示(可能是数字或字母数字)
- 每个客户的供应商数量和 material id 在 1 - 20 之间变化。 你有什么建议或问题吗?
谢谢。
这取决于每个客户有多少供应商。因为您总是对客户 ID 和 material ID 有查询,所以我建议至少将这些列制作成分区键。如果你有太多的供应商,你也可以把它移到分区键中。而且我会避免使用每月存储桶 - 这会使查询变得困难。
因此您可以使用以下主键:
((customer, material, supplier), date)
((customer, material) supplier, date)
both 将允许有两个查询:
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
但我建议使用第一个分区不会太大,也不会太小。