设计架构以在两个不同的日期之间查询 select

Design schema to query select beetwen two separate dates

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

messages (
    user_id uuid,
    id uuid,
    message blob,
    created_at timestamp,
    updated_at timestamp,
    PRIMARY KEY (user_id, id)
)

我可以为 updated_at 排序和 select 消息创建一个 MV。但是当我需要 select 客户端同步时上次更新的消息(例如 select where updated_at > 1555602962006 and created_at < 1555602962006)时 - 唯一的方法是 select 所有消息 updated_at 并过滤代码中的行?这是生产中的正常做法吗?

也许在这种情况下,可以通过连接 created_atupdated_at 之类的方式创建一些标记来排序?

因此,棘手的部分是 Cassandra 不允许对多个不同的列进行范围查询。其次,范围查询仅在 分区内有效,因此您需要想出一个时间 "bucketing" 策略。

我过去围绕此建模的一种方法是用一列表示时间戳,但 表示时间类型。我将在此处使用上面的 table 组合一个示例。对于时间桶,我将使用月份;本质上,我知道我只会查询上个月 created/updated 的消息(这可能对您有用,也可能不可用)。

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)

虽然这个确切的示例可能不适合您,但我们的想法是考虑以不同方式组织您的数据以支持您的查询。

注意:在本示例中,您需要注意分区大小。如果此 table 在一个月内收到超过 50k-100k 条消息,您可能最终不得不添加另一个分区键。