🛢️ 05. Database & Migrations – Hướng dẫn Làm việc với CSDL¶
Tài liệu này hướng dẫn cách thiết kế, quản lý và triển khai schema CSDL trong hệ thống DX-VAS, tuân thủ chuẩn 5⭐ và các ADR liên quan đến dữ liệu.
1. 🧠 Triết lý Thiết kế Dữ liệu¶
- Mọi bảng phải được định nghĩa rõ ràng trong
data-model.md, bao gồm: - Cấu trúc bảng: cột, kiểu dữ liệu, ràng buộc
- Quan hệ (FK), chỉ mục (index), enum mở rộng (nếu có)
- Ghi rõ lifecycle & retention (nếu có)
- Không trực tiếp chỉnh sửa DB bằng tay – mọi thay đổi phải thông qua migration.
2. 📐 Quy tắc Đặt Tên & Chuẩn hóa¶
- Bảng dùng snake_case, danh từ số nhiều:
users,notification_logs - Enum nên được lưu trong bảng phụ trợ (
channel_types,log_statuses) - Tên cột nhất quán:
created_at,updated_at,deleted_at,version - Dùng
uuidlàmprimary key, không dùngserial
Tham khảo: ADR-023 - Schema Migration Strategy
3. 🗂️ Quản lý Migration¶
- Dùng Alembic cho Python service hoặc tương đương với Node.js (
knex,typeorm,prisma, ...) - Migration phải được lưu trong thư mục:
-
Mỗi migration nên có tên mô tả:
-
Lệnh tạo migration mẫu (Alembic):
-
Lệnh chạy migration:
4. 📋 Ghi chú Khi Thiết kế Bảng¶
- Luôn thêm
created_at,updated_atvới mặc địnhtimezone.now() -
Các bảng quan trọng cần có:
-
is_deletedhoặcdeleted_atnếu hỗ trợ soft delete versionđể hỗ trợ optimistic locking- Thêm chỉ mục cho các trường truy vấn nhiều:
user_id,status,created_at DESC
5. 📉 Chiến lược Lifecycle & Retention¶
- Ghi rõ thời gian giữ liệu (VD:
notification_logsgiữ 180 ngày) -
Dữ liệu lâu ngày cần dọn dẹp bằng:
-
Batch job hoặc cron
- Rule SQL:
DELETE WHERE created_at < NOW() - interval '180 days' - Tham khảo: ADR-024 - Data Anonymization & Retention
6. 🚨 Không Bao giờ¶
- Không sửa schema bằng
psqltrực tiếp - Không xoá migration cũ đã merge
- Không tạo migration gây breaking change mà không có plan migration dữ liệu (backfill)
7. 🧪 Testing DB¶
- Tạo
test_dbriêng biệt với prefixtest_ - Chạy migration trên DB test trong pipeline CI
- Dọn dẹp DB sau mỗi test để tránh dữ liệu dư
📌 Mọi thay đổi CSDL đều phải có migration, cập nhật
data-model.mdvà được review kỹ lưỡng. Nếu có ảnh hưởng tới schema chung (shared schema), cần tạo thêm ADR.