如何在cassandra的特定时期(月)找到活跃的会员?

时间:2016-09-21 12:05:10

标签: cassandra

在以下实际场景中:

用户来到俱乐部(例如:健身房)并无限期地购买会员资格,并在指定的时间后取消会员资格。 取消会员资格后,同一个用户以后可以购买一个或多个月的其他会员资格。

我有一个事件表,其中记录了启动和停止成员资格的事件。

membership_events

  • member_id:int
  • event_type_id:int
  • event_time:timeuuid

PK(member_id,event_type_id,event_time)

可能发生的一件事是会员可以拥有多个会员资格:

  • 2015.1 - 2015.5
  • 2016.1 - 2016.3
  • 2016.5 - ?

我怎样才能找到via cassandra,它是指定月份内活跃会员的数量?

示例数据

用户1

成员:

  • 2015.4 - 2015.6
  • 2016.1 - 2016.3

用户2

成员

  • 2015.7 - 2015.8
  • 2015.9 - 2016.3

用户3

成员

  • 2015.8 - 2015.12
  • 2016.5 - ?

2016.1月的活跃会员资格:

  • 用户1
  • 用户2

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 *方式中的特定问题。

希望有所帮助。