2016-04-02 81 views
0

我正在寫消息聊天系統,類似於FB消息。我沒有找到方法,如何有效地存儲會話列表(每行不同的用戶與上次發送的最後一條消息)。如果我列出從該表中的對話:Cassandra cql - 按時間排序唯一ID

CREATE TABLE "conversation_list" (
    "user_id" int, 
    "partner_user_id" int, 
    "last_message_time" time, 
    "last_message_text" text, 
    PRIMARY KEY ("user_id", "partner_user_id") 
) 

我可以從任何USER_ID此表對話選擇。當發送新消息時,我們可以簡單地更新該行:

UPDATE conversation_list SET last_message_time = '...', last_message_text='...' WHERE user_id = '...' AND partner_user_id = '...' 

但它是按聚類鍵排序當然。我的問題:如何創建會話列表,按last_message_time排序,但partner_user_id對於給定的user_id將是唯一的?

如果last_message_time被聚集鍵,我們刪除該行並插入新(保持partner_user_id唯一的),我會在表中多那麼多的thumbstones。

謝謝。

回答

2

稍微改變你原來的模型應該做你想要什麼:

CREATE TABLE conversation_list (
    user_id int, 
    partner_user_id int, 
    last_message_time timestamp, 
    last_message_text text, 
    PRIMARY KEY ((user_id, partner_user_id), last_message_time) 
) WITH CLUSTERING ORDER BY (last_message_time DESC); 

我結合「USER_ID」和「partner_user_id」成一個分區鍵。 「last_message_time」可以是單個聚類列並提供排序。我使用CLUSTERING ORDER BY顛倒了默認的排序順序,使時間戳降序。現在,只要有消息從用戶到合作伙伴ID,就應該能夠插入。

的選擇現在就給你找發送的最後一條消息的能力。就像這樣:

SELECT last_message_time, last_message_text 
FROM conversation_list 
WHERE user_id= ? AND partner_user_id = ? 
LIMIT 1 
+0

謝謝你帕特里克!也許我沒有描述得很好。我知道,如何管理聊天(1對話)。但是我需要列出最後一條消息的所有聯繫人。然後用戶可以選擇一個對話(聊天)並將其打開。我需要獲得一份**最後一條消息**的時間排序的用戶(聯繫人)列表。 –

+0

從一個用戶或任何聊天的角度來看是這樣嗎? –

+0

如果您點擊頂部的郵件圖標,我想列出像facebook一樣的最後對話。您可以查看按時間排序的最後X個對話(頂部爲舊),每個對話爲1行(即使有更多的消息)。點擊列表中的一個對話後,您將打開與當前用戶的一對一聊天(很容易)。 –