4

我正在尝试为消息框应用程序找到最佳数据模型。该消息按照首先出现“未读”的顺序出现,然后随着用户滚动“已读”消息将出现。在这两个类别中,我想按到达时间对消息进行排序。类似于 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 上添加一个二级索引。我的查询将始终针对某个用户而不是一组用户。

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

4

1 回答 1

0

例如,您可以创建一个通过 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);

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

于 2015-11-22T18:16:46.497 回答