Кассандра - Схема для чата - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над схемой приложения чата на 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 исключительно высока, но есть ли более эффективные способы достижения того же результата?

Спасибо!

...