我正在尝试获取下面在 Cassandra 中定义的
file_id
的指定 version
的最新 folder_id
的所有 example_table
项目。这可能吗,还是我的数据针对我的用例设计不正确?
example_table
(分区键) |
(聚类键) |
( 聚类键)ORDER DESC |
---|---|---|
1 | 1 | 2 |
1 | 1 | 1 |
1 | 2 | 2 |
1 | 2 | 1 |
1 | 3 | 2 |
1 | 3 | 1 |
我认为查询会是这样的,但我无法让它工作。
SELECT folder_id,file_id,MAX(version) FROM example_table WHERE folder_id=1;
想要的结果
(分区键) |
(聚类键) |
( 集群键) ORDER DESC |
---|---|---|
1 | 1 | 2 |
1 | 2 | 2 |
1 | 3 | 2 |
这可能不是性能最佳的数据模型,因为您选择的分区键
folder_id
如果/可以无限增长。
相反,如果您如下更改表架构,则在使用允许过滤时,它将仅使用部分分区键在分区键的该部分内执行扫描(而不是执行完整表扫描),
token@cqlsh:chetctor> CREATE TABLE IF NOT EXISTS example_table (
folder_id int,
file_id int,
version timestamp,
PRIMARY KEY((folder_id, file_id), version)
) WITH CLUSTERING ORDER BY (version DESC)
<... other table properties ...>
;
并插入几条记录:
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,1,totimestamp(now()));
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,1,totimestamp(now()));
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,2,totimestamp(now()));
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,2,totimestamp(now()));
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,3,totimestamp(now()));
token@cqlsh:chetctor> insert into example_table (folder_id , file_id , version ) VALUES ( 1,3,totimestamp(now()));
token@cqlsh:chetctor> select * from example_table ;
folder_id | file_id | version
-----------+---------+---------------------------------
1 | 3 | 2024-12-30 15:55:05.565000+0000
1 | 3 | 2024-12-30 15:54:59.680000+0000
1 | 2 | 2024-12-30 15:54:53.628000+0000
1 | 2 | 2024-12-30 15:54:51.540000+0000
1 | 1 | 2024-12-30 15:54:45.544000+0000
1 | 1 | 2024-12-30 15:54:34.793000+0000
(6 rows)
虽然使用
ALLOW FILTERING
始终是糟糕的选择,但如果我们通过 folder_id
的部分分区键进行查询,那么在这里 可能没问题。
token@cqlsh:chetctor> select * from example_table where folder_id=1 per PARTITION LIMIT 1 allow FILTERING ;
folder_id | file_id | version
-----------+---------+---------------------------------
1 | 3 | 2024-12-30 15:55:05.565000+0000
1 | 2 | 2024-12-30 15:54:53.628000+0000
1 | 1 | 2024-12-30 15:54:45.544000+0000
(3 rows)
这将为我们提供给定
file_id
的所有最新 version
(基于 folder_id
时间戳值)。我希望这对你有帮助。参考阅读:
DataStax Astra DB 的 CQL 控制台作为参考来演示上述内容,并且为了充分披露,我是 DataStax 的员工(截至撰写本文时)。