Cassandra моделирование с состоянием чтения / непрочитанного для входящих сообщений, CQL

Я пытаюсь найти лучшую модель данных для приложения окна сообщения. Эти сообщения появляются в том порядке, в котором сначала появляются "непрочитанные", а затем, когда пользователь прокручивает, появляются "прочитанные" сообщения. В обеих категориях я хочу отсортировать сообщения по времени прибытия. Что-то вроде приоритетного почтового ящика в gmail.

Первая схема, которую я подумал использовать:

CREATE TABLE inbox 
    (userId     uuid,
     messageId  timeuuid,
     data       blob,
     isRead     boolean,
  PRIMARY KEY(userId, isRead, messageId))
  WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);

Таким образом, Мои данные сначала сортируются по логическому полю, а затем по времени. Теперь я могу легко просмотреть мои "непрочитанные" сообщения, и после того, как все они закончатся, я начну читать "прочитанные" сообщения.

Проблема в том, что я не могу обновить статус сообщения, так как это часть первичного ключа. Я могу сделать удаление, а затем вставить в пакетную операцию, это также та же строка.

Другое решение будет:

CREATE TABLE inbox
    (userId     uuid,
     messageId  timeuuid,
     data       blob,
     isRead     boolean,
  PRIMARY KEY((userId, isRead), messageId))
  WITH CLUSTERING ORDER BY (messageId DESC)

Наличие ряда для каждого статуса. Я получаю очень легкий доступ, но означает ли это, что мне приходится иметь дело с транзакцией? При чтении сообщения я должен удалить его из строки "непрочитанные" и вставить в строку "чтения", они могут быть в разных разделах.

другая версия для ключа раздела может быть:

PRIMARY KEY(userId, messageId)

и тогда я бы добавил вторичный индекс на isRead. Мои запросы всегда будут касаться определенного пользователя, а не группы пользователей.

Есть идеи, что лучше? Или любые другие идеи моделирования?

1 ответ

Вы можете создать таблицу, ссылающуюся на ваши сообщения по id для примера:

CREATE TABLE inbox 
(inbox_id   uuid,
 userId     uuid,
 messageId  timeuuid,
 data       blob,
 isRead     boolean,

ПЕРВИЧНЫЙ КЛЮЧ (inbox_id));

В этой таблице хранятся ваши данные и выполняются операции обновления.

Создать другие таблицы для поиска, как

CREATE TABLE inbox 
(inbox_id   uuid,
 userId     uuid,
 messageId  timeuuid,
 isRead     boolean,
PRIMARY KEY((userId, isRead), messageId))
WITH CLUSTERING ORDER BY (isRead ASC, messageId DESC);

Поиск нужных записей в этой таблице и обновление в обеих таблицах.

Другие вопросы по тегам