Как запросить DynamoDB, используя другой ключ раздела

Моя таблица DynamoDB выглядит так

введите здесь описание изображения

И чего я хочу добиться, так это:

  • Я хочу получить весь товар, который активен у продавца -› который вернет только товар с ID #1 -› Yeezy Boost 380.

Сейчас я могу думать только так:

  1. Получить всех продавцов с активными правдой
  2. Получите продукт с заданными идентификаторами продавца (из шага 1), но для этого требуется 2 запроса.

Есть ли лучший способ справиться с этим? Спасибо!

Примечание:

Прямо сейчас этот микросервис просто делает 2 вещи (шаблоны доступа):

  • Список всех продуктов, зарегистрированных активным продавцом
  • Получите подробную информацию о продукте с акциями

person JimmyJS    schedule 08.02.2021    source источник
comment
То, как ваши данные в настоящее время настроены, ваше предложение имеет смысл. Однако получение активных продавцов и товаров по идентификатору продавца потребует неэффективной операции scan. Лучшим подходом было бы перепроектировать вашу модель данных для поддержки необходимых шаблонов доступа. Трудно предложить, какую модель данных вам следует использовать, поскольку мы не знаем всех ваших шаблонов доступа. Вы можете получить более содержательные ответы, если опишете некоторые из своих моделей доступа к продавцам и продуктам.   -  person Seth Geoghegan    schedule 09.02.2021
comment
Привет @SethGeoghegan, спасибо за ответ. Прямо сейчас эта услуга делает только 2 вещи: - Список всех продуктов, зарегистрированных активным продавцом - Получить информацию о продукте с запасами Надеюсь, вы можете помочь мне с предложением соответствующей модели данных. Благодарю вас!   -  person JimmyJS    schedule 09.02.2021
comment
Привет, @SethGeoghegan, не поможешь мне? потому что я не могу придумать хороший дизайн для поддержки моих шаблонов доступа.   -  person JimmyJS    schedule 11.02.2021
comment
Я вижу, вы используете слово active для описания продавца. Что происходит с продуктами продавцов, когда они больше не активны? Другими словами, есть ли у вас какие-либо модели доступа к продуктам для неактивных продавцов?   -  person Seth Geoghegan    schedule 11.02.2021
comment
@SethGeoghegan сейчас у меня нет шаблонов доступа для неактивного продавца. Мне нужно только получить все товары, которые зарегистрированы активным продавцом   -  person JimmyJS    schedule 15.02.2021


Ответы (2)


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

Взгляните на следующую модель данных:

введите здесь описание изображения

В этом примере я моделирую отношения «один ко многим» между продавцами и продуктами, устанавливая раздел продавца. Каждый продукт существует в разделе продавца.

Я решил смоделировать активных/неактивных продавцов, введя глобальный вторичный индекс для каждого активного продукта. Обратите внимание, что в приведенном выше примере у Джо Смита (SELLER#1) определены атрибуты GSIPK и GSISK, что означает, что продукты Joe Smiths активны и будут отображаться в GSI. GSI будет выглядеть так: введите здесь описание изображения

Если вы хотите искать продукты от активных продавцов, вы должны искать глобальный вторичный индекс. Обратите внимание, что у Джейн Смит (ПРОДАВЕЦ №2) нет товаров в GSI. Это связано с тем, что ни в одном из продуктов Jane Smiths не определены атрибуты GSIPK и GSISK. Поэтому, если вы хотите пометить продавца (или продукты продавца) как активного/неактивного, вам нужно просто добавить/удалить атрибуты GSIPK/GSISK по мере необходимости.

В этом примере пометка продавца как неактивного потребует обновления каждого из продуктов продавца (удаление GSIPK/GSISK). Вы бы сделали это с помощью пакетного вызова для обновления (или удаления) нескольких продуктов. Однако, если это создает узкое место в производительности, вам может понадобиться другой подход.

Вы можете рассмотреть возможность использования атрибута срока жизни (TTL) для неактивных продавцов/продуктов и позвольте DynamoDB удалить просроченные продукты из вашего поиска продуктов. Поскольку TTL не удаляет элементы сразу, вам все равно нужно фильтровать просроченные продукты при поиске.

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

person Seth Geoghegan    schedule 15.02.2021
comment
Привет спасибо за ответ! но у меня есть несколько вопросов: как я могу получить информацию о продукте с запасами (мои 2-е шаблоны доступа) и какова производительность, если у меня есть 1 миллион данных, и я хочу обновить активного продавца до неактивного? потому что мне нужно обновить продукт 1 на 1 или использовать пакетное обновление. есть ли у вас опыт пакетного обновления больших данных? Благодарность! - person JimmyJS; 16.02.2021
comment
Для вашего первого вопроса вы должны добавить информацию о продукте к элементу продукта. Я показал только несколько атрибутов элемента для иллюстрации, но вы, безусловно, можете добавить столько атрибутов, сколько вам нужно. Я обновил свой ответ, чтобы ответить на ваш второй вопрос. Решить проблемы моделирования данных DDB в StackOverflow может быть сложно. Правильные шаблоны потребуют глубокого понимания ваших шаблонов доступа и потребуют нескольких итераций, чтобы получить правильный результат. Хранение продуктов размером 1 мм может потребовать другого подхода, чем хранение 1000 продуктов (например, сегментирование чтения/записи). - person Seth Geoghegan; 16.02.2021

Я не уверен в масштабе ваших данных. Но что, если вы сохраните список идентификаторов продуктов, проданных продавцом, в самой подробной записи продавца.

Нравиться:

seller-1, detail, TRUE, Jimmy, <product-1>  
seller-2, detail, FALSE, Ray, <product-1, product-2>

Таким образом, вы можете иметь GSI в активной колонке, в 1 запросе вы можете получить всех активных продавцов и их продукты. Конечно, вам нужно получить подробную информацию об этих продуктах, используя другие запросы, но это также имеет место в настоящее время.

Кроме того, в этой модели всякий раз, когда вы обновляете продукт с продавцом, вам нужно делать это с помощью транзакции, обновляя запись продавца и продукта вместе.

person dDarkLORD    schedule 11.02.2021