【问题标题】:cassandra primary key where cause limitationcassandra 主键导致限制
【发布时间】:2020-11-27 19:35:25
【问题描述】:

我想使用 cassandra 作为数据库来存储消息,而在我的模型中消息是按通道聚合的。 消息的 3 个主要重要字段:

  1. channel_id
  2. created_by
  3. message_id(唯一)

主要的读取/获取 API 是按created_by 排序的通道获取消息。 另外,我有一个由channel_id + message_id 更新的小规模消息。

所以我的问题是关于 primary_key 的定义。 如果我定义它(channel_id,created_by) 即使message_id 不在主键中(我确实为查询提供了分区键),我是否可以使用WHERE cLause 像channel_id=X and message_id=XX 一样执行UPDATE

如果没有, 如果我将像这样定义主键(channel_id,created_by, message_id) 我是否能够使用 where Cause 仅使用 1 个聚类列进行读取 (channel_id,created_by) 并使用 where cause channel_id + message_id 进行更新?

谢谢

【问题讨论】:

    标签: cassandra primary-key clustering-key


    【解决方案1】:

    定义它(channel_id,created_by) 是否可以使用WHERE cLause 像channel_id=Xmessage_id=XX 一样执行UPDATE

    没有。 Cassandra 中的写入操作需要所有主关键组件。首先,您必须提供created_bymessage_id 不是密钥的一部分,因此必须将其删除。

    如果没有,如果我像 (channel_id,created_by, message_id) 这样定义主键,我将能够使用 WHERE 进行读取,因为只有 1 个聚类列 (channel_id,created_by)

    是的,这会起作用:

    SELECT * FROM messages WHERE channel_id='1' AND created_by='Aaron';
    

    这个 ^ 有效,因为您已经提供了前两个主键组件,没有跳过任何一个。 Cassandra 可以轻松找到包含channel_id 分区的节点,并向下扫描到以created_by 开头的行。

    并使用 WHERE 原因进行更新 channel_id + message_id?

    没有。同样,您需要提供 created_by 才能使写入成功。

    【讨论】:

      【解决方案2】:

      主键选择决策是 Cassandra 数据建模中最重要的部分之一。您需要了解该表。我不确定是否可以帮助您了解您提供的上述信息。不过我还是会试一试的。

      您的要求:

      1. 按 created_by 排序。
      2. 使用 channel_id + message_id 更新

      尝试将 channel_id + message_id 作为分区键,将 created_by 作为集群键。主键中的 Message_id 也有助于确保唯一性。

      最近我在https://academy.datastax.com/ 上找到了关于数据建模的 DS220 课程。这太棒了。

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        • 2014-02-25
        • 2012-02-02
        • 1970-01-01
        • 2014-01-20
        相关资源
        最近更新 更多