我需要使用cassandra获取N个用户的列表以及最近的操作。
我尝试使用以下架构:
CREATE TABLE user_actions(
partition_key int,
username int,
action_time timestamp,
PRIMARY KEY(partition_key, action_time)
WITH CLUSTERING ORDER BY(action_time DESC);
当用户首次登录时,会创建一个新条目。但是,我无法更新start_time
属性,因为它用作群集密钥。
我可以删除旧数据并在用户采取其他操作时创建新条目 - 但用户操作经常发生,我们将很快达到逻辑删除限制。
有没有人知道如何最好地建模数据以实现这一目标?
答案 0 :(得分:4)
您不需要删除单个单元格。继续追加。将另一个组件添加到分区键以防止变得太宽:
PRIMARY KEY((partition_key, day), action_time)
然后使用(伪代码):
之类的东西进行查询y = floor(time() / (60 * 60 * 24))
oldest_possible = y - 7
r = []
while len(r) < N and y >= oldest_possible:
R.append(query('SELECT * FROM user_actions where partition_key = {x} AND day = {y} LIMIT {N};', x, y, N)
y -= 1
获取最后N个用户。当分区中的N不是N时,每天减1并查询。将TTL设置为1到5天或其他东西,旧记录将被压缩。这假设您在24小时内至少有N个动作,否则您可能会得到一个不完整的列表。如果您的记录处于超级活动状态,则可以使用hour
代替日期。
日/小时组件可以是简单的floor(time() / (60*60*24))