【发布时间】:2017-01-24 01:08:36
【问题描述】:
我给定的用例相当简单:为给定用户存储事件,并允许在以后给定时间范围内为每个用户计算这些事件。
可能的事件数量相当少(
关键列是:
- 用户名
- 时间戳
- 事件
目前我的模型看起来像此列将用作:
(username, (timestamp, event, uuid))
因此,用户名将是分区键,并且大多数查询可以通过仅查询一个节点来完成。一个非常常见的查询可能如下所示:
select * from user_events where username=? and timestamp>? and timestamp<?
我进一步考虑使用计数器列而不是添加单独的 uuid 列,以防同一用户的同一事件在同一毫秒内发生。
因此,桌子也会变小。
如果有人能分享他/她对这个模型的想法,我将不胜感激。
更新
我创建了以下主表来存储用户事件
CREATE TABLE IF NOT EXISTS events.events_by_user(
user text,
added_week int,
added_timestamp timestamp,
event text,
uuid uuid,
PRIMARY KEY((user, added_week), added_timestamp, event))
WITH CLUSTERING ORDER BY(added_timestamp DESC)
这很好用,我开始通过这样的查询来查询表:
SELECT event,added_timestamp FROM events_by_user WHERE user=? AND added_week=? AND added_timestamp>=? AND added_timestamp<?;
之后我创建了第二个查询来过滤特定事件:
SELECT event,added_timestamp FROM events_by_user WHERE user=? AND added_week=? AND added_timestamp>=? AND added_timestamp<? AND event IN ?;
这个虽然没有工作,因为我不允许在对时间戳执行 gte 和 lt 查询后添加一个包含以下消息的子句:
不能限制聚类列“事件”(前一列 "add_timestamp" 受非 EQ 关系限制)
【问题讨论】:
-
这可能会导致宽行。
-
我明白了,但是我怎样才能通过给定的要求呢?大多数查询包括用户名和给定的时间范围,但偶尔也会执行仅用户名的查询。
标签: database cassandra data-modeling