【问题标题】:Cassandra data modeling timestampsCassandra 数据建模时间戳
【发布时间】:2015-08-18 23:27:32
【问题描述】:

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

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

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

    您希望如何定义 events 字段取决于其中的内容以及您需要如何访问它。如果您经常访问其中的一小部分,您可能希望通过将事件键设置为另一个集群列,将映射中的事件分成单独的行,如下所示:

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

    很难给出更具体的建议,因为您没有根据要运行的查询以及数据量、用户数量等来描述您的用例。

    【讨论】:

      【解决方案2】:

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

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

      主键(guid、日期、事件类型)

      【讨论】:

        猜你喜欢
        • 2019-07-29
        • 2018-06-24
        • 1970-01-01
        • 2014-11-18
        • 2018-01-15
        • 2015-12-30
        • 2016-08-29
        • 1970-01-01
        相关资源
        最近更新 更多