2

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

  1. 频道 ID
  2. 由...制作
  3. message_id(唯一)

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

所以我的问题是关于 primary_key 定义。如果我要定义它(channel_id,created_by) ,我是否可以UPDATE使用WHEREcLause 之类的channel_id=X and message_id=XX,即使message_id它不在主键中(我确实为查询提供了分区键)?

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

谢谢

4

2 回答 2

1

定义它(channel_id,created_by),我将能够UPDATE使用WHEREcLausechannel_id=Xmessage_id=XX

不需要。Cassandra 中的写入操作需要所有主键组件。首先,您必须提供created_by. message_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 cause channel_id+进行更新message_id

不。同样,您需要为created_by写入提供成功。

于 2020-08-07T13:35:31.920 回答
0

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

您的要求:

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

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

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

于 2020-08-09T19:53:52.410 回答