Cassandra cql - 按时间排序唯一ID

时间:2016-04-02 20:56:21

标签: cassandra database nosql

我正在编写消息聊天系统,类似于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唯一),我将在表中有很多这样的thumbstones。

谢谢。

1 个答案:

答案 0 :(得分: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