所有 我正在使用Cassandra 2.2实现一种历史表。 我当前的架构有一个用于userid的行键,以及用于时间戳的簇键,然后在每一行中都有一个用户行为记录。我想为给定的用户ID仅保留10个最新行。我该如何巧妙地实现这一点?
感谢您的任何建议!
答案 0 :(得分:1)
给出数据模型:
CREATE TABLE history (
userid text,
activity_time timeuuid,
behavior text,
PRIMARY KEY ((userid),timeuuid)
);
我能想到的最好的事情就是做到以下几点:
SELECT * FROM history WHERE userid='fromanator' LIMIT 10;
然而,如果用户在TTL中没有任何历史记录,那么使用此方法则不会得到任何结果。根据您的使用情况,这可能是可以接受的。
如果您绝对需要保留至少最后10条记录,那么您将拥有更复杂的数据模型和应用程序代码,以便在Cassandra中实现这一目标。
答案 1 :(得分:0)
这可能不是最优雅的解决方案,并且不会严格遵守在任何给定时间仅存储10条记录,但您可以将行数据存储为列表(如果行数据存在结构,您和#39; d必须自己处理此结构或使用user defined types)。如果您在写入时已经可以使用此列表,那么在写入之前,您只需将其截断为最新的10个值,否则您可以等到下次在该列表上完成读取,将其截断为10条记录,然后写回Cassandra。
如果你不太关心存储了多少数据,而只关心检索最后10个结果,那么fromanator's solution(有或没有TTL取决于你是否关心更多关于数据的大小或确保10个结果)是最好的。