1. Ràng buộc khóa ngoại (Referential Integrity)
Tất cả quan hệ giữa các bảng được bảo vệ bằng FOREIGN KEY constraints — SQL Server sẽ từ chối các thao tác vi phạm quan hệ.Các quan hệ cốt lõi
Danh sách FK quan trọng
| Bảng con | Trường FK | Bảng cha |
|---|---|---|
t_huca_users | FacultyId | t_huca_faculties |
t_huca_users | AcademicYearId | t_huca_academic_years |
t_huca_users | ClassId | t_huca_classes |
t_huca_users | ProvinceId | t_huca_provinces |
t_huca_classes | FacultyId | t_huca_faculties |
t_huca_classes | AcademicYearId | t_huca_academic_years |
t_huca_posts | GroupId | t_huca_groups |
t_huca_posts | AuthorId | t_huca_users |
t_huca_event_registrations | EventId | t_huca_events |
t_huca_event_registrations | UserId | t_huca_users |
t_huca_donations | CampaignId | t_huca_fundraising_campaigns |
t_huca_job_applications | JobId | t_huca_jobs |
2. Ràng buộc duy nhất (Unique Constraints)
Mức bản ghi đơn (Single-column UNIQUE)
| Bảng | Cột | Ý nghĩa |
|---|---|---|
t_huca_users | Email | 1 email = 1 tài khoản |
t_huca_users | PhoneNumber | 1 SĐT = 1 tài khoản |
t_huca_faculties | Code | Mã khoa không trùng |
t_huca_classes | Code | Mã lớp không trùng |
t_huca_academic_years | YearNumber | Số khóa không trùng |
t_huca_certificates | CertificateCode | Mã chứng chỉ duy nhất |
t_huca_vouchers | Code | Mã voucher duy nhất |
t_huca_badges | Code | Mã huy hiệu duy nhất |
t_huca_mentors | UserId | 1 người = 1 hồ sơ mentor |
Mức composite (Multi-column UNIQUE)
| Bảng | Cột | Ý nghĩa |
|---|---|---|
t_huca_event_registrations | (EventId, UserId) | Mỗi người đăng ký 1 lần/sự kiện |
t_huca_group_members | (GroupId, UserId) | Mỗi người tham gia 1 lần/nhóm |
t_huca_reactions | (UserId, TargetType, TargetId) | Mỗi người react 1 lần |
t_huca_user_roles | (UserId, RoleId) | Không gán trùng vai trò |
t_huca_committee_members | (CommitteeId, TermId, UserId) | 1 chức danh/người/nhiệm kỳ |
t_huca_company_members | (CompanyId, UserId) | Mỗi người 1 lần/công ty |
t_huca_job_applications | (JobId, ApplicantId) | Ứng tuyển 1 lần/tin |
t_huca_user_badges | (UserId, BadgeId) | Mỗi huy hiệu 1 lần/người |
t_huca_user_locations | UserId | 1 bản ghi vị trí/người |
t_huca_program_registrations | (ProgramId, UserId) | Đăng ký 1 lần/chương trình |
3. Soft Delete
Tất cả bảng nghiệp vụ sử dụngIsActive BIT DEFAULT 1 thay vì xóa vật lý:
- Giữ nguyên tính toàn vẹn FK (không phá vỡ quan hệ)
- Dữ liệu lịch sử được bảo toàn
- Có thể phục hồi khi cần
- Audit trail đầy đủ
4. Chiến lược Indexing
Index trên Foreign Keys
Tất cả cột FK đều có index để tránh table scan khi JOIN:Index cho truy vấn thường gặp
Filtered Index
5. Denormalization có kiểm soát
Một số trường counter được denormalize để tăng tốc đọc:| Bảng | Trường | Nguồn thực |
|---|---|---|
t_huca_posts | LikeCount, CommentCount | COUNT từ reactions/comments |
t_huca_groups | MemberCount | COUNT từ group_members |
t_huca_fundraising_campaigns | CurrentAmount, DonorCount | SUM/COUNT từ donations |
t_huca_jobs | ApplicationCount, ViewCount | COUNT từ job_applications |
6. Collation Tiếng Việt
Database sử dụngVietnamese_CI_AS để hỗ trợ đầy đủ ký tự tiếng Việt:
- CI = Case Insensitive (không phân biệt hoa/thường)
- AS = Accent Sensitive (phân biệt dấu: “a” ≠ “à” ≠ “á” ≠ “ã” ≠ “ả” ≠ “ạ”)
Vietnamese_CI_AI ở cấp column hoặc dùng thư viện chuẩn hóa chuỗi ở tầng application.
:::
7. Audit Log
Bảngt_huca_audit_logs ghi nhận mọi thay đổi quan trọng: