Chuyển đổi kiến trúc dữ liệu NoSQL (mongodb) từ chia sẻ lược đồ điều khiển nhiều bên thuê thành chia sẻ lược đồ nhiều bên thuê
I. Benefits
- Chuẩn hóa cách tổ chức dữ liệu cho nhiều doanh nghiệp trên cùng hệ thống.
- Giảm chi phí vận hành khi số lượng doanh nghiệp tăng.
- Cho phép mở rộng trường nghiệp vụ mà không làm hỏng dữ liệu cũ.
- Bảo đảm Web và Mobile dùng chung dữ liệu và cùng một mô hình nghiệp vụ.
- Tạo nền tảng để mở rộng Qranty V2 có kiểm soát.
II. Prerequisites
Người đọc cần có kiến thức cơ bản về:
- MongoDB document và collection.
- Database schema và schemaless.
- Kiến trúc multi-tenant.
- Index, partition và migration dữ liệu.
- Nghiệp vụ hiện tại của Qranty.
- Quyền truy cập tài liệu kỹ thuật nội bộ Qranty.
III. Information Level
- infoLevel:3 (reader must be signed official employee's contract from at least junior grade)
- writingLevel:2 (text with diagrams and technical tables)
IV. Architecture Decision Record
1. Trạng thái
Proposed — Đề xuất để Kỹ sư trưởng và đội kỹ thuật xem xét, phê duyệt.
2. Bối cảnh
Qranty cần phục vụ nhiều doanh nghiệp trên cùng hệ thống. Kiến trúc hiện tại gắn chặt dữ liệu vào từng model, làm tăng chi phí thay đổi c ấu trúc, vận hành và mở rộng khi số lượng doanh nghiệp tăng.
Thiết kế mới cần:
- Cách ly dữ liệu giữa các doanh nghiệp.
- Cho phép Web và Mobile sử dụng chung dữ liệu.
- Hỗ trợ thêm trường nghiệp vụ có kiểm soát.
- Mở rộng dung lượng mà không tạo database riêng cho từng doanh nghiệp.
- Có quy trình migration và rollback an toàn.
3. Các phương án được xem xét
Phương án A: Một database cho mỗi tenant
Ưu điểm:
- Cách ly dữ liệu rõ ràng.
- Dễ sao lưu riêng từng tenant.
Hạn chế:
- Số database, connection và tác vụ vận hành tăng theo số tenant.
- Khó triển khai đồng nhất khi thay đổi cấu trúc.
Phương án B: Một collection cho mỗi tenant
Ưu điểm:
- Dữ liệu được tách tương đối rõ.
- Truy vấn một tenant đơn giản.
Hạn chế:
- Số collection tăng nhanh.
- Khó quản lý index, migration và giám sát.
Phương án C: Collection dùng chung có tenantId
Ưu điểm:
- Một bộ index và một quy trình nâng cấp cho tất cả tenant.
- Chi phí vận hành thấp hơn.
- Thuận lợi cho Web và Mobile sử dụng chung API.
Hạn chế:
- Mọi truy vấn bắt buộc phải lọc theo tenantId.
- Sai sót ở lớp truy cập dữ liệu có thể gây truy cập chéo tenant.
4. Quyết định
Qranty V2 sử dụng:
- Một MongoDB database dùng chung cho nhiều doanh nghiệp.
- Mọi document nghiệp vụ bắt buộc có tenantId.
- Không tạo database hoặc collection theo tên doanh nghiệp.
- Dữ liệu được phân thành 5 nhóm vận hành.
- Document gồm systemData và entityData.
- entityData được phép linh hoạt nhưng phải có hợp đồng dữ liệu và phiên bản.
- Collection được mở rộng bằng partition khi đạt ngưỡng vận hành.
4.1. Sơ đồ kiến trúc tổng thể

Hình 1 — Web và Mobile dùng chung API; API xác định tenant, định tuyến dữ liệu qua ba collection kỹ thuật và năm họ collection nghiệp vụ.
Luồng chính trong sơ đồ:
- Web hoặc Mobile gửi request tới Qranty V2 API.
- API lấy
tenantIdtừ ngữ cảnh xác thực, không tin giá trị tenant do client tự gửi. - API kiểm tra quyền, hợp đồng dữ liệu và tra registry để xác định đúng LV/partition.
- MongoDB lưu dữ liệu nhiều tenant trong cùng database, nhưng mọi document nghiệp vụ đều được phân tách logic bằng
systemData.tenantId. - Bộ nhớ đệm chỉ dùng để tăng tốc; cache key vẫn phải chứa
tenantId.
5. Cấu trúc document
Qranty V2 sử dụng cấu trúc document thống nhất cho toàn bộ dữ liệu nghiệp vụ.
Mỗi document gồm:
_id: định danh duy nhất của document.systemData: thông tin chung do hệ thống kiểm soát.entityData: thông tin nghiệp vụ theo từng loại dữ liệu.
Cấu trúc này giúp hệ thống vừa duy trì được các trường bắt buộc, vừa cho phép mở rộng dữ liệu nghiệp vụ mà không phải thay đổi toàn bộ collection.

Hình 2 — Một document gồm khối systemData cố định để kiểm soát tenant, phiên bản và định tuyến; khối entityData linh hoạt theo nghiệp vụ.
5.1. Khối systemData
systemData trả lời các câu hỏi:
- Document thuộc doanh nghiệp nào?
- Document thuộc LV nào?
- Document là loại dữ liệu gì?
- Document nằm trong partition nào?
- Document đang sử dụng phiên bản cấu trúc nào?
- Document được tạo và cập nhật bởi ai?
Các trường chính:
| Trường | Bắt buộc | Ý nghĩa |
|---|---|---|
tenantId | Có | Doanh nghiệp sở hữu document |
level | Có | Cấp d ữ liệu từ LV1 đến LV5 |
entityType | Có | Loại dữ liệu nghiệp vụ |
partitionId | Có | Định danh partition logic |
systemSchemaVersion | Có | Phiên bản cấu trúc của systemData |
entitySchemaVersion | Có | Phiên bản cấu trúc của entityData |
recordVersion | Có | Tăng sau mỗi lần cập nhật để chống ghi đè |
recordStatus | Có | Trạng thái active, deleted hoặc archived |
createdAt | Có | Thời điểm tạo document |
createdBy | Có | Người dùng hoặc tiến trình tạo document |
updatedAt | Có | Thời điểm cập nhật gần nhất |
updatedBy | Có | Người dùng hoặc tiến trình cập nhật gần nhất |
deletedAt | Khi xóa mềm | Thời điểm đánh dấu xóa |
deletedBy | Khi xóa mềm | Người hoặc tiến trình thực hiện xóa |
Tên collection vật lý không được lưu trực tiếp trong document.
Document chỉ lưu partitionId. Hệ thống sử dụng system_partitions để ánh xạ partitionId sang collection vật lý tương ứng.
Cách này cho phép hệ thống đổi tên, đóng hoặc mở partition mà không phải cập nhật toàn bộ document cũ.
5.2. Khối entityData
entityData chứa các trường nghiệp vụ riêng của từng entityType.
Ví dụ:
customercócustomerName,customerPhone,customerEmail,birthDatevàaddress.productItemcóserialNumber,productStatusvà thông tin tham chiếu sản phẩm.warrantycóactivatedAt,expiredAt,warrantyStatusvà tham chiếu khách hàng.repairTicketcóticketCode,repairStatus,totalAmountvà thông tin tiếp nhận.stockMovementcó loại biến động, số lượng và tham chiếu chứng từ kho.
Khối entityData gồm:
- Các trường lõi do đội kỹ thuật Qranty định nghĩa.
- Các trường tùy chỉnh của doanh nghiệp trong
customFields. - Các tham chiếu logic sang document khác.
- Snapshot nhỏ cần giữ lại tại thời điểm phát sinh nghiệp vụ.
- URL và metadata của hình ảnh hoặc file đính kèm.
Không lưu trực tiếp trong entityData:
- File nhị phân lớn.
- Hình ảnh dạng Base64.
- Mảng dữ liệu tăng không giới hạn.
- Password, OTP, token hoặc private key.
- Các trường không có ý nghĩa nghiệp vụ rõ ràng.