DynamoDB Изменить диапазон ключевых столбцов

Можно ли изменить столбец Rangekey после создания таблицы. Например, добавление нового столбца/атрибута и назначение в качестве RangeKey для таблицы. Пробовал поиск, но не мог найти статей об изменении диапазона или хэша

Ответ 1

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

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

Изменить (январь 2014 г.): DynamoDB теперь поддерживает глобальные вторичные индексы на лету

Ответ 2

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

Потоки DynamoDB позволяют нам переносить таблицы без простоев. Я сделал это очень эффективно, и следующие шаги:

  1. Создайте новую таблицу (назовем это NewTable) с желаемой структурой ключей, LSI, GSI.
  2. Включить DynamoDB Streams на исходной таблице
  3. Свяжите лямбда-поток с потоком, который помещает запись в NewTable. (Эта лямбда должна обрезать флаг миграции на шаге 5)
  4. [Необязательно] Создайте GSI на исходной таблице, чтобы ускорить сканирование объектов. Убедитесь, что этот GSI имеет только атрибуты: первичный ключ и мигрированный (см. Шаг 5).
  5. Сканируйте GSI, созданный на предыдущем шаге (или всю таблицу), и используйте следующий фильтр:

    FilterExpression = "attribute_not_exists (Migrated)"

Обновите каждый элемент в таблице с помощью флага переноса (т.е. "Migrated": {"S": "0"}, который отправляет его в потоки DynamoDB (используя API UpdateItem, чтобы гарантировать отсутствие потери данных).

ПРИМЕЧАНИЕ. Возможно, вы захотите увеличить единицы емкости записи в таблице во время обновлений.

  1. Лямбда соберет все предметы, обрежет флаг Migrated и вставит его в NewTable.
  2. После переноса всех элементов переназначьте код в новую таблицу.
  3. Удалите оригинальную таблицу, и лямбда-функция однажды довольна, все хорошо.

Выполнение этих шагов должно гарантировать, что у вас нет потери данных и простоя.

Я задокументировал это в своем блоге с помощью кода: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/