[英]Cassandra cql - sorting unique IDs by time
我正在編寫類似於FB消息傳遞的消息傳遞聊天系統。 我沒有找到有效存儲對話列表的方法(每行不同的用戶,最近發送的消息排在最前面)。 如果我從該表中列出對話:
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是集群鍵,並且我們刪除該行並插入new(以保持partner_user_id唯一),則表中將有很多經驗教訓。
謝謝。
對原始模型稍作更改即可滿足您的要求:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.