Cassandra使用读取/未读状态建模消息收件箱,CQL

时间:2015-11-16 16:07:13

标签: 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);

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

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

另一种解决方案是:

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上添加一个二级索引。我的查询将始终在某个用户而不是一组用户。

关于什么更好的任何想法?还是其他任何建模思路?

1 个答案:

答案 0 :(得分:0)

您可以创建一个以id为例引用消息的表:

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

PRIMARY KEY(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);

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