По сути, существует три способа чтения данных из DynamoDB :
GetItem
- извлекает отдельный элемент из таблицы.Это наиболее эффективный способ чтения отдельного элемента, поскольку он обеспечивает прямой доступ к физическому местоположению элемента. Query
- извлекает все элементы, имеющие определенный ключ раздела.Внутри этих элементов вы можете применить условие к ключу сортировки и получить только подмножество данных.Запрос обеспечивает быстрый и эффективный доступ к разделам, в которых хранятся данные. Scan
- извлекает все элементы в указанной таблице.(Эту операцию нельзя использовать с большими таблицами, поскольку она может потреблять большие объемы системных ресурсов.
И все. Как видите, вы всегда должны предпочитать GetItem
(BatchGetItem
)к Query
и Query
- к Scan
.
Вы можете использовать запросы, если добавите ключ сортировки к своим данным. Т.е. вы можете использовать категорию в качестве ключа хешаи название продукта в качестве ключа сортировки, чтобы на странице, отображающей элементы для определенной категории, могли использоваться запросы по этой категории и названию продукта.Но этот дизайн хрупок, так как вам могут потребоваться другие ключи для других страниц, например, вам может понадобитьсязапрос поставщика + цена, если пользователь ищет определенные мобильные телефоны. Индексы могут помочь здесь, но они поставляются со своими собственными компромиссами и ограничениями .
Более того,фильтрация по произвольным выражениям применяется после завершения операции query / scan , но до того, как вы получите результаты, поэтому вы платите за весь запрос / сканирование.как фильтрация данных в приложении, а не на стороне базы данных.
Я бы сказал, что DynamoDB просто не предназначен для многих видов рабочих нагрузок.Возможно, это не подходит для вашего случая тоже.Думайте об этом как о хранилище с большим значением ключа (ключ-объект), а не как о «классической» СУБД, где индексы стоят дешевле и с меньшими ограничениями и которые предоставляют разработчикам богатые возможности запросов.
Там хорошая статья , описывающая потенциальные проблемы с DynamoDB, взгляните.Он содержит потрясающее дерево решений, которое проведет вас через аргументацию DynamoDB.Я вставляю это здесь, но, пожалуйста, обратите внимание, что автором оригинала является Форрест Пьян .
Еще одна статья стоит прочесть.
Наконец, зацените этот короткий ответ на SO о случаях использования и проблемах DynamoDB.
PS Там нет ничегопреступник в выполнении сканов (и я фактически делаю их по расписанию один раз в день в одном из моих проектов), но это исключительный случай, и я сожалею о решении использовать DynamoDB в этом случае.Это не эффективно с точки зрения скорости, денег, поддержки и «грязи».Мне приходилось увеличивать емкость до работы и уменьшать ее после, но это уже другая история ...