Как согласовать выкатку кода и миграций, чтобы старая и новая версии работали одновременно?
Во время выкатки в системе одновременно работают старая и новая версии кода, поэтому схема обязана быть совместима с обеими. Отсюда шаблон expand/contract в три фазы. Expand: добавляем новое, ничего не ломая, — новую колонку с умолчанием, новую таблицу, новый индекс; старый код её не видит и продолжает работать. Migrate: новый код пишет и в старое, и в новое место, фоновая задача переносит исторические данные чанками. Contract: когда весь трафик на новой версии и данные перенесены, убираем старое — колонку, таблицу, двойную запись. Ключевые правила порядка: удаление всегда в отдельном релизе после того, как код перестал обращаться к удаляемому; переименование запрещено — это добавление плюс перенос плюс удаление; миграции обратимо совместимы — откат кода не должен требовать отката схемы. Отдельно проверяют блокировки: даже совместимая миграция может остановить таблицу.