我目前正在Cassandra上開發一個聊天應用程序。針對聊天應用程序的Cassandra數據模型的建議
一個談話
- 可以在一個或多個用戶之間發生。
- 可以有多條消息。
- 將被標記爲讀取,如果所有消息都被讀取。
在極端情況下,對話最多可以有100個用戶。
我想解決以下查詢需求。
- 顯示給定用戶的最近n次對話。
- 顯示給定用戶的未讀對話(而不是消息)的數量。
關於數據建模的任何建議?
我目前正在Cassandra上開發一個聊天應用程序。針對聊天應用程序的Cassandra數據模型的建議
一個談話
在極端情況下,對話最多可以有100個用戶。
我想解決以下查詢需求。
關於數據建模的任何建議?
你可以用這個結構開始:
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;
如果你可以使用卡桑德拉3.X,你可以使用MATERIALIZED VIEW
來管理數據的非規範化。
希望這可以幫助你。
1)我認爲它不支持我的用例。它獲得前n個最近的消息。但我想要最近的n次談話。 2)我認爲,它解決了我的目的。謝謝! – chaitan64arun
您使用哪個cassandra版本? –
2.1.13是我使用的版本 – chaitan64arun