Выбор ответа Senior Eloquent, N+1 и миграции обновлено

Миграции без простоя

Вопрос

Нужно переименовать колонку name в full_name в большой таблице, которая используется приложением в продакшене. Как безопаснее?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В несколько релизов: новая колонка, запись в обе, перенос, удаление старой. Во время деплоя старый и новый код работают одновременно (или откат вернёт старый код), а мгновенное переименование ломает одну из версий.

Варианты ответа

  1. В несколько релизов: новая колонка, запись в обе, перенос, удаление старойправильный ответ
  2. Одна миграция renameColumn перед деплоем нового кода, это атомарно
  3. Переименовать вручную на сервере через SQL-клиент, миграции не нужны
  4. Удалить таблицу и создать заново с новой колонкой в одной миграции

Разбор

Во время деплоя старый и новый код работают одновременно (или откат вернёт старый код), а мгновенное переименование ломает одну из версий. Подход «расширить, затем сузить» сохраняет совместимость на каждом шаге. Ручные изменения расходятся с историей миграций, а пересоздание таблицы уничтожит данные. Для больших таблиц ещё учитывают блокировки при ALTER.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.