在以下实际场景中:
用户来到俱乐部(例如:健身房)并无限期地购买会员资格,并在指定的时间后取消会员资格。 取消会员资格后,同一个用户以后可以购买一个或多个月的其他会员资格。
我有一个事件表,其中记录了启动和停止成员资格的事件。
membership_events
PK(member_id,event_type_id,event_time)
可能发生的一件事是会员可以拥有多个会员资格:
我怎样才能找到via cassandra,它是指定月份内活跃会员的数量?
示例数据
用户1
成员:
用户2
成员
用户3
成员
2016.1月的活跃会员资格:
答案 0 :(得分:0)
您的PK由
组成的简单事实PK(member_id,event_type_id,event_time)
使您的问题难以解决,并且至少效率低下,因为您需要查询所有分区而无法过滤数据库级别的任何记录(基本上您必须在没有SELECT
clausole的情况下执行WHERE
)。
为了缓解这个问题,我会用以下的方式转换你的模型:
CREATE TABLE events (
dummy int,
event_start timestamp,
event_stop timestamp,
member_id int,
PRIMARY KEY (dummy_partition, event_start, event_stop)
);
这个表使用虚拟分区(这是 HOTSPOT !!!不要在家里尝试这个......并且在生产中...... 。)允许通过编写类似
的内容来指定可以利用的WHERE dummy = 0 AND ...
之类的东西
SELECT member_id FROM events WHERE dummy = 0 AND event_start <= '2016-01-01' AND event_stop > '2016-01-01';
获取2016.1期间的记录,假设存储了具有远时间戳的不定成员资格(2100-01-01
应该足够远)。
这样,您将提取2016.1个月中活动的member_id,结果最终将包含一些member_id重复项。您需要在应用程序级别手动过滤它们。
事实是,您应该重新考虑您的模型,而像创建一个月份拥有会员资格的新表应该是您拥有的最佳选择,并且可能这是解决问题的最佳方法C *方式中的特定问题。
希望有所帮助。