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

时间:2016-11-18 09:52:49

标签: cassandra data-modeling

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

对话

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

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

我想解决以下查询要求。

  • 显示给定用户的最近n个对话。
  • 显示给定用户的未读对话(而非消息)的计数。

有关数据建模的任何建议吗?

1 个答案:

答案 0 :(得分:1)

您可以从这个结构开始:

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来管理数据非规范化。

希望这可以帮到你。