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 и лучше внести некоторые изменения (быстро) или Я собираюсь облажаться. Какие изменения вы рекомендуете?

0 ответов