cassandra 主键列不能被限制

cassandra primary key column cannot be restricted

我第一次在 Web 应用程序中使用 Cassandra,遇到了查询问题。 这是我的标签:

CREATE TABLE vote (
    doodle_id uuid,
    user_id uuid,
    schedule_id uuid,
    vote int,
    PRIMARY KEY ((doodle_id), user_id, schedule_id)
);

在每次请求时,我都会指明我的分区键 doodle_id。 例如,我可以毫无问题地制作:

select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and user_id = 97a7378a-e1bb-4586-ada1-177016405142;

但我最后提出的要求是:

select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;

我收到以下错误:

Bad Request: PRIMARY KEY column "schedule_id" cannot be restricted (preceding column "user_id" is either not restricted or by a non-EQ relation)

我是 Cassandra 的新手,但如果我错了请纠正我,在复合主键中,第一部分是 PARTITION KEY,它是允许 Cassandra 知道在哪里查找数据所必需的。 然后其他部分是CLUSTERING KEY来对数据进行排序。

但我仍然不明白为什么我的第一个请求有效而第二个请求无效?

如果有人能提供帮助,我们将不胜感激。

集群键还用于查找给定分区中的列。使用您的模型,您将能够通过以下方式查询:

  • doodle_id
  • doodle_id/user_id
  • doodle_id/user_id/schedule_id
  • user_id 使用 ALLOW FILTERING
  • user_id/schedule_id 使用 ALLOW FILTERING

您可以将主键视为文件路径 doodle_id#123/user_id#456/schedule_id#789,其中所有数据都存储在最深的文件夹中(即 schedule_id#789)。当您查询时,您必须指明 subfolder/subtree 从哪里开始搜索。

由于列在分区内的组织方式,您的第二个查询不起作用。 Cassandra 无法在分区中获取连续的 slice 列,因为它们是交错的。

您应该颠倒主键顺序(doodle_id、schedule_id、user_id)才能运行您的查询。

在 Cassandra 中,您应该设计适合您的查询的数据模型。因此,支持您的第二个查询(通过 doodle_idschedule_id 进行的查询,但不一定使用 user_id 的查询)的正确方法是创建一个新的 table 来处理该特定查询.这个 table 几乎相同,除了 PRIMARY KEY 会略有不同:

CREATE TABLE votebydoodleandschedule (
    doodle_id uuid,
    user_id uuid,
    schedule_id uuid,
    vote int,
    PRIMARY KEY ((doodle_id), schedule_id, user_id)
);

现在这个查询可以工作了:

SELECT * FROM votebydoodleandschedule 
WHERE doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 
AND schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;

这让您不必指定 ALLOW FILTERING。依赖 ALLOW FILTERING 从来都不是一个好主意,当然也不应该在生产集群中这样做。