作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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。
我正在考虑向 rooms
添加一个新列 last_reply_time
,将其用作聚类键并在房间中有新消息时更新它。然而,在 Cassandra 中更新集群键值是不可能的。我应该如何对此进行建模?
我看过 KillrChat example和 Discord's wonderful piece关于他们的 Cassandra 实现,但他们没有提及与我的问题相关的任何事情。
提前致谢!
最佳答案
你可以有这样一张 table
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_reply_time 插入其中并选择您的数据
select * from test where creator_id = ? and room_id = ?
您将只执行更新数据库中相同条目的插入操作,因为您将拥有相同的 creator_id 和 room_id。
关于cassandra - 如何在聊天应用程序中按最后回复时间排序房间实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50367999/
我是一名优秀的程序员,十分优秀!