Bạn đã bao giờ rơi vào tình cảnh "toát mồ hôi hột" khi lỡ tay chạy một lệnh SQL trực tiếp trên database thật (production) và nhận ra mình vừa làm mất tiêu một cột quan trọng chưa? Hay đơn giản hơn, khi làm việc nhóm, bạn thêm một bảng mới nhưng đồng nghiệp chạy code lại bị lỗi vì database của họ chưa kịp cập nhật? Đó chính là lúc bạn cần đến Database Migration — người hùng thầm lặng giúp quản lý cấu trúc dữ liệu một cách chuyên nghiệp.
Thực tế, Database Migration (di trú dữ liệu) giống như một hệ thống Git dành riêng cho cơ sở dữ liệu của bạn. Thay vì sửa bảng bằng tay, bạn viết các đoạn mã lệnh để mô tả sự thay đổi. Khi dùng kết hợp với các công cụ như Prisma ORM, việc quản lý này trở nên nhàn hạ hơn bao giờ hết.
1. Database Migration thực sự là cái quái gì?
Hãy tưởng tượng dự án của bạn là một tòa nhà. Database là nền móng, còn Migration chính là bản thiết kế chi tiết cho từng giai đoạn thi công. Thay vì cứ thế mà đập đi xây lại mỗi khi muốn thêm một căn phòng, bạn ghi lại nhật ký: "Ngày 1: Thêm phòng khách", "Ngày 2: Nâng cấp cửa sổ".

Mỗi file Migration là một tệp tin chứa các lệnh SQL (hoặc code JavaScript/TypeScript) để thực hiện một thay đổi cụ thể. Điểm hay ở chỗ, bạn có thể chuyển đổi qua lại giữa các phiên bản database chỉ bằng một câu lệnh. Điều này cực kỳ quan trọng để đảm bảo database ở máy bạn, máy đồng nghiệp và máy chủ thật luôn khớp nhau 100%.
Nếu bạn đã biết cách PostgreSQL Index giúp tăng tốc query, thì Migration chính là cách bạn triển khai những Index đó lên hệ thống một cách an toàn nhất.
2. Tại sao phải khổ sở viết Migration thay vì sửa trực tiếp?
Nhiều bạn mới làm backend thường có thói quen dùng các công cụ giao diện (GUI) như pgAdmin hay TablePlus để nhấn chuột cho nhanh. Nhưng tin mình đi, thói quen này sớm muộn cũng dẫn tới "thảm họa". Đây là 3 lý do bạn nên bỏ ngay việc sửa tay:
- Lưu vết lịch sử: Bạn biết ai đã thêm cột
user_phone, thêm vào lúc nào và tại sao. Không còn cảnh cả team nhìn nhau ngơ ngác hỏi: "Ai sửa database đấy?". - Khả năng Rollback (quay xe): Nếu lỡ tay thêm một ràng buộc (constraint) làm lỗi logic toàn hệ thống, bạn chỉ cần chạy lệnh
downđể quay về trạng thái cũ trong tích tắc. - Tự động hóa hoàn toàn: Khi deploy lên server, bạn không cần phải đăng nhập vào database để gõ lệnh. Các công cụ CI/CD sẽ tự động chạy Migration cho bạn.
Khi kết hợp với các bộ quy chuẩn như Prisma Migrate, bạn thậm chí không cần viết SQL thuần. Bạn chỉ cần sửa file schema và công cụ sẽ tự "phán" ra file Migration cho bạn.
3. Quy trình "chuẩn chỉnh" để lên đời dữ liệu
Làm việc với Migration không khó, cái khó là làm sao để không gây gián đoạn (downtime) cho người dùng. Thông thường, một quy trình chuẩn sẽ bao gồm các bước:
- Tạo file Migration: Viết code mô tả sự thay đổi (thêm bảng, đổi tên cột, tạo index).
- Chạy thử ở local: Đảm bảo file Migration hoạt động đúng trên máy cá nhân.
- Review mã nguồn: Đồng nghiệp sẽ kiểm tra xem lệnh của bạn có gây chậm database không (ví dụ thêm cột lớn vào bảng có hàng triệu dòng).
- Apply lên production: Chạy lệnh cập nhật trên server thật.
// Ví dụ một đoạn Migration đơn giản dùng Knex.js
exports.up = function(knex) {
return knex.schema.createTable('products', (table) => {
table.increments('id');
table.string('name').notNullable();
table.decimal('price', 14, 2);
table.timestamps(true, true);
});
};
exports.down = function(knex) {
return knex.schema.dropTable('products');
};
Mẹo nhỏ: Luôn đặt tên file Migration có kèm timestamp (thời gian) ở đầu để đảm bảo chúng được chạy đúng thứ tự trước sau nhé!
Việc làm chủ Database Migration không chỉ giúp bạn bảo vệ dữ liệu mà còn nâng cấp tư duy hệ thống lên một tầm cao mới. Bạn sẽ không còn sợ hãi mỗi khi cần thay đổi cấu trúc dữ liệu lớn nữa. Vậy nếu cấu trúc đã xong, nhưng dữ liệu bên trong quá lớn khiến server bị lag thì sao? Đó là câu chuyện về Database Sharding mà chúng ta sẽ cùng mổ xẻ ở bài tới.
Tham khảo thêm các khóa học tại DIA DEMY để vững tay chèo trên con đường Backend nhé!




Vui lòng đăng nhập để bình luận.