我正在研究Cassandra上的聊天应用程序架构,希望得到一些关于如何进一步改进的建议。
以下是我的疑问:
以下是我的表格:
CREATE TABLE users(
user_id bigint,
nickname text,
email text,
PRIMARY KEY(user_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);
CREATE TABLE rooms(
room_id timeuuid,
room_name text,
status text,
creator_id bigint,
PRIMARY KEY(room_id)
);
CREATE TABLE room_users(
room_id timeuuid,
user_id bigint,
last_reply_time timestamp,
PRIMARY KEY((room_id), user_id)
);
CREATE MATERIALIZED VIEW room_users_by_user_id AS
SELECT *
FROM room_users
WHERE room_id IS NOT NULL
AND user_id IS NOT NULL
AND last_reply_time IS NOT NULL
PRIMARY KEY ((user_id), last_reply_time, room_id)
WITH CLUSTERING ORDER BY (last_reply_time DESC);
我可以通过上次回复时间排序的用户ID获得用户的房间,如下所示:
SELECT * FROM room_users_by_user_id WHERE user = 1;
我可以通过房间ID获取消息,如下:
SELECT * FROM messages WHERE room_id = 1;
我可以通过房间ID获得参与者:
SELECT * FROM room_users WHERE room_id = 1;
此设计的一个缺点是,当房间1有新消息时,我必须首先从user_id
获取room_users
的列表并更新每个last_reply_time
使用IN
语句行。
如果房间里有100个用户,我将不得不为房间中的每条新消息更新100行。我知道Cassandra的写入速度非常快,但有没有更有效的方法来实现相同的结果呢?
谢谢!