Выбор ответа Senior Eloquent, N+1 и миграции обновлено
Миграции без простоя
Вопрос
Нужно переименовать колонку name в full_name в большой таблице, которая используется приложением в продакшене. Как безопаснее?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В несколько релизов: новая колонка, запись в обе, перенос, удаление старой. Во время деплоя старый и новый код работают одновременно (или откат вернёт старый код), а мгновенное переименование ломает одну из версий.
Варианты ответа
- В несколько релизов: новая колонка, запись в обе, перенос, удаление старойправильный ответ
- Одна миграция
renameColumnперед деплоем нового кода, это атомарно - Переименовать вручную на сервере через SQL-клиент, миграции не нужны
- Удалить таблицу и создать заново с новой колонкой в одной миграции
Разбор
Во время деплоя старый и новый код работают одновременно (или откат вернёт старый код), а мгновенное переименование ломает одну из версий. Подход «расширить, затем сузить» сохраняет совместимость на каждом шаге. Ручные изменения расходятся с историей миграций, а пересоздание таблицы уничтожит данные. Для больших таблиц ещё учитывают блокировки при ALTER.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.