Cassandra数据建模时间戳

时间:2015-08-18 13:21:56

标签: cassandra

我有一个相当简单的数据模型。我正在根据时间戳跟踪用户的事件。我正在转换一个有这种情况的JSON对象:

userID:{
   event: [
     { timestamp: data },
     { timestamp: data }
   ]
}

我想出了两个Cassandra模式。

第一个:

CREATE TABLE users ( guid uuid, date timestamp, events varchar, PRIMARY KEY(guid, date) );

第二个:

CREATE TABLE users ( guid uuid PRIMARY KEY, date timestamp, events map<text, text> );

任何一个都可以工作,要求数据是字符串化的JSON对象。我的查询将返回给定时间范围内用户的所有数据。哪种模式更有意义,还是有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

第二种方法不允许您按时间范围进行查询,因为您没有日期作为聚类列。所以你可能想要这样做:

CREATE TABLE users ( 
    guid uuid,
    date timestamp, 
    events map<text, text>, 
    PRIMARY KEY(guid, date) );

您希望如何定义事件字段取决于其中的内容以及您需要如何访问它。如果您经常访问它的一小部分,您可能希望通过使事件键成为另一个聚类列,将地图中的事件分成不同的行:

CREATE TABLE users ( 
    guid uuid,
    date timestamp, 
    event_type text,
    event_value text, 
    PRIMARY KEY(guid, date, event_type) );

由于您没有根据要运行的查询以及数据量,用户数等来描述您的用例,因此很难提供更具体的建议。

答案 1 :(得分:2)

正如Jim所说,第二个架构不允许查询时间戳,因为它不包含在主键中。

他提出了一个有效的解决方案,但我还建议您不要使用uuid和时间戳,而是使用TimeUUID(如果可以的话,同时提供id和时间戳)。但是,如果您需要仅通过id获取用户,那么Jim的解决方案可能是最好的:

PRIMARY KEY(guid,date,event_type)