Можно ли изменить столбец Rangekey после создания таблицы. Например, добавление нового столбца/атрибута и назначение в качестве RangeKey для таблицы. Пробовал поиск, но не мог найти статей об изменении диапазона или хэша
DynamoDB Изменить диапазон ключевых столбцов
Ответ 1
Нет, к сожалению, невозможно изменить хэш-ключ, клавишу диапазона или индексы после создания таблицы в DynamoDB. Документация DynamoDB UpdateItem
API ясно говорит о том, что индексы не могут быть изменены. Я не могу найти ссылку нигде в документах, в которых явно указано, что ключи таблицы не могут быть изменены, но в настоящее время они не могут быть изменены.
Обратите внимание, что DynamoDB отличается от схемы, отличной от хэша и диапазона, и вы можете добавлять другие атрибуты к новым элементам без проблем. К сожалению, если вам нужно изменить либо хэш-ключ, либо клавишу диапазона, вам нужно будет создать новую таблицу и перенести данные.
Изменить (январь 2014 г.): DynamoDB теперь поддерживает глобальные вторичные индексы на лету
Ответ 2
Чтобы изменить или создать дополнительный ключ сортировки, вам нужно будет создать новую таблицу и перенастроить ее, поскольку оба действия не могут быть выполнены для существующих таблиц.
Потоки DynamoDB позволяют нам переносить таблицы без простоев. Я сделал это очень эффективно, и следующие шаги:
- Создайте новую таблицу (назовем это NewTable) с желаемой структурой ключей, LSI, GSI.
- Включить DynamoDB Streams на исходной таблице
- Свяжите лямбда-поток с потоком, который помещает запись в NewTable. (Эта лямбда должна обрезать флаг миграции на шаге 5)
- [Необязательно] Создайте GSI на исходной таблице, чтобы ускорить сканирование объектов. Убедитесь, что этот GSI имеет только атрибуты: первичный ключ и мигрированный (см. Шаг 5).
-
Сканируйте GSI, созданный на предыдущем шаге (или всю таблицу), и используйте следующий фильтр:
FilterExpression = "attribute_not_exists (Migrated)"
Обновите каждый элемент в таблице с помощью флага переноса (т.е. "Migrated": {"S": "0"}, который отправляет его в потоки DynamoDB (используя API UpdateItem, чтобы гарантировать отсутствие потери данных).
ПРИМЕЧАНИЕ. Возможно, вы захотите увеличить единицы емкости записи в таблице во время обновлений.
- Лямбда соберет все предметы, обрежет флаг Migrated и вставит его в NewTable.
- После переноса всех элементов переназначьте код в новую таблицу.
- Удалите оригинальную таблицу, и лямбда-функция однажды довольна, все хорошо.
Выполнение этих шагов должно гарантировать, что у вас нет потери данных и простоя.
Я задокументировал это в своем блоге с помощью кода: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/