Với hệ đang chạy, migration phá vỡ tương thích sẽ làm chết code cũ đang deploy chung. Kỹ thuật chuẩn là expand–contract (parallel change), triển khai theo bước tương thích ngược:
1. Expand: thêm cấu trúc mới không phá cũ — thêm cột/bảng nullable, có default; thêm index dạng non-blocking (CREATE INDEX CONCURRENTLY trong Postgres).
2. Backfill: chép/điền dữ liệu sang cấu trúc mới theo lô nhỏ để không khóa lâu.
3. Migrate app: deploy code ghi/đọc cả hai (dual-write), rồi chuyển dần sang đọc cột mới.
4. Contract: khi không còn code dùng cột cũ → mới xóa cột/ràng buộc cũ.
Lưu ý:
- Tránh thao tác khóa lâu: đổi kiểu cột, thêm NOT NULL/FK trực tiếp trên bảng lớn → tách thành các bước an toàn.
- Đảm bảo code N và N+1 chạy được song song (deploy cuốn chiếu).
- Migration phải idempotent và có kế hoạch rollback.