DynamoDB перегружен глобальными вторичными индексами - правильно ли я это делаю? - PullRequest
0 голосов
/ 23 мая 2018

Я пришел из SQL и MongoDB, и очень хочу использовать DynamoDB для нового проекта.Пока это было терпимо.Я записываю данные в DynamoDB и использую потоки для магического ввода моих данных в Elastic Search для поиска.Он делает все, что мне нужно.

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

Затрагиваемые объекты:

  • Контракты
  • Поставщики
  • Отчетные периоды
  • Платежи

Я работаю надмой платежный сервис, с помощью которого осуществляются, обновляются, проверяются и запрашиваются платежи.Платежи создаются со следующими свойствами:

  • contractId
  • fromVendorId (обнуляемый)
  • toVendorId
  • reportPeriodId
  • сумма
  • status

Используя DynamoDB, я хотел бы иметь возможность сделать следующие запросы:

  • Получить отчетные периоды по диапазону дат
  • Получать платежи по отчетному периоду
  • Получать платежи от продавца
  • Получать платежи от продавца
  • Получать платежи по статусу

Некоторая комбинация вышеперечисленного(например, «отклоненные платежи от поставщика 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)?

Если у вас есть опыт работы с перегрузкой GSI, просмотрите, что я уже сделал, и дайте мне знать, если я нахожусь наПравильный трек, или если я wayyyyy, wayyyyy, wayyyy выключен и лучше внесите некоторые изменения (быстро), или я собираюсь облажаться.Какие изменения вы рекомендуете?

...