代码之家  ›  专栏  ›  技术社区  ›  colloque

如何在聊天应用程序中按上次回复时间订购聊天室实体?

  •  3
  • colloque  · 技术社区  · 6 年前

    我正在用Apache Cassandra设计一个聊天应用程序的数据库模式,我无法理解这一点。

    到目前为止,我的模式如下:

    CREATE TABLE users(
      user_id bigint,
      nickname text,
      email text,
      chat_rooms set<timeuuid>,
      PRIMARY KEY(user_id)
    );
    
    CREATE TABLE rooms(
      room_id timeuuid,
      creation_date timestamp,
      creator_id bigint,
      participants set<bigint>,
      PRIMARY KEY(room_id)
    );
    
    CREATE TABLE messages(
      message_id timeuuid,
      room_id timeuuid,
      author_id bigint,
      time_bucket int,
      content text,
      PRIMARY KEY((room_id, time_bucket), message_id)
    ) WITH CLUSTERING ORDER BY (message_id DESC);
    

    我想按上次回复时间排序的用户id获取房间列表,类似于Facebook Messenger和Telegram。

    我在考虑增加一个新专栏 last_reply_time rooms ,将其用作群集密钥,并在房间中有新消息时更新。然而,在Cassandra中更新集群键值是不可能的。我应该如何进行建模?

    我已经看过了 KillrChat example Discord's wonderful piece 关于他们的Cassandra实现,但他们没有提及任何与我的问题相关的内容。

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Horia    6 年前

    你可以有一张这样的桌子

    create table test (
       creator_id bigint ,
       room_id timeuuid ,
       last_reply_time timestamp,
       primary KEY ((creator_id), room_id))
    with CLUSTERING ORDER BY
       (room_id ASC );
    

    您可以在last\u reply\u time中插入所有内容,并使用

    select * from test where creator_id = ? and room_id = ?
    

    由于您将具有相同的creator\u id和room\u id,因此您将只执行将更新数据库中相同条目的插入操作。