查询文件夹中最新的文件版本

问题描述 投票:0回答:1

我正在尝试获取下面在 Cassandra 中定义的

file_id
的指定
version
的最新
folder_id
的所有
example_table
项目。这可能吗,还是我的数据针对我的用例设计不正确?

example_table

folder_id
(分区键)
file_id
(聚类键)
version
timestamp
聚类键)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;

想要的结果

folder_id
(分区键)
file_id
(聚类键)
version
timestamp
集群键) ORDER DESC
1 1 2
1 2 2
1 3 2
cassandra spring-data spring-data-cassandra
1个回答
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
时间戳值)。我希望这对你有帮助。
参考阅读:

  • 1
    
    
      这里有另一个更好的参考
  • p/s:我在这里使用了

DataStax Astra DB 的 CQL 控制台作为参考来演示上述内容,并且为了充分披露,我是 DataStax 的员工(截至撰写本文时)。

© www.soinside.com 2019 - 2024. All rights reserved.