Với hệ đang chạy, migration không tương thích ngược 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 khoá 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 xoá cột/ràng buộc cũ.
Lưu ý:
- Tránh thao tác khoá 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.