2017-02-03 2 views
0

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

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

Например, если у меня есть документ, содержащий информацию сотрудника, { "имя": "John Doe", "отдел": "продажа", " date_of_joining": "2017-01-21" }

и мне нужно сделать запрос, как дать мне всех сотрудников, которые присоединились после 01-01-2016, тогда я не могу сделать это с помощью этой схемы. Возможно, я смогу сделать этот запрос после создания вторичного индекса с произвольно сгенерированным ключом раздела (например, 0-99) и создать ключ сортировки на «date_of_joining», затем запросить все разделы и поставить условие «date_of_joining», , Но это слишком сложный способ сделать простой запрос, сделать что-то подобное в MongoDB довольно просто.

Может кто-нибудь помочь с пониманием, есть ли лучший способ делать такие запросы в DynamoDB и является ли DynamoDB действительно подходящим для таких случаев использования?

+0

что-то подобное http://stackoverflow.com/a/34961036/2811189 –

ответ

1

На самом деле ключ раздела GSI не обязательно должен быть уникальным. Вы можете иметь date_of_joining в качестве ключа раздела GSI.

Однако при запросе ключа раздела вы не можете использовать greater than для поля ключа раздела. Для ключа разделов поддерживается только равенство. Я не уверен, почему вы хотели иметь случайное число в качестве ключа раздела GSI и date_of_joining в качестве ключа сортировки. Даже если вы создадите дизайн, я не уверен, что вы сможете использовать DynamicDB Query API для получения ожидаемого результата. Вы можете использовать DynamoDB Scan API, что является дорогостоящей операцией в DynamoDB.

GSI:

date_of_joining - as Partition key 

Поддерживается в Query API: -

Если у вас есть несколько элементов для того же Минюст, результат с несколькими элементов (например, при запросе с помощью GSI).

KeyConditionExpression : 'date_of_joining = :doj' 

Не поддерживается в Query API: -

KeyConditionExpression : 'date_of_joining > :doj' 

Вывод: -

Вы должны использовать DynamoDB Scan. Если вы собираетесь использовать Scan, то GSI может не понадобиться. Вы можете напрямую сканировать основную таблицу, используя FilterExpression.

FilterExpression : 'date_of_joining > :doj' 

Неудобство: -

  • Дорогостоящие

  • Не эффективен

+0

Спасибо за ваш ответ. Причина, по которой я добавляю столбец с номерами 0-99, состоит в том, что, поскольку для запроса требуется значение ключа раздела, я мог бы предоставить значения (0-99). Необходимо будет запустить 100 запросов, но обработка будет хорошо распределена по кластеру. И когда я делаю «date_of_joining» в качестве ключа сортировки, я могу сделать больше и меньше запросов на нем. Пожалуйста, дайте мне знать, если это не так. – Ashish

+0

Кроме того, почему нет возможности сканирования в DynamoDB – Ashish

+0

Сканирование не является хорошим вариантом, так как оно потребляет потери пропускной способности, которые напрямую связаны с затратами. Он неэффективен, поскольку он должен читать все элементы в таблице, а затем применять критерии фильтра для получения результата. Подумайте о производительности и стоимости, если в таблице есть 100K элементов. – notionquest

0

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

+0

Спасибо, Александр. Прямо сейчас мы уже так потеряны с таким количеством баз данных, что мы не хотим добавлять два для одной рабочей нагрузки. – Ashish

Смежные вопросы