#amazon-web-services #amazon-dynamodb #dynamodb-queries
#amazon-web-services #amazon-dynamodb #dynamodb-запросы
Вопрос:
Я пытаюсь обновить элементы в таблице Dynamodb. Но я столкнулся с проблемой, так как я могу обновить несколько строк с одним значением ключа.
Условие:
set isActive=False where systemId='si11'
------------------- ---------- ----------
| id(partition_key) | systemId | isActive |
------------------- ---------- ----------
| 123 | si11 | True |
| 124 | si11 | True |
| 125 | si11 | True |
| 126 | si12 | True |
| 127 | si12 | True |
------------------- ---------- ----------
Итак, как я могу обновить несколько строк с помощью ключа systemId
?
У меня есть решение, но это не лучшая практика.
- Я создам индекс GSI с
ID
(ключом диапазона) иSystemID
(ключом хэша). - Я буду запрашивать данные с помощью системного идентификатора ключа.
- Затем используйте результат для обновления каждой строки с помощью хэш-ключа (
id
).
Пожалуйста, предложите лучшее решение этой проблемы.
У меня есть только systemId
для ключа фильтра, поэтому я могу обновлять только с помощью systemId
и я не могу создать индекс GSI для systemId
, потому что он не уникален.
Ответ №1:
При первой работе в DynamoDB у вас может возникнуть соблазн использовать свои знания базы данных SQL. Я знаю, потому что раньше я делал то же самое. Не делайте этого! DynamoDB не является базой данных SQL, и шаблоны, которые вы используете для реализации функции в SQL, могут отсутствовать в DynamoDB. Этот вариант использования является одним из них.
Итак, как вы можете обновить поле для нескольких элементов в DynamoDB? Из документов AWS:
В DynamoDB вы используете действие updateItem для изменения одного элемента. (Если вы хотите изменить несколько элементов, вы должны использовать несколько операций updateItem.)
Итак, что можно сделать для реализации вашего шаблона доступа? Один из способов — запросить (или отсканировать) вашу таблицу для элементов, которые вы хотите обновить. Затем выполните отдельные updateItem
операции для каждого элемента, установив значение isActive равным ‘false’.
Давайте немного подробнее опишем, как вы могли бы реализовать это с помощью вторичного индекса.
Допустим, вы определяете вторичный индекс с помощью ключа раздела systemId
(GSIPK) и ключа сортировки isActive
(GSISK). Ваша таблица будет выглядеть следующим образом:
и вторичный индекс будет выглядеть следующим образом (те же данные, просто другой вид):
Обратите внимание, что вторичные индексы не имеют ограничения уникальности. Это позволяет очень легко извлекать элементы по systemId
месту isActive
, где true
находится, и т. Д. Отсюда ваше приложение может выполнить несколько updateItem
операций для установки isActive
поля на false
для элементов в базовой таблице.
ЗДЕСЬ ОЧЕНЬ ВАЖНЫЙ МОМЕНТ: вы не можете выполнять запись во вторичный индекс.
Рассмотрите вторичные индексы как еще один способ просмотра ваших данных. Вы определили свой вторичный индекс на основе того, что DynamoDB называет вашей «базовой таблицей», и Dynamo заботится о сохранении этого представления (добавление / удаление элементов). Если вы создаете / обновляете / удаляете элементы в своей базовой таблице, индекс будет обновлен, чтобы отразить новую реальность.
Ответ №2:
Вы должны создать GSI для SystemID.
GSI не обязательно должны быть уникальными;
В таблице DynamoDB каждое ключевое значение должно быть уникальным. Однако значения ключей в глобальном вторичном индексе не обязательно должны быть уникальными.
Я бы сделал GSI с ключом хэша SystemID и, возможно, с ключом диапазона isActive.
Примечание: «ключ сортировки» и «ключ диапазона» означают одно и то же.
Множество других способов создания GSI, в основном зависит от того, используется GSI только для этого шаблона доступа или перегружен для поддержки нескольких.