2016-11-18 97 views
0

我目前正在Cassandra上開發一個聊天應用程序。針對聊天應用程序的Cassandra數據模型的建議

一個談話

  • 可以在一個或多個用戶之間發生。
  • 可以有多條消息。
  • 將被標記爲讀取,如果所有消息都被讀取。

在極端情況下,對話最多可以有100個用戶。

我想解決以下查詢需求。

  • 顯示給定用戶的最近n次對話。
  • 顯示給定用戶的未讀對話(而不是消息)的數量。

關於數據建模的任何建議?

+0

您使用哪個cassandra版本? –

+0

2.1.13是我使用的版本 – chaitan64arun

回答

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; 

如果你可以使用卡桑德拉3.X,你可以使用MATERIALIZED VIEW來管理數據的非規範化。

希望這可以幫助你。

+0

1)我認爲它不支持我的用例。它獲得前n個最近的消息。但我想要最近的n次談話。 2)我認爲,它解決了我的目的。謝謝! – chaitan64arun