繁体   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