我有一个消息表,像这样:
messages (
user_id uuid,
id uuid,
message blob,
created_at timestamp,
updated_at timestamp,
PRIMARY KEY (user_id, id)
)
我可以创建一个MV,用于按updated_at
进行排序和选择消息。但是,当我需要从上一次客户端同步时(例如select where updated_at > 1555602962006 and created_at < 1555602962006
)中选择上次更新的消息时,唯一的方法是通过updated_at
选择所有消息并过滤代码中的行?这是生产中的正常做法吗?
也许在这种情况下,可以通过串联created_at
和updated_at
或其他东西来创建一些令牌进行排序?
答案 0 :(得分:1)
因此,棘手的是,Cassandra不允许对多个不同的列进行范围查询。其次,范围查询仅在分区内起作用,因此您需要提出一种时间“存储桶”策略。
我过去对此建模的一种方法是,为时间戳创建一列,但为时间类型设置不同的行。我将使用上面的表格在此处汇总一个示例。一个时间段,我将使用month;从本质上讲,我知道我只会查询上个月创建/更新的消息(可能对您不起作用)。
CREATE TABLE messages_by_month (
month_bucket int,
event_time timestamp,
user_id uuid,
id uuid,
message text,
event text,
PRIMARY KEY (month_bucket, event_time, id));
在插入一些数据之后,我现在可以查询一系列创建和更新的事件时间,如下所示:
SELECT id,event_time,event,message
FROM messages_by_month
WHERE month_bucket=201905
AND event_time > 1558619000000
AND event_time < 1558624900000;
id | event_time | event | message
--------------------------------------+---------------------------------+---------+---------
a4d60c29-ad4e-4023-b869-edf1ea6207e2 | 2019-05-23 14:00:00.000000+0000 | CREATED | hi!
66e78a1e-dbcb-4f64-a0aa-6d5b0e64d0ed | 2019-05-23 14:20:00.000000+0000 | CREATED | hi!
f1c59bf4-1351-4527-a24b-80bb6e3a2a5c | 2019-05-23 15:00:00.000000+0000 | UPDATED | hi2!
a4d60c29-ad4e-4023-b869-edf1ea6207e2 | 2019-05-23 15:20:00.000000+0000 | UPDATED | hi3!
(4 rows)
虽然这个确切的示例可能对您不起作用,但想法是考虑以不同的方式组织数据以支持您的查询。
注意:在此示例中,您需要注意分区大小。如果该表在一个月内收到的消息超过5万至10万,您可能最终不得不添加另一个分区键。