cassandra主键在哪里导致限制

cassandra主键在哪里导致限制,cassandra,primary-key,clustering-key,Cassandra,Primary Key,Clustering Key,我想使用cassandra作为数据库来存储消息,在我的模型中,消息是按通道聚合的。 信息的3个主要重要领域: 通道id 创建于 消息id(唯一) 主要的读取/获取API是按通道获取消息,按创建的排序。 另外,我还通过channel\u id+message\u id更新了一个小范围的消息 所以我的问题是关于主键的定义。 如果我将定义它(频道id,创建人) 我是否能够使用WHERE子句,如channel_id=X和message_id=XX,进行更新,即使message_id不在主键中(我确实给查

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

  • 通道id
  • 创建于
  • 消息id(唯一)
  • 主要的读取/获取API是按通道获取消息,按创建的
    排序。
    另外,我还通过
    channel\u id
    +
    message\u id
    更新了一个小范围的消息

    所以我的问题是关于主键的定义。 如果我将定义它
    (频道id,创建人)
    我是否能够使用
    WHERE
    子句,如
    channel_id=X和message_id=XX
    ,进行
    更新
    ,即使
    message_id
    不在主键中(我确实给查询分配了分区键)

    如果没有, 如果我将像这样定义主键
    (频道id、创建人、消息id)
    我是否能够仅使用1个群集列(频道id,创建人)
    并使用where cause
    channel\u id
    +
    message\u id
    进行更新

    谢谢

    定义它
    (频道id,创建人)
    我是否能够使用
    WHERE
    子句(如
    频道id=X
    消息id=XX

    不需要。Cassandra中的写入操作需要所有主键组件。首先,您必须提供由创建的
    <代码>消息_id
    不是密钥的一部分,因此必须将其删除

    如果没有,如果我将像这样定义主键
    (channel\u id,created\u by,message\u id)
    ,我是否能够使用
    执行读取操作,其中
    原因只有一个集群列
    (channel\u id,created\u by)

    是的,这将起作用:

    SELECT * FROM messages WHERE channel_id='1' AND created_by='Aaron';
    
    这^有效,因为您已经提供了前两个主键组件,而没有跳过任何组件。Cassandra可以很容易地找到包含
    频道id的分区的节点,并向下扫描到由
    创建的
    开始的行

    并使用WHERE cause
    channel\u id
    +
    message\u id
    进行更新


    否。同样,您需要提供由
    创建的
    ,以便写入成功。

    主键选择决策是Cassandra数据建模中最重要的部分之一。你需要了解这张桌子。我不确定我是否能帮助您提供上述信息。但我还是会尝试一下

    您的要求:

  • 按创建的排序依据
  • 使用通道id+消息id进行更新
  • 尝试将channel_id+message_id作为分区键,并将创建的作为集群键。主键中的消息id也有助于确保唯一性

    最近我在上找到了DS220数据建模课程。这太棒了