我是否必须在每个查询中指定分区键和所有集群键?

Do I have to specify the partition key and all clustering keys in every query?

例如,如果我的主键是 a 并且集群列是 bc

我只能在where条件下使用下面的吗?

select * from table where a = 1 and b = 2 and c = 3

或者还有其他我可以使用的查询吗?

我想用

select * from table where a=1

select * from table where a = 1 and b = 2 and c = 3 and d = 4

这可能吗?

如果没有,那么我如何为我的数据建模以实现这一点?

Cassandra 有很多优点,但它并不能满足所有需求。

当您需要处理大量写入 时,Cassandra 是一个不错的选择。人们喜欢它,因为 Cassandra 易于扩展,可以处理巨大的数据集并且高度容错

您需要记住,使用 Cassandra(如果您真的想使用它)的基本规则是对数据建模以适合您的查询。不要围绕关系建模。不要围绕对象建模。 围绕您的查询建模。这样您可以最​​大限度地减少分区读取。

当然,您不仅可以查询主键和分区列。您可以:

但是,当然,这些并不像建模良好的 table 那样有效。

For example, if my primary key is a and clustering columns are b and c.

所以这转化为定义:PRIMARY KEY ((a),b,c)。基于此...

are there any other queries that I can use?

是的。需要理解的一些要点;是查询的 WHERE 子句与 PRIMARY KEYs:

  • 必须在订单中指定。
  • 无法跳过。
  • 可以省略,只要指定前面的键即可。

select * from table where a=1

是的,这个查询可以。那是因为您仍在通过分区键 (a) 进行查询。

select * from table where a = 1 and b = 2 and c = 3 and d = 4

但是,这不会起作用。那是因为 d 不是(根据我对您的第一条陈述的理解)您的 PRIMARY KEY 定义的一部分。

If not, then how can I model my data to make this possible?

正如 Andrea 提到的,您应该根据需要支持的查询来构建您的 table。因此,如果您需要通过 abc d 进行查询,则需要使 d 主键的一部分。