簡體   English   中英

Cassandra CQL-按時間排序唯一ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM