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);
Поиск нужных записей в этой таблице и обновление в обеих таблицах.