Data

Database migrations that teams are not afraid to run

Expand-contract patterns, backward-compatible steps, and reversible changes keep delivery steady. We treat schema changes like API versions: additive first, destructive later.

Big-bang migrations fail in production because reality differs from staging. We prefer many small steps: add nullable columns, backfill in batches, switch readers, then drop old paths once traffic proves the new path.

Long locks and blocking DDL are scheduled and measured, not assumed harmless. When downtime is unavoidable, we communicate windows and rehearse rollback.

Good migration hygiene includes idempotent scripts, clear ownership, and tests that fail if someone applies steps out of order.