Я работаю над схемой приложения чата на 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);
Я могу получить номер пользователя по идентификатору пользователя, упорядоченному по времени последнего ответа, следующим образом:
SELECT * FROM room_users_by_user_id WHERE user = 1;
Я могу получить сообщения по идентификатору комнаты следующим образом:
SELECT * FROM messages WHERE room_id = 1;
Я могу получить участников по номеру комнаты следующим образом:
SELECT * FROM room_users WHERE room_id = 1;
Одним из недостатков этого дизайна является то, что, когда есть новое сообщение для комнаты 1, я должен сначала получить список user_id
отroom_users
и обновите last_reply_time
для каждой строки, используя оператор IN
.
Если в комнате 100 пользователей, мне придется обновить 100 строк для каждого нового сообщения в комнате.Я понимаю, что скорость записи для Cassandra исключительно высока, но есть ли более эффективные способы достижения того же результата?
Спасибо!