我给出的用例非常简单:存储给定用户的事件,并允许在给定的时间范围内对这些用户进行计数。如何在cassandra中建模用户事件日志?
可能发生的事件数量相当小(< 1k),用户数量也是如此(< 10k)。插入件的数量大约为〜1k /秒。查询相当以用户为中心,因此基本上在给定时间范围内为给定用户选择全部或特定事件。
的主要栏目有:
- 用户名
- 时间戳
- 事件
目前我的模型看起来像此列将被用作此:
(username, (timestamp, event, uuid))
因此用户名woul d是分区键,大多数查询可以通过仅查询一个节点来完成。一个非常普遍的查询可能看起来像:
select * from user_events where username=? and timestamp>? and timestamp<?
我还想过使用计数器列,而不是增加的情况下,单独的UUID列在同一用户在同一事件发生在同一毫秒内。
因此,表格也会保持较小。
如果有人能分享他/她对这个模型的想法,我将不胜感激。
UPDATE
我创建了以下主要表来存储用户事件
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查询上的时间戳后添加的子句:
群集列“事件”不能限制
这可能会导致宽行。 –
我明白了,但是我怎么能通过给定的要求通过这个?大多数查询都包含用户名和给定的时间范围,但偶尔还会执行仅用户名查询。 – u6f6o