Получение значений из DynamoDB

Я только начал изучать DynamoDB от Amazon. Очевидно, масштабируемость привлекает, но я пытаюсь выйти из режима SQL и перейти в режим без SQL. Можно ли это сделать (при всех преимуществах масштабируемости Dynamodb):

Имейте множество записей (скажем, 5-10 миллионов), проиндексированных по некоторому числу. Одно из полей в каждой записи будет датой создания. Есть ли эффективный способ для Dynamo DB предоставить моему веб-приложению все записи, созданные между двумя датами?

Более простой вопрос - может ли Dynamo db дать мне все записи, в которых поле соответствует определенному числу. То есть будет еще одно поле, которое является числом, для аргумента скажем, от 0 до 10. Могу ли я попросить Dynamodb предоставить мне все записи, которые имеют значение, например. 6?

Нужны ли обоим этим запросам сканирование всего набора данных (что, как я полагаю, является проблемой, учитывая размер набора данных?)

огромное спасибо


person Stuart    schedule 06.02.2012    source источник


Ответы (1)


Есть ли эффективный способ для Dynamo DB предоставить моему веб-приложению все записи, созданные между двумя датами?

Да, взгляните на концепцию Primary Key. в Модель данных Amazon DynamoDB, в частности Первичный ключ типа хэша и диапазона:

В этом случае первичный ключ состоит из двух атрибутов. Первый атрибут — это атрибут хэша, а второй — атрибут диапазона. Amazon DynamoDB строит неупорядоченный хэш-индекс на основе атрибута первичного ключа хэша и отсортированный индекс диапазона на основе атрибута первичного ключа диапазона. [...]

Перечисленные примеры точно соответствуют вашему варианту использования, а именно таблица Reply ( Id, ReplyDateTime, ... ) упрощает первичный ключ типа Hash and Range с хеш-атрибутом < em>Id и атрибут диапазона ReplyDateTime.

Вы будете использовать это через Query API, см. RangeKeyCondition для получения подробной информации и запросов к таблицам в Amazon DynamoDB для соответствующих примеров. .

Может ли Dynamo DB дать мне все записи, в которых поле соответствует определенному числу. [...] Могу ли я попросить Dynamodb предоставить мне все записи, которые имеют значение, например. 6?

Это также возможно, но только с помощью API Scan ( т. е. действительно требует чтения каждого элемента в таблице), см. подробности в ScanFilter и Сканирование таблиц в Amazon DynamoDB для соответствующих примеров.

Нужны ли обоим этим запросам сканирование всего набора данных (что, как я полагаю, является проблемой, учитывая размер набора данных?)

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

Чтобы сократить время отклика, создайте свои таблицы таким образом, чтобы вместо них можно было использовать API-интерфейсы Query, Get или BatchGetItem. Или спроектируйте свое приложение для использования операций сканирования таким образом, чтобы свести к минимуму влияние на скорость запросов вашей таблицы. Дополнительные сведения см. в разделе рекомендации по выделенной пропускной способности в Amazon DynamoDB.

Таким образом, как обычно при применении решений NoSQL, вам может потребоваться скорректировать архитектуру, чтобы учесть эти ограничения.

person Steffen Opel    schedule 06.02.2012
comment
Спасибо - по сути, вы можете выбрать два значения для эффективного запроса через первичный ключ. Если вам нужно запросить более двух значений, вы должны просмотреть все записи? - person Stuart; 07.02.2012
comment
@Stuart: Это правильно в целом, и в частности в отношении вашего очевидного варианта использования. Как обычно, в конечном итоге детали могут быть немного сложнее, и я расширил ответ ссылками на соответствующую документацию; в частности, концепция Предоставленная пропускная способность в DynamoDB, хотя и приветствуется во многих реальных сценариях, не позволяет заранее легко рассчитать последствия затрат и производительности для конкретной структуры таблицы. - person Steffen Opel; 07.02.2012
comment
Это еще один вариант использования поддерживаемого Dynamodb запроса к первичным ключам, чтобы получить набор данных в память вашего веб-приложения, а затем использовать (в нашем случае python) для фильтрации этих данных. Это, очевидно, займет много памяти в веб-приложении, но не потребует многократных проходов по данным в dynamodb (здесь я также думаю о стоимости). - person Stuart; 07.02.2012
comment
Стоит добавить, что теперь вы можете создавать вторичные индексы в DynamoDB. - person jarmod; 10.05.2013
comment
@jarmod — локальные вторичные индексы – очень полезное дополнение к Модель запросов DynamoDB всегда стоит рассмотреть в будущем, однако обратите внимание, что local является важным ограничением: Локальный вторичный индекс — это структура данных, которая поддерживает альтернативный ключ диапазона для заданного хэша. ключ - хотя это охватывает многие сценарии реального мира, оно не применяется к произвольным запросам поля, не являющимся первичным ключом, например, к рассматриваемому вопросу. - person Steffen Opel; 10.05.2013
comment
Стоит отметить, что AWS только что объявила об общедоступности Глобальные вторичные индексы для Amazon DynamoDB, дополняющие существующие Локальные вторичные индексы — в предыдущем сообщении в блоге содержится более подробная информация о выборе между этими двумя моделями. - person Steffen Opel; 13.12.2013