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

Rib*_*bak 5 data-modeling cql cassandra secondary-indexes clustering-key

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

\n\n

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

\n\n
CREATE TABLE inbox \n    (userId     uuid,\n     messageId  timeuuid,\n     data       blob,\n     isRead     boolean,\n  PRIMARY KEY(userId, isRead, messageId))\n  WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

另一个解决方案是:

\n\n
CREATE TABLE inbox\n    (userId     uuid,\n     messageId  timeuuid,\n     data       blob,\n     isRead     boolean,\n  PRIMARY KEY((userId, isRead), messageId))\n  WITH CLUSTERING ORDER BY (messageId DESC)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
PRIMARY KEY(userId, messageId)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n

Gui*_*e S 0

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

CREATE TABLE inbox 
(inbox_id   uuid,
 userId     uuid,
 messageId  timeuuid,
 data       blob,
 isRead     boolean,
Run Code Online (Sandbox Code Playgroud)

主键(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);
Run Code Online (Sandbox Code Playgroud)

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