我目前正在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_id
和user_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
来管理数据的非规范化。