dyanmodb batchGetItem и ключ раздела и ключ сортировки

Я пытался использовать batchGetItem вернуть атрибуты более чем одного элемента из таблицы, но, похоже, он работает только с комбинацией ключа раздела и ключа диапазона, но что, если я хочу идентифицировать запрошенные элементы только по первичному ключу? единственный способ создать таблицу без ключа диапазона?

    // Adding items
$client->putItem(array(
'TableName' => $table,
'Item' => array(
'id'     => array('S' => '2a49ab04b1534574e578a08b8f9d7441'),
'name'   => array('S' => 'test1'),
'user_name'   => array('S' => 'aaa.bbb')
)
));

// Adding items
$client->putItem(array(
'TableName' => $table,
'Item' => array(
'id'     => array('S' => '4fd70b72cc21fab4f745a6073326234d'),
'name'   => array('S' => 'test2'),
'user_name'   => array('S' => 'aaaa.bbbb'),
'user_name1'   => array('S' => 'aaaaa.bbbbb')
)
));

$client->batchGetItem(array(
"RequestItems" => array(
$table => array(
"Keys" => array(
// hash key
array(
"id"  => array( 'S' => "2a49ab04b1534574e578a08b8f9d7441"),
// range key
"name" => array( 'S' => "test1"),
),
array(
// hash key
"id"  => array( 'S' => "4fd70b72cc21fab4f745a6073326234d"),
// range key
"name" => array( 'S' => "test2"),
),
)
)
)
));

Согласно официальной документации:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html

Если таблица имеет составной первичный ключ (ключ раздела и ключ сортировки),
DynamoDB вычисляет значение хеш-ключа ключа в том же
как описано в разделе «Распределение данных: ключ раздела», но в нем хранятся все
предметов с одинаковым значением ключа раздела физически близко
вместе, упорядоченный по значению ключа сортировки.

Какие преимущества использования Partition Key and Sort Key кроме него хранятся все элементы с одинаковым значением ключа раздела физически близко друг к другу?

Согласно официальной документации:

Одна операция может извлечь до 16 МБ данных, которые могут содержать
целых 100 предметов. BatchGetItem вернет частичный результат, если
превышен предел размера ответа, таблица подготовлена
превышена пропускная способность или произошла внутренняя ошибка обработки.

Как обработать запрос, если мне нужно более 100 наименований? просто переберите все элементы кода и каждый раз запрашивайте 100 раз, или есть другой способ достичь этого с помощью AWS SDK DynamoDB?

Пример создания таблицы:

$client->createTable(array(
'TableName' => $table,
'AttributeDefinitions' => array(
array(
'AttributeName' => 'id',
'AttributeType' => 'N'
),
array(
'AttributeName' => 'name',
'AttributeType' => 'S'
)
),
'KeySchema' => array(
array(
'AttributeName' => 'id',
'KeyType'       => 'HASH'
),
array(
'AttributeName' => 'name',
'KeyType'       => 'RANGE'
)
),
'ProvisionedThroughput' => array(
'ReadCapacityUnits'  => 5,
'WriteCapacityUnits' => 5
)
));

Спасибо

ОБНОВЛЕНИЕ — Вопрос к Марку Б ответ:

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

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

An uncaught Exception was encountered

Type:        Aws\DynamoDb\Exception\DynamoDbException
Message:     Error executing "BatchGetItem" on "https://dynamodb.eu-central-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response:
{"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema" (truncated...)
ValidationException (client): The provided key element does not match the schema - {"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema"}
Filename:    /var/app/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php

0

Решение

но что делать, если я хочу идентифицировать запрашиваемые элементы только по основным
ключ? единственный способ создать таблицу без ключа диапазона?

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

Каковы преимущества использования ключа разделения и ключа сортировки рядом с ним
хранит все элементы с одинаковым значением ключа раздела физически
близко друг к другу ?

Объединенные два поля — ваш первичный ключ, который гарантирует уникальность. Ключ диапазона / сортировки также определяет порядок, в котором возвращаются результаты.

Как обработать запрос, если мне нужно более 100 наименований?

Из документации (выделено мое):

Максимальное количество атрибутов элемента, которое можно получить для
одна операция — 100. Кроме того, количество найденных элементов
ограничен размером в 1 МБ. Если ограничение размера ответа
превышен или возвращен частичный результат из-за внутренней обработки
сбой, Amazon DynamoDB возвращает значение UnprocessedKeys так что вы можете
повторите операцию, начиная со следующего элемента, чтобы получить.

Например, даже если вы попросите получить 100 предметов, но каждый
размер отдельного элемента 50 КБ, система возвращает 20 элементов и
подходящее UnprocessedKeys значение, чтобы вы могли получить следующую страницу
Результаты. При необходимости вашему приложению нужна своя логика
собрать страницы результатов в один набор
.

Так что вам нужно будет проверить UnprocessedKeys значение результата и продолжайте делать запросы в вашем приложении, пока не будет больше UnprocessedKeys,

1

Другие решения

Вы задали много вопросов, поэтому я постараюсь разбить их. (Извините, я не могу ответить на вопрос с помощью фрагментов кода php)

Я пытался использовать batchGetItem, чтобы вернуть атрибуты более чем одного элемента
из таблицы, но, кажется, это работает только с комбинацией
ключ раздела и ключ диапазона, но что, если я хочу определить
Запрашиваемые товары только по первичному ключу? это единственный способ создать
таблица без ключа диапазона?

BatchGetItem совпадает с несколькими вызовами GetItem. По сути, получить ноль или один элементы с каждым вызовом GetItem.
Вы даете ему уникальный ключ для элемента, который вы хотите получить (первичный ключ). Если в вашей таблице есть только ключ раздела, то это все, что вы укажете, в противном случае — ключ раздела и диапазона.
BatchGetItem пакетирует вызовы GetItem в одном запросе к DynamoDB.

Если вы хотите запросить несколько элементов для данного ключа раздела, вы можете посмотреть на API запросов.

Каковы преимущества использования ключа разделения и ключа сортировки рядом с ним
хранит все элементы с одинаковым значением ключа раздела физически
близко друг к другу ?

Это сложный вопрос, поскольку он сильно зависит от уникального ключа вашей модели данных.

Некоторые преимущества, которые приходят на ум:
1. Ключи сортировки позволяют сортировать данные по этому атрибуту (в порядке возрастания или убывания).
2. У ключей сортировки больше операций сравнения (т. Е. «Больше, чем», «Между», «Начинается с» и т. Д.). Увидеть документы

Как обработать запрос, если мне нужно более 100 наименований? просто петля
через все элементы из кода и запрашивать каждый раз 100 раз или
Есть ли другой способ добиться этого с помощью AWS SDK DynamoDB?

Если вы запросите более 100 элементов, BatchGetItem вернет исключение ValidationException с сообщением «Слишком много элементов запрошено для вызова BatchGetItem». Вам нужно будет перебирать предметы по 100 штук за раз, чтобы получить все нужные предметы. Имейте в виду, что также существует ограничение размера в 16 МБ, что означает, что если какие-либо элементы не обработаны, они будут возвращены в ответе под заголовком «UnprocessedItems».

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

это документация объясняет, как его использовать.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector