Cassandra 对消息收件箱的已读/未读状态进行建模,CQL

标签 cassandra data-modeling cql secondary-indexes clustering-key

我正在尝试为消息框应用程序找到最佳的数据模型。该消息的显示顺序是,首先出现“未读”消息,然后当用户滚动时,将出现“已读”消息。在这两个类别中,我想按到达时间对消息进行排序。类似于 Gmail 中的优先收件箱。

我想使用的第一个模式是:

CREATE TABLE inbox 
    (userId     uuid,
     messageId  timeuuid,
     data       blob,
     isRead     boolean,
  PRIMARY KEY(userId, isRead, messageId))
  WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);

所以我的数据首先按 bool 字段排序,然后按时间排序。现在,我可以轻松地先查看“未读”消息,在它们全部结束后,我将开始阅读“已读”消息。

问题是我无法更新任何消息状态,因为它是主键的一部分。我可以批量操作删除然后插入,也是同一行。

另一个解决方案是:

CREATE TABLE inbox
    (userId     uuid,
     messageId  timeuuid,
     data       blob,
     isRead     boolean,
  PRIMARY KEY((userId, isRead), messageId))
  WITH CLUSTERING ORDER BY (messageId DESC)

每种状态都有一行。我获得了非常轻松的访问权限,但这是否意味着我必须处理交易?阅读消息时,我必须将其从“未读”行中删除并将其插入到“已读”行中,它们可能位于不同的分区中。

分区键的另一个版本可以是:

PRIMARY KEY(userId, messageId)

然后我会在 isRead 上添加一个二级索引。我的查询将始终针对某个用户而不是一组用户。

有什么更好的想法吗?或者还有其他的建模想法吗?

最佳答案

您可以创建一个通过 id 引用消息的表,例如:

CREATE TABLE inbox 
(inbox_id   uuid,
 userId     uuid,
 messageId  timeuuid,
 data       blob,
 isRead     boolean,

主键(inbox_id));

该表存储您的数据并执行更新操作。

创建其他表用于搜索,例如

CREATE TABLE inbox 
(inbox_id   uuid,
 userId     uuid,
 messageId  timeuuid,
 isRead     boolean,
PRIMARY KEY((userId, isRead), messageId))
WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);

在此表中搜索所需记录并在两个表中更新。

关于Cassandra 对消息收件箱的已读/未读状态进行建模,CQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33739690/

相关文章:

cassandra - 将数据放置在 Cassandra 的特定节点中

cassandra - 计算cassandra中的行数

cassandra - 替换 Apache Cassandra 中的表

amazon-web-services - 如何在EBS环境中为提交日志和数据使用单独的卷?

java - 尝试使用 cassandra 数据存储从 eclipse 运行 nutch 时出现 java.lang.NullPointerException

java - 如何从 java 获取聚合 Cassandra 行数据

mysql - 数据库:什么设计让 "document table"引用其他表

mysql - 在为本地位置创建 mysql 表时,最好的主键是什么?

php - 从 cassandra 将完整表导出到 csv