Запросить элементы в таблице DynamodB в числовом диапазоне - PullRequest
0 голосов
/ 17 января 2019

Мне нужны рекомендации по внедрению почтовых уведомлений для новых сообщений чата. Почтовое уведомление будет информировать пользователя обо всех чатах, в которых появились новые сообщения за предыдущий час.

Чтобы это сделать, мне нужно запросить все чаты в таблице за определенный промежуток времени. Первое, что пришло в голову, - это добавить новый глобальный индекс, где хеш будет логическим для того, есть ли в чате непрочитанные сообщения, а диапазон будет меткой времени для последнего сообщения в этом чате.

Но я узнал, что булевы хеш-ключи - это довольно анти-шаблон, поскольку они сжимают документы в одном разделе.

Существует ли другая модель, которая позволила бы нам запрашивать все элементы в таблице в числовом диапазоне?

1 Ответ

0 голосов
/ 21 января 2019

Я предполагаю, что вы хотите запросить непрочитанные сообщения для данного пользователя, поскольку (опять же) я предполагаю, что состояние чтения / непрочитанного данного уведомления не должно изменяться для одного пользователя, если другой пользователь читает уведомление для тоже самое.

Исходя из этого, вы должны использовать разреженный индекс с userId (или его эквивалентом) в качестве хеш-ключа и unreadNotificationTime в качестве ключа сортировки. Когда вы вставляете новое уведомление в вашу таблицу, установите значение unreadNotificationTime для отметки времени для уведомления. Когда пользователь прочитал уведомление, удалите атрибут unreadNotificationTime из элемента.

Почему это работает?

DynamoDB требует только, чтобы элемент имел ключевые атрибуты базовой таблицы, а любые другие атрибуты являются необязательными. Работа индексов в DynamoDB заключается в том, что элемент из базовой таблицы будет отображаться только в индексе элемента, имеющего все ключевые атрибуты этого конкретного индекса.

При установке значения для unreadNotificationTime при сохранении уведомления все вновь созданные уведомления будут автоматически заполняться индексом непрочитанных сообщений. Удаляя unreadNotificationTime при прочтении сообщения, вы получаете уведомление из этого индекса. С этой схемой нет необходимости в каких-либо операциях фильтрации или сканирования. Ваш индекс будет содержать только непрочитанные уведомления, сгруппированные по идентификатору пользователя и отсортированные по дате.

...