Как управлять миграциями базы данных?
Миграции базы данных — это версионированные изменения схемы БД, которые применяются автоматически при старте приложения через 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.