设计架构以在两个不同的日期之间查询 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_at
和 updated_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 条消息,您可能最终不得不添加另一个分区键。
我有一个 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_at
和 updated_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 条消息,您可能最终不得不添加另一个分区键。