【问题标题】:Cassandra cql - sorting unique IDs by timeCassandra cql - 按时间排序唯一 ID
【发布时间】:2016-04-02 20:56:21
【问题描述】:

我正在编写消息聊天系统,类似于 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 是集群键并且我们删除该行并插入新行(以保持 partner_user_id 唯一),我将在表中有很多拇指石。

谢谢。

【问题讨论】:

    标签: cassandra database nosql


    【解决方案1】:

    对您的原始模型稍作改动应该可以满足您的需求:

    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
    

    【讨论】:

    • 谢谢帕特里克!可能我描述得不好。我知道,如何管理聊天(1 个对话)。但我需要最后一条消息的所有联系人列表。然后用户可以选择一个对话(聊天)并打开它。我需要获取按最后一条消息的时间排序的用户(联系人)列表
    • 如果您单击顶部的消息图标,我想像 facebook 一样列出最近的对话。您可以查看按时间排序的最后 X 个对话(顶部较旧),每个对话显示 1 行(即使有更多消息)。单击列表中的一个对话后,您将打开与当前用户的一对一聊天(这很容易做到)。
    猜你喜欢
    • 2023-03-11
    • 2014-03-23
    • 2017-03-13
    • 1970-01-01
    • 2018-10-05
    • 2018-11-30
    • 2014-11-25
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多