Gymterview
junior

Как управлять миграциями базы данных?

Миграции базы данных — это версионированные изменения схемы БД, которые применяются автоматически при старте приложения через Flyway или Liquibase.

Аналогия из жизни: миграции БД похожи на историю коммитов в Git, но для структуры базы данных. Каждая миграция — это “коммит”, который невозможно изменить после применения.

Пример Flyway-миграции

SQL-миграции
-- V1__create_orders_table.sql
CREATE TABLE orders (
    id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    customer_id UUID         NOT NULL,
    status      VARCHAR(20)  NOT NULL DEFAULT 'CREATED',
    total_amount DECIMAL(19,2) NOT NULL DEFAULT 0,
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    version     BIGINT       NOT NULL DEFAULT 0,
    CONSTRAINT chk_status CHECK (status IN ('CREATED','CONFIRMED','SHIPPED','DELIVERED','CANCELLED'))
);

CREATE INDEX idx_orders_customer_id ON orders(customer_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_orders_created_at ON orders(created_at);

-- V2__create_order_items_table.sql
CREATE TABLE order_items (
    id         UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    order_id   UUID NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
    product_id UUID NOT NULL,
    quantity   INTEGER NOT NULL CHECK (quantity > 0),
    price      DECIMAL(19,2) NOT NULL CHECK (price >= 0),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX idx_order_items_order_id ON order_items(order_id);

Конфигурация

Пример
spring:
  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true
    validate-on-migrate: true

Flyway vs Liquibase

Критерий Flyway Liquibase
Формат SQL-файлы XML / YAML / SQL
Rollback Ручной (отдельная миграция) Автоматический
Сложность Простой Больше возможностей
Популярность Лидер для Java-проектов Enterprise с XML-стеком

PostgreSQL — почему стандарт де-факто

PostgreSQL доминирует в Java-экосистеме благодаря: полная поддержка ACID, расширенные типы данных (JSONB, UUID, ARRAY), полнотекстовый поиск без внешних систем, надёжные managed-сервисы (AWS RDS, GCP Cloud SQL, Neon).

Пример
-- Использование JSONB для гибких атрибутов
ALTER TABLE orders ADD COLUMN metadata JSONB DEFAULT '{}';
CREATE INDEX idx_orders_metadata ON orders USING GIN (metadata);

Частые ошибки

  • ddl-auto=update в production — непредсказуемые изменения схемы
  • Отсутствие индексов для часто используемых запросов
  • Изменение уже применённых миграций — нарушает контрольную сумму

На собеседовании: ключевое: “Миграции только через Flyway/Liquibase, никогда через ddl-auto=update в production”. Если спросят про выбор между Flyway и Liquibase — Flyway проще и популярнее, Liquibase даёт автоматический rollback и XML-формат для enterprise.