Можем ли мы избежать сканирования в DynamodB - PullRequest
0 голосов
/ 01 декабря 2018

Я новичок в моделировании данных noSQL, поэтому извините, если мой вопрос тривиален.Один совет, который я нашел в DynamodB, всегда указывает «PartitionId», а в противном случае он просканирует всю таблицу.Но могут быть случаи, когда нам нужно перечислить наши товары, например, в случае веб-сайта ecom, где нам нужно перечислить наши продукты на странице списка (с нумерацией страниц).

Как мы должны выполнить этот список, избегая сканирования или эффективно использовать?

1 Ответ

0 голосов
/ 02 декабря 2018

По сути, существует три способа чтения данных из DynamoDB :

  • GetItem - извлекает отдельный элемент из таблицы.Это наиболее эффективный способ чтения отдельного элемента, поскольку он обеспечивает прямой доступ к физическому местоположению элемента.
  • Query - извлекает все элементы, имеющие определенный ключ раздела.Внутри этих элементов вы можете применить условие к ключу сортировки и получить только подмножество данных.Запрос обеспечивает быстрый и эффективный доступ к разделам, в которых хранятся данные.
  • Scan - извлекает все элементы в указанной таблице.(Эту операцию нельзя использовать с большими таблицами, поскольку она может потреблять большие объемы системных ресурсов.

И все. Как видите, вы всегда должны предпочитать GetItem (BatchGetItemQuery и Query - к Scan.

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

Более того,фильтрация по произвольным выражениям применяется после завершения операции query / scan , но до того, как вы получите результаты, поэтому вы платите за весь запрос / сканирование.как фильтрация данных в приложении, а не на стороне базы данных.

Я бы сказал, что DynamoDB просто не предназначен для многих видов рабочих нагрузок.Возможно, это не подходит для вашего случая тоже.Думайте об этом как о хранилище с большим значением ключа (ключ-объект), а не как о «классической» СУБД, где индексы стоят дешевле и с меньшими ограничениями и которые предоставляют разработчикам богатые возможности запросов.

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

enter image description here

Еще одна статья стоит прочесть.

Наконец, зацените этот короткий ответ на SO о случаях использования и проблемах DynamoDB.

PS Там нет ничегопреступник в выполнении сканов (и я фактически делаю их по расписанию один раз в день в одном из моих проектов), но это исключительный случай, и я сожалею о решении использовать DynamoDB в этом случае.Это не эффективно с точки зрения скорости, денег, поддержки и «грязи».Мне приходилось увеличивать емкость до работы и уменьшать ее после, но это уже другая история ...

...