Schema changes can lock tables and cause outages. Use expand-contract pattern for safety.
Expand phase:
Add new column (nullable or with default)
Deploy code that writes to both columns
Backfill existing data
Contract phase:
Deploy code that reads from new column only
Drop old column
Rules:
- Never rename columns directly
- Never add NOT NULL without default
- Small batches for backfills