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