查询选择两个单独日期的设计模式的设计模式

时间:2019-05-21 22:33:01

标签: cassandra nosql cql

我有一个消息表,像这样:

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_atupdated_at或其他东西来创建一些令牌进行排序?

1 个答案:

答案 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万,您可能最终不得不添加另一个分区键。