Cấu trúc Database
Nguyên tắc chung
- Mỗi một dịch vụ một database riêng
- Nguyên tắc đặt tên database <Scope của dự án>_<Môi trường>_<Mã dịch vụ>_<Phiên bản core>
- Ví dụ: với dự án thuộc scope U202001, môi trường developement, mã dịch vụ là CanBo, phiên bản core 5.0 thì tên database sẽ là U202001_CanBo_Dev_V5
- Mỗi một dự án sẽ có 1 tài khoản truy cập riêng, tên tài khoản chính là tên scope của dự án (ví dụ U202001)
- Tên các bảng được đặt bằng tiếng Việt không dấu, có thể đặt tên theo nhóm chức năng
- Ví dụ: CanBo_HoSo_ChucDanh_BoNhiem_Dot – Bảng lưu trữ danh sách các đợt bổ nhiệm, thuộc nhóm chức năng cha là quản lý chức danh cán bộ, và nhóm chức năng cao hơn nữa là hồ sơ cán bộ
- Các cột dạng số hoặc bit khuyến cáo để not null và set giá trị mặc định (trừ khi nghiệp vụ yêu cầu phải có null)
- Ví dụ cột ThuTuHienThi, kiểu int thì đặt giá trị mặc định = 0
- Nếu tạo các cột chứa string có giới hạn thì sử dụng nvarchar thay vì varchar (kể cả khi string đó không có ký tự unicode) vì vấn đề dự phòng đánh index sau này
- Nguyên tắc đặt tên database, tên bảng và tên field: Viết hoa chữ cái đầu của các từ
- Ví dụ: CanBo_HoSo_ChucDanh_BoNhiem_Dot
- Khi tạo CSDL trừ các field base ra thì cần điền description vào tất cả các field. Việc điền description này sẽ là đầu vào cho code gen CRUD. Xem thêm thông tin về code gen:
- https://docs.dttt.vn/docs/tools-core-5-2/gen-code/
- Xem hướng dẫn hiển thị cột Description khi design cột trong bảng tại link https://dataedo.com/kb/tools/ssms/how-to-view-and-edit-table-and-column-comments
- Khoá ngoại đặt tên theo nguyên tắc Id<Tên bản liên kết khoá ngoại> và bỏ hết các dấu _ (nếu có)
- Ví dụ: Trong bảng CanBo_HoiDong_ThanhVien tạo 1 field tên là IdCanBoHoiDong để liên kết với bảng CanBo_HoiDong
Nguyên tắc tạo khóa ngoại
Nguyên tắc đặt tên chung
- Khóa ngoại đặt tên theo nguyên tắc Id<Tên bảng liên kết khóa ngoại> và bỏ hết các dấu _ (nếu có)
- Ví dụ: Trong bảng CanBo_HoiDong_ThanhVien tạo 1 field tên là IdCanBoHoiDong để liên kết với bảng CanBo_HoiDong
Trường hợp liên kết giữa các bảng trong cùng một database
- Tạo liên kết với field Id của bảng chính, kiểu dữ liệu uniqueidentifier. Cách đặt tên theo nguyên tắc chung ở trên.
Trường hợp liên kết giữa các bảng khác database
- Trường hợp 1 field cần liên kết với 1 bảng duy nhất:
- Tạo field kiểu dữ liệu uniqueidentifier (không tạo liên kết trong SQL), cách đặt tên theo nguyên tắc chung ở trên.
- Có thể tạo thêm các field phụ để lưu mã (Code) hoặc một vài thông tin khác của bảng cần liên kết, nhưng đây là theo yêu cầu nghiệp vụ, dev cần tự cập nhật dữ liệu vào cho các field này.
- Trường hợp 1 field cần liên kết với nhiều bảng và không xác định tại thời điểm thiết kế:
- Sử dụng cặp field ServiceCode, Entity, EntityKey để liên kết trong đó
- ServiceCode: Mã dịch vụ mà bản ghi liên kết đến
- Entity: Mã đối tượng (tên bảng) mà bản ghi liên kết đến
- EntityKey: Giá trị field Id của bản ghi liên kết đến
- Trường hợp này phổ biến trong các bài toán dạng đính kèm. Ví dụ bảng FileObjects có thể dùng để liên kết với bất kỳ bảng nào trong bất kỳ database nào khác, thì thay vì tạo field FileId ở từng bảng nghiệp vụ thì sẽ dùng 3 field ServiceCode, Entity, EntityKey trong bảng FileObjects để liên kết. Tạo sự thuận tiện và tách biệt hơn trong nghiệp vụ của các dịch vụ.
- Sử dụng cặp field ServiceCode, Entity, EntityKey để liên kết trong đó
Các cột base trong từng bảng
STT | Tên cột | Kiểu dữ liệu | Cho phép null | Giá trị mặc định | Mô tả |
---|---|---|---|---|---|
1 | Id | uniqueidentifier | ☐ | newid() | Khoá chính của bản ghi |
3 | Created | datetime2(7) | ☐ | getdate() | Thời gian tạo bản ghi |
4 | Modified | datetime2(7) | ☐ | getdate() | Thời gian cập nhật bản ghi gần nhất |
5 | CreatedBy | nvarchar(36) | ☒ | Id Người tạo bản ghi | |
6 | ModifiedBy | nvarchar(36) | ☒ | Id Người sửa bản ghi gần nhất | |
7 | Code | nvarchar(100) | ☒ | Mã định danh bản ghi do người dùng nhập vào (human readable) | |
8 | IsBuidIn | bit | ☐ | Khoá sửa mã bản ghi nếu = true. (Trừ tài khoản có IsSuperUser = true) | |
9 | IsBuidInAll | bit | ☐ | Khoá sửa bất kỳ thông tin nào của bản ghi nếu = true. (Trừ tài khoản có IsSuperUser = true) | |
10 | ServiceCode | nvarchar(100) | ☒ | Tạo liên kết với bản ghi thuộc CSDL khác – Mã dịch vụ (mã dịch vụ liên kết) | |
11 | Entity | nvarchar(100) | ☒ | Tạo liên kết với bản ghi thuộc CSDL khác – Mã đối tượng (tên bảng liên kết) | |
12 | EntityKey | nvarchar(100) | ☒ | Tạo liên kết với bản ghi thuộc CSDL khác – Id của bản ghi liên kết | |
13 | Version | int | ☐ | -1 | Phiên bản của bản ghi (mặc định -1 là version mới nhất hoặc không dùng version) |
14 | CurrentStateCode | varchar(255) | ☒ | Mã bước hiện tại (Nếu áp dụng quy trình) | |
15 | UserIdLastInWorkflow | varchar(100) | ☒ | Người xử lý cuối cùng gần nhất (Nếu áp dụng quy trình) | |
16 | DonViIdLastInWorkflow | uniqueidentifier | ☒ | Đơn vị xử lý cuối cùng gần nhất (Nếu áp dụng quy trình) | |
17 | WorkflowStateType | int | ☐ | Loại trạng thái quy trình | |
18 | IsDeleted | bit | ☐ | Trạng thái bản ghi: 0: chưa xóa, 1: đã xóa | |
19 | WorkflowCode | nvarchar(100) | ☒ | Mã quy trình đang áp dụng | |
20 | IdOrganization | uniqueidentifier | ☐ | Dữ liệu thuộc về đơn vị (trường hợp multi tenant) |
Các bảng base trong từng database
STT | Tên bảng | Mô tả |
---|---|---|
1 | EntityMetadatas | Metadata bổ sung thêm cho các bảng |
2 | EntityPermissions | Thông tin phân quyền dữ liệu |
4 | EntityWorkflowInstances | Instance của 1 workflow |
5 | EntityWorkflowSettings | Cấu hình cho instance workflow |
6 | WorkflowPermissions | Phân quyền trong workflow |
7 | WorkflowPermissionDetails | Chi tiết phân quyền trong workflow |
8 | WorkflowSettings | Cấu hình workflow |
9 | WorkflowHistorys | Lịch thực thi workflow |
10 | WorkflowHistoryUsers | Danh sách người tham gia trong quy trình ở các bước |
Script tạo các cột base cho tất cả bảng trong 1 database
Script tạo các bảng base cho 1 database