我目前正在Cassandra上开发一个聊天应用程序。
对话
在极端情况下,对话最多可以有100个用户。
我想解决以下查询要求。
有关数据建模的任何建议吗?
答案 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_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
来管理数据非规范化。
希望这可以帮到你。