【问题标题】:Cassandra Update query | timestamp column as clustering keyCassandra 更新查询 |时间戳列作为聚类键
【发布时间】:2017-05-04 08:41:24
【问题描述】:

我在 cassandra 中有一张表,其架构如下:

CREATE TABLE user_album_entity (
    userId text,
    albumId text,
    updateDateTimestamp timestamp,
    albumName text,
    description text,
    PRIMARY KEY ((userId), updateDateTimestamp)
);

获取数据所需的查询将有一个 where userId = xxx order by updateTimestamp。因此架构有 updateDateTimestamp。

问题在于更新表的列。查询是:更新user id = xxx的用户的专辑信息。但根据规范,对于更新查询,我需要 updateDateTimestamp 的确切值,在正常情况下,应用程序永远不会发送。

这些问题的答案应该是什么,因为我相信这是一个非常常见的用例,其中选择查询需要对时间戳进行排序。非常感谢任何帮助。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    问题是您的表结构允许同一张专辑有多个记录,唯一的区别是时间戳(集群键)。

    三种可能的解决方案:

    1. 删除集群键并在应用程序级别对数据进行排序。
    2. 删除集群键并将Secondary Index 添加到时间戳字段。
    3. 删除集群键并创建Materialized View 来执行查询。

    【讨论】:

    • 我意识到的一件事绝对是 updateDateTimestamp 永远不应该成为您的集群键的一部分。 KillrChat 的所有示例都显示按日期列的顺序是创建/上传日期等。如果我将 userId 作为分区键,将 albumId 和 creationDate 作为集群键,由于映射是 1:n,这听起来有点奇怪。如果有一天我必须为所有用户更新专辑名称,我必须进行异步多次更新,因为我无法对作为第一个键的 userId 执行 IN 操作。 @xmas79 我是对的还是有隐藏的更好的方法来做到这一点。
    • 不要使用选项 2 和 3。MV 被标记为实验性的,二级索引有很多缺点,包括集群增长带来的巨大性能损失。
    【解决方案2】:

    如果您的用例是每个分区将恰好包含一行, 然后你可以像这样建模你的表:

    CREATE TABLE user_album_entity ( userId text, albumId text static, updateDateTimestamp timestamp, albumName text static, description text static, PRIMARY KEY ((userId), updateDateTimestamp) );

    以这种方式对表进行建模可以通过以下方式完成更新查询: UPDATE user_album_entity SET albumId = 'updatedAlbumId' WHERE userId = 'xyz'

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2017-04-30
      • 2015-01-20
      • 2018-06-11
      • 2023-03-05
      • 2015-02-05
      • 2019-05-25
      • 2016-05-04
      • 2017-12-20
      相关资源
      最近更新 更多