Human Resources & Auth / Technical / database-schema.html
Technical spec
Database Schema Design
Mô tả cấu trúc các bảng dữ liệu vật lý MySQL được định nghĩa thông qua tệp Prisma ORM của phân hệ HR & Authorization.
💾 Khai Báo Prisma Models
Cú pháp định nghĩa cấu trúc bảng, khóa ngoại, kiểu dữ liệu thực tế được sử dụng trong mã nguồn NestJS.
// ==========================================
// 1. NHÓM BẢNG QUẢN LÝ NHÂN SỰ (EMPLOYEES)
// ==========================================
model Employee {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
departmentId Int @map("department_id")
jobTitleId Int? @map("job_title_id")
employeeCode String? @unique @map("employee_code")
firstName String? @map("first_name")
lastName String? @map("last_name")
email String?
phone String?
status Int @default(1)
userId Int? @unique @map("user_id")
fullName String? @map("full_name")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @updatedAt @map("updated_at")
skills EmployeeSkill[] @relation("skillEmployeeRelation")
idCodes EmployeeIdCode[] @relation("employeeIdCodeRelation")
user User? @relation("employeeUserRelation", fields: [userId], references: [id])
@@map("employees")
}
model EmployeeSkill {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
employeeId Int @map("employee_id")
skillId Int @map("skill_id")
employee Employee @relation("skillEmployeeRelation", fields: [employeeId], references: [id])
skill MasterData @relation("employeeSkillRelation", fields: [skillId], references: [id])
@@map("employee_skills")
}
model EmployeeIdCode {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
employeeId Int @map("employee_id")
cardType String? @map("card_type")
isActive Boolean @default(true) @map("is_active")
employee Employee @relation("employeeIdCodeRelation", fields: [employeeId], references: [id])
@@map("employee_id_codes")
}
// ==========================================
// 2. NHÓM BẢNG PHÂN QUYỀN (USERS & AUTHORIZATION)
// ==========================================
model User {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
username String @unique
password String
isSuperAdmin Boolean @default(false) @map("is_super_admin")
status Int @default(1)
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @updatedAt @map("updated_at")
employee Employee? @relation("employeeUserRelation")
userTokens UserToken[]
userRoles UserRole[] @relation("UserToUserRole")
@@map("users")
}
model Role {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
name String @unique
description String?
rolePermissions RolePermission[]
userRoles UserRole[] @relation("RoleToUserRole")
@@map("roles")
}
model UserRole {
uuid String @id @unique @default(uuid()) @map("uuid")
userId Int @map("user_id")
roleId Int @map("role_id")
isDeleted Boolean @default(false) @map("is_deleted")
user User @relation("UserToUserRole", fields: [userId], references: [id])
role Role @relation("RoleToUserRole", fields: [roleId], references: [id])
@@map("user_roles")
}
model RolePermission {
uuid String @id @unique @default(uuid()) @map("uuid")
roleId Int @map("role_id")
permissionCode String @map("permission_code")
isDeleted Boolean @default(false) @map("is_deleted")
role Role @relation(fields: [roleId], references: [id])
@@unique([roleId, permissionCode])
@@map("role_permissions")
}
model UserToken {
id Int @id @unique @default(autoincrement())
isDeleted Boolean @default(false) @map("is_deleted")
userId Int @map("user_id")
accessToken String @map("access_token") @db.Text
refreshToken String @map("refresh_token") @db.Text
user User @relation(fields: [userId], references: [id])
@@map("user_tokens")
}