DynamoDB перегружен глобальными вторичными индексами - правильно ли я это делаю?
Я пришел из SQL и MongoDB фона, и действительно хочу использовать DynamoDB для нового проекта. До сих пор это было терпимо. Я записываю данные в DynamoDB и использую потоки для магического ввода данных в Elastic Search для поиска. Он делает все, что мне нужно.
Тем не менее, сейчас я нахожусь в точке, где у меня есть данные, которые я хочу иметь возможность более эффективно запрашивать напрямую из DynamoDB.
Затрагиваемые объекты:
- контракты
- Вендоры
- Отчетные периоды
- платежи
Я работаю над своей службой платежей, посредством которой платежи инициируются, обновляются, проверяются и запрашиваются. Платежи создаются со следующими свойствами:
- contractId
- fromVendorId (обнуляемый)
- toVendorId
- reportingPeriodId
- количество
- статус
Используя DynamoDB, я хотел бы иметь возможность делать следующие запросы:
- Получить отчетные периоды по диапазону дат
- Получать платежи по отчетному периоду
- Получать платежи от продавца
- Получать платежи от toVendor
- Получать платежи по статусу
Некоторая комбинация вышеперечисленного (например, "отклоненные платежи от поставщика aaaa-bbbb").
Следуя официальной документации DynamoDB, я пытаюсь настроить перегруженные глобальные вторичные индексы для решения проблемы.
Я не начал настраивать Payments сейчас, потому что это кажется очень странным, но я начал разрабатывать ключи и индексы для reportPeriods просто для того, чтобы я мог освоить его. Вот что у меня сейчас:
Первичный ключ - это id, sort. Я планирую использовать одну и ту же таблицу как для reportPeriods, так и для платежей, потому что документы DynamoDB говорят, что вы можете использовать четко определенную таблицу для всего приложения (я держу свои данные немного более изолированными, чем эта, и использую одну таблицу на микросервис).).
Я признаю, что поддержание актуальности избыточных строк и выполнение запросов по многим полям будут лишними, но при условии, что я в порядке с поддержкой (я все еще сомневаюсь в этом сам)... мой вопрос на самом деле здесь... Я делаю это правильно?
Я предполагаю, что ко всему, что я хочу сделать запрос, мне нужно добавить новые строки с идентификатором и соответствующим полем "сортировка". Например, у нас есть Платеж с идентификатором dddd-eeee, принадлежащий поставщику aaaa-bbbb, со статусом 1. Я предполагаю, что для запроса этого платежа по поставщику и статусу я должен добавить дополнительный элемент со следующими полями:
- id: Payment-aaaa-bbbb
- sort: fromVendorId, status
- значение: aaaa-bbbb,1
Это верно? Что, если я хочу сделать запрос по vendorId + status IN (1,3)?
Если у вас есть опыт работы с Overloading GSI, пожалуйста, просмотрите, что я уже сделал, и дайте мне знать, если я на правильном пути, или если я wayyyyy, wayyyyy, wayyyy off и лучше внести некоторые изменения (быстро) или Я собираюсь облажаться. Какие изменения вы рекомендуете?