Я новичок в DynamoDb (и No-SQL в целом) и все еще испытываю некоторые трудности при разработке моей модели данных.
У меня есть следующий вариант использования.Представьте себе приложение, которое обрабатывает события.Пользователи могут посетить событие.В мероприятиях могут участвовать несколько пользователей.Мне нужно знать, кто идет на какое событие и на какие события пойдет пользователь.
Итак, до сих пор я пришел со следующим решением:
- У меня естьтаблица
Users
с уникальным идентификатором - таблица
Events
с уникальным идентификатором - таблица
EventAttendeeds
с полями EventId
и UserId
- Первичный ключ для EventId (HASH) + UserId (RANGE) => Позволяет мне сказать, кто собирается на данное событие
- Глобальный вторичный индекс для UserId (HASH) + EventId (RANGE) => Позволяет сказать, на какие события пойдет пользователь.
Пока все хорошо.Эта проблема возникает, когда мне нужно указать, на какие события пользователь пойдет за данный месяц, упорядочить по дате.Например: какие события будет посещать пользователь 123 в этом месяце (например, чтобы показать его в календаре).
Единственный вариант, который мне пришел в голову, - это денормализовать данные и добавить копию eventDate
поле из моей таблицы событий в таблицу EventAttendees, а затем добавить глобальный вторичный индекс на UserId
(HASH) + eventDate
(RANGE).
Мне не очень нравится это решение из-за сложногоработа по синхронизации данных (например, если дата события меняется, мне нужно обновить все записи, относящиеся к этому событию в таблице EventAttendeeds
).
Есть ли другой способделать то, что я пытаюсь достичь?
Имейте в виду, что пользователь может посещать десятки событий.Выполнение фильтрации в памяти тоже не очень хороший вариант.
Спасибо!
РЕДАКТИРОВАТЬ:
Еще один вариант, который пришел мне в голову.Обычно событие не посещают более чем несколько пользователей.Так что я думал об избавлении от «таблицы соединений», которая в базе данных NoSql имела бы больше смысла, я думаю.Проблема с этим во время запроса к БД, когда мне нужно найти события для данного пользователя.Это заставило бы использовать выражение фильтра;что может замедлить запрос.Какие еще варианты у меня есть?Я также думал об использовании Elastic Search для поиска по тексту и т. Д., Поэтому я также подумывал об использовании его для этой цели (поиск событий для данного пользователя за определенный месяц) ... Я бы принес идентификаторы, а затем использовалобычный запрос DynamoDb.Это звучит как излишнее ...