我需要创建一个包含id、创建日期、时间和其他字段的表,我需要根据最新的创建日期和时间查询一些'n'记录。我需要根据最新的创建日期和时间来查询一些'n'记录。为了达到这个目的,表应该是怎样的?以id为分区键,以日期和时间为簇键的创建可以吗?是否可以对所有id进行排序,即不对分区键设置任何条件?
创建与
id
作为分区键,日期和时间作为群集键工作?
从技术上讲,您可以 可以但性能会很糟糕。 使用 id
作为分区键会把所有的行放在不同的节点上,而不考虑时间戳。 因为你想按时间范围查询,所以你也应该按时间成分来存储数据。
是否可以通过对所有的
ids
即不对分区密钥设置任何条件?
不,完全不可能。 Cassandra被设计为执行顺序读取。 因此,Cassandra中的结果集排序取决于数据是否已经按照你想要检索的顺序存储。
我是这样做的。
CREATE TABLE events (
id UUID,
month_bucket INT,
creation TIMESTAMP,
name TEXT,
PRIMARY KEY ((month_bucket),creation,id))
WITH CLUSTERING ORDER BY (creation DESC, id ASC);
在插入一些数据后,这个查询就可以了。
aploetz@cqlsh:stackoverflow> SELECT * FROM events
WHERE month_bucket=202005
AND creation >= '2020-05-01' AND creation < '2020-05-13';
month_bucket | creation | id | name
--------------+---------------------+-------------+----------------
202005 | 2020-05-05 05:00:00 | 1d073ed5... | Cinco de Mayo
202005 | 2020-05-04 05:00:00 | 3cca75a0... | May the Fourth
202005 | 2020-05-01 05:00:00 | fd2bb58f... | May Day
(3 rows)
这利用了一种被称为 "水桶 "的建模技术。 由于我不确定一个给定的时间段可以发生多少条目(只有你知道),我猜测并使用 "月 "作为例子。 基本上,你要选择一个时间 "桶",既要。
然后,在查询中提供bucketing值,以及一个范围组件,在 creation
.
该 CLUSTERING ORDER
定义保留了由 creation
按降序排列。 id
后面加了一个词,以此来保证唯一性。 我曾多次使用这种模式来解决日期时间组件的范围查询模型。