我有一个相当简单的数据模型。我正在根据时间戳跟踪用户的事件。我正在转换一个有这种情况的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对象。我的查询将返回给定时间范围内用户的所有数据。哪种模式更有意义,还是有更好的方法来解决这个问题?
答案 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)