5.Quy định về Database, Schema và Migration
5.1. Mục tiêu chương
Chương này quy định cách quản lý cấu trúc database và các thay đổi schema nhằm:
-
Đảm bảo tính ổn định của dữ liệu hệ thống
-
Tránh xung đột schema giữa các module và các đơn vị phát triển
-
Đảm bảo khả năng triển khai tự động qua các môi trường
-
Kiểm soát lịch sử thay đổi database
5.2. Khái niệm / phạm vi áp dụng
Quy định này áp dụng cho:
-
Toàn bộ database của hệ thống
-
Core Team và Partner Team
-
Tất cả các thay đổi liên quan đến:
-
Bảng dữ liệu
-
Cột dữ liệu
-
Constraint
-
Index
-
Trigger
Hệ thống phân loại bảng dữ liệu thành hai nhóm:
1. Core tables (dùng chung toàn hệ thống)
Bao gồm các bảng:
-
app_user
-
theme_config
-
feature_management
Đây là các bảng dữ liệu lõi, được dùng chung cho:
-
Xác thực
-
Phân quyền
-
Cấu hình hệ thống
2. Module tables
Bao gồm:
-
Các bảng thuộc từng module riêng
-
Nằm trong phạm vi nghiệp vụ của module
Ví dụ:
-
planning
-
document
-
task
-
notification
5.3. Quy định chính
5.3.1. Quy định với Core tables
Partner không được phép:
-
Thay đổi cấu trúc bảng
-
Thêm cột
-
Xóa cột
-
Đổi kiểu dữ liệu
-
Sửa constraint
-
Sửa index
-
Sửa trigger
Mọi thay đổi liên quan đến core tables phải thông qua:
DB Core Change Request -> sử dụng jira/… hoặc các phần mềm quản lý công việc nội bộ
Và do Core Team thực hiện.
5.3.2. Quy định với Module tables
Partner được phép:
-
Tạo bảng mới cho module
-
Thêm cột
-
Sửa cấu trúc bảng module
Nhưng phải tuân thủ:
-
Không ảnh hưởng core tables
-
Có migration script
-
Có mô tả rõ trong Pull Request
-
Được Core Team review
5.3.3. Migration bắt buộc
Mọi thay đổi database phải tuân thủ các nguyên tắc sau:
-
Không sửa trực tiếp database production
-
Không chỉnh sửa thủ công trên DB staging
-
Tất cả thay đổi phải qua migration script
-
Migration phải được commit vào source code
Công cụ sử dụng:
-
Flyway hoặc Liquibase
Format migration
Tên file migration:
V<timestamp>__<description>.sql
Ví dụ:
V20260209__create_planning_table.sql
V20260210__add_priority_to_planning.sql
5.4. Cách thực hiện / quy trình
Trường hợp 1: Thêm hoặc sửa bảng trong module
Bước 1: Cập nhật entity trong:
modules/<module>/entity/**
Bước 2: Tạo migration script:
V<timestamp>__<description>.sql
Bước 3: Commit:
-
Entity
-
Migration script
Bước 4: Tạo Pull Request
Bước 5: Core Team review:
-
Migration hợp lệ
-
Không ảnh hưởng core tables
Bước 6: Merge vào develop
Trường hợp 2: Thay đổi core tables
Bước 1: Tạo ticket:
[DB CORE CHANGE REQUEST] <mô tả thay đổi>
Bước 2: Cung cấp thông tin:
-
Bảng bị ảnh hưởng
-
Cột thay đổi
-
Kiểu dữ liệu
-
Migration script đề xuất
-
Lý do thay đổi
Bước 3: Core Team review
Bước 4: Nếu được duyệt:
-
Core Team thực hiện migration
Merge vào develop
5.5. Ví dụ minh họa
Trường hợp hợp lệ
Partner thêm bảng mới:
CREATE TABLE PLANNING (
ID BIGINT PRIMARY KEY,
NAME VARCHAR(255),
DESCRIPTION VARCHAR(1000)
);
→ Thuộc module table → được phép.
Trường hợp không hợp lệ
Partner chạy trực tiếp trên production:
ALTER TABLE USER_ACCOUNT ADD PHONE VARCHAR(20);
→ Sai quy định vì:
-
Sửa core table
-
Sửa trực tiếp DB production
-
Không có migration
Trường hợp cần xin phép
Partner muốn:
ALTER TABLE ROLE ADD DESCRIPTION VARCHAR(255);
→ Đây là core table.
Phải tạo: trên phần mềm quản lý công việc nội bộ hoặc phần mềm nghiệp vụ tương đương
[DB CORE CHANGE REQUEST]
5.6. Checklist áp dụng
Trước khi commit hoặc tạo PR:
-
Có thay đổi database không?
-
Nếu có → phải có migration script
-
Có sửa core table không?
-
Nếu có → phải tạo DB Core Change Request
-
Migration có đúng format tên file không?
-
Không sửa trực tiếp DB production
-
Migration đã được commit vào source code