我第一次在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来排序数据 .
但我仍然不明白为什么我的第一个请求正在运行而不是第二个请求?
如果有人能帮忙,那将是一件非常愉快的事情 .
2 回答
在Cassandra中,您应该设计适合您查询的数据模型 . 因此,支持第二个查询的正确方法(由
doodle_id
和schedule_id
进行查询,但不是必须使用user_id
)是创建一个新表来处理该特定查询 . 这个表几乎是一样的,除了PRIMARY KEY会略有不同:现在这个查询将起作用:
这可以让你不得不指定
ALLOW FILTERING
. 依赖ALLOW FILTERING
永远不是一个好主意,当然不是你应该在 生产环境 集群中做的事情 .聚类键还用于查找给定分区中的列 . 使用您的模型,您将能够通过以下方式进行查询:
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) . 当您查询时,您必须从开始搜索的位置指出子文件夹/子树 .
您的第二个查询不起作用,因为列在分区中的组织方式 . Cassandra无法在分区中获得连续的列,因为它们是交错的 .
您应该反转主键顺序(doodle_id,schedule_id,user_id)以便能够运行查询 .