对聊天应用的Cassandra数据模型的建议



我目前正在Cassandra之上开发一个聊天应用程序。

A 对话

  • 可以在一个或多个用户之间发生。
  • 可以有多条消息
  • 将被标记为已读,如果所有的消息被读取。

在极端情况下,会话可以有多达100个用户。

我想解决以下查询需求。

  • 显示给定用户的前n个最近对话。
  • 显示指定用户未读会话(非消息)的计数。
关于数据建模有什么建议吗?

你可以从这个结构开始:

CREATE TABLE conversation (
   conversation_id timeuuid,
   user_from varchar,
   user_to varchar,
   message text,
   message_read boolean,
   message_date timestamp,
   conversation_read boolean static,
   PRIMARY KEY ((conversation_id, user_to), message_date)
)
WITH CLUSTERING ORDER BY (user_from ASC, message_date ASC);

您的所有查询将基于conversation_iduser_to。消息将按创建日期排序。我认为这种结构可以支持聊天的主要目的。

对于这两个查询,您需要其他非规范化表,如:

1)显示给定用户的前n个最近对话。

CREATE TABLE user_message (
   user varchar,
   message text,
   message_date timestamp,,
   PRIMARY KEY ((user), message_date)
)
WITH CLUSTERING ORDER BY (message_date DESC);
SELECT message 
FROM user_message 
WHERE user = 'some user'
LIMIT 10;

2)显示指定用户未读会话(非消息)的计数。

CREATE TABLE user_conversations (
   user varchar,
   conversation_id timeuuid,
   conversation_read boolean,
   PRIMARY KEY((user), conversation_read, conversation_id)
);
SELECT COUNT(1) 
FROM user_conversations 
WHERE user = 'some user' 
   AND conversation_read = false;

如果你可以使用cassandra 3。X,您可以使用MATERIALIZED VIEW来管理数据的非规范化。

最新更新