Every `up` migration should have a corresponding `down` migration 2. **Separate deployment from migration** — Deploy code that works with both the old and new schema, migrate the database, then deploy code that uses the new schema 3. **Use expand-contract pattern** — First expand the schema (add new