Фон
Мне нужно создать таблицу для хранения объявлений в DynamoDB. Каждое объявление имеет следующую структуру:
{
"announcementId": "(For the frontend to identify an announcement to the backend)",
"author": "(id of author)",
"displayStartDatetime": "",
"displayEndDatetime": "",
"title": "",
"description": "",
"image": "(A url to an image)",
"link": "(A single url to another page)"
}
Поскольку мы все еще разрабатываем таблицу, изменения в структуре разрешены. В частности, можно изменить announcementId
, displayStartDatetime
и displayEndDatetime
.
Основной шаблон доступа - найти текущие объявления. У пользователей есть веб-страница, на которой они могут видеть все текущие объявления и их детали.
У каждого объявления есть дата, когда его показывать (displayStartDatetime
), а когда прекращать (displayEndDatetime
). Объявление должно оставаться в таблице после того, как текущее datetime прошло displayEndDatetime
для справки для администраторов.
Дата начала и время окончания указаны с точностью до минуты.
Проблема
В идеале я хотел бы запросить таблицу для всех текущих объявлений в одном запросе.
Однако я пришел к выводу, что невозможно объединить два времени даты в один ключ сортировки потому что невозможно заказать два одинаковых по важности фрагмента данных (например, сохранение временных меток в виде строки будет означать, что один будет более важным / большим, чем другой).
Следовательно, в качестве компромисса я хотел бы чтобы отсортировать значения таблицы по displayEndDatetime
, чтобы можно было отфильтровать прошлые объявления. Это связано с тем, что со временем прошлых анонсов будет больше, чем будущих, поэтому будет выгоднее оптимизировать это.
Скомпрометированное решение
В настоящее время мой (не очень хорошо ) решениями являются:
- Используйте один «горячий» ключ раздела и
displayEndDatetime
в качестве ключа сортировки.
Это позволяет мне отфильтровать прошлые объявления, но это также означает, что все данные находятся в одном разделе. Время от времени я мог запускать запланированное задание, чтобы переместить прошлые объявления в другие разделенные разделы.
Scan
через таблицу
Я считаю, что Scan
будет проверять каждый элемент в таблице, прежде чем выполнять какую-либо фильтрацию. Это решение не так хорошо, как 1., но его было бы проще всего реализовать, и оно позволило бы мне сохранить announcementId
в качестве ключа раздела.
Scan
GSI таблицы
Поскольку Scan
просматривает каждый элемент, может быть более эффективным создать GSI (announcementId (PK), displayEndDatetime (SK)
) и сканировать его, чтобы получить все announcementId
ы, которые не прошли. После этого можно было сделать еще один запрос для получения всех объявлений.
Вопрос
Какое наиболее оптимизированное решение для хранения всех объявлений и последующего поиска текущих объявлений при использовании DynamoDB?
Хотя я перечислил несколько возможных решений для сортировки displayEndDatetime
, главное по-прежнему находить объявления между датой начала и окончания.
Изменить
Вот ответы на @ Вопросы tugberk на заднем плане:
- Какую скорость записи вы ожидаете получить (т.е. пиковое количество операций записи в секунду, которое вам необходимо обработать)?
Я не уверен, как админы будут использовать эту систему, объявления могут быть очень регулярными (около 3 в день) или очень нечастыми (около 3 в месяц).
- Сколько новых данных вы планируете хранить ежедневно и как вы думаете, это будет расти?
Как упоминалось выше, это может быть примерно 3 объявления в день или 3 объявления в месяц. Скорее всего, это будет оставаться неизменным столько, сколько меня беспокоит.
- Какова скорость чтения (например, пиковое чтение в секунду)?
I можно ожидать, что пиковое количество чтений в секунду будет около 500-1000 чтений / с. Ожидается, что это число будет расти по мере увеличения количества пользователей.
- Сколько объявлений пользователь может видеть одновременно (т.е. какое среднее / максимальное количество объявлений будет видно в любой момент времени)? С практической точки зрения, это не должно быть больше нескольких (например, 10-20 максимум).
Я ожидаю, что максимальное количество объявлений, доступных для просмотра, будет до 30-40. Это связано с тем, что наряду с краткосрочными объявлениями может быть несколько долгосрочных объявлений. В среднем, я ожидаю около 5-10 объявлений. 1 минута задержки при отображении и скрытии объявлений)?
Я думаю, что скорость, с которой начинается показ объявления, важна, особенно если администраторы решат, что это хорошая платформа для срочных объявлений (вероятно, срочно с точностью до минуты ). Однако, когда оно перестает отображаться, менее важно, но чтобы не сбивать с толку пользователей, объявление должно прекращать отображение не позднее, чем через 4 часа после того, как истечет время окончания его отображения.