在 Cassandra 中实现低基数搜索的最佳实践是什么

What is the best practice for implementing low cardinality searches in Cassandra

假设我有以下 table CQL(table 的一个片段):

CREATE TABLE order (
  order_id UUID PRIMARY KEY,
  placed timestamp,
  status text,
)

现在,如果状态可以是 PLACED、SHIPPED 或 DELIVERED 之一作为枚举,我想找到所有处于 PLACED 状态的订单来处理它们。鉴于有数百万个订单,并且所有订单最终都处于已交付状态,物化视图感觉并不是解决问题的正确方法。我想知道有什么想法可以在不遍历整个数据集的情况下解决这个低基数索引的问题。想法?

我会推荐table喜欢

CREATE TABLE order_by_status (
  order_id UUID,
  placed timestamp,
  status text,
  PRIMARY KEY ((status), order_id)
)

然后您可以将查询迭代到 SELECT * FROM order_by_status WHERE status = 'PLACED';。数百万应该不是什么大问题,但最好通过按某个日期 window.

进行分区来防止它变得太大
CREATE TABLE order_by_status (
  order_id UUID,
  placed timestamp,
  bucket text,
  status text,
  PRIMARY KEY ((status, bucket), order_id)
)

其中 bucket 是从 YYYY-MM 中的时间戳生成的字符串,例如 2017-10。你可能想暂时远离 MV,它在当前版本中有一些错误。我还建议不要为该模型使用二级索引,使用第二个 table 并向两者发出插入将是您的最佳解决方案。