我第一次在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对数据进行排序。

但是我仍然不明白为什么我的第一个请求可以正常工作,而第二个请求却没有?

如果有人可以帮助,那将是极大的荣幸。

最佳答案

在Cassandra中,您应该设计数据模型以适合您的查询。因此,支持第二个查询的正确方法(通过doodle_idschedule_id进行查询,但不必使用user_id进行查询)是创建一个新表来处理该特定查询。该表将几乎相同,不同之处在于主键将略有不同:

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从来都不是一个好主意,并且绝对不是在生产集群中应该做的事情。

10-05 20:58
查看更多