Что такое миграция базы данных (Database Migration)?

«Что такое миграция базы данных (Database Migration)?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Миграция базы данных — это практика управления изменениями схемы БД (структуры таблиц, индексов, данных) с помощью версионируемых и обратимых скриптов. Это позволяет безопасно и согласованно применять изменения в различных окружениях (разработка, тестирование, продакшн).

Ключевые концепции:

  • Версионирование: Каждая миграция имеет уникальный идентификатор (обычно временная метка или последовательный номер), что позволяет точно знать, какое состояние у БД.
  • Повторяемость: Скрипт миграции должен быть идемпотентным или работать в рамках системы, которая отслеживает применённые миграции, чтобы их нельзя было применить дважды.
  • Обратимость: У каждой миграции есть методы up (применить изменение) и down (откатить изменение). Это критически важно для отладки и отката неудачных релизов.

Пример миграции для создания таблицы в Laravel:

// database/migrations/2023_10_27_000001_create_users_table.php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

return new class extends Migration
{
    // Метод для применения миграции
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // Первичный ключ bigint unsigned, auto_increment
            $table->string('name', 100); // VARCHAR(100)
            $table->string('email')->unique(); // VARCHAR(255) с уникальным индексом
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken(); // Для системы "запомнить меня"
            $table->timestamps(); // Создаёт created_at и updated_at (TIMESTAMP)
        });

        // Можно добавить отдельные индексы или ограничения
        // Schema::table('users', function (Blueprint $table) {
        //     $table->index(['name', 'email']);
        // });
    }

    // Метод для отката миграции
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

Рабочий процесс и инструменты:

  1. Создание: php artisan make:migration create_users_table.
  2. Запуск: php artisan migrate — применяет все неприменённые миграции.
  3. Откат: php artisan migrate:rollback — откатывает последний пакет миграций.
  4. Статус: php artisan migrate:status — показывает, какие миграции применены.

Интеграция в CI/CD: Миграции автоматически выполняются в пайплайне сборки или деплоя, что гарантирует, что схема БД в продакшене всегда соответствует требованиям кода. Это устраняет ручные правки SQL и связанные с ними человеческие ошибки.