# 轻松聘 (mydreamjob) 数据库 ERD 设计 > 版本: v0.1 | 更新日期: 2026-08-03 | 状态: Week 1 基线 ## 实体关系图 (ERD) ``` ┌──────────────┐ ┌──────────────┐ │ users │1 *│ user_roles │ │──────────────│──────▶│──────────────│ │ id (PK) │ │ user_id (FK) │ │ phone │ │ role (Enum) │ │ email │ └──────────────┘ │ nickname │ │ avatar_url │ ┌──────────────┐ ┌──────────────┐ │ password_hash│ │sms_vrf_codes │ │ audit_logs │ │ role (Enum) │ │──────────────│ │──────────────│ │ is_active │ │ id (PK) │ │ id (PK) │ │ is_verified │ │ phone │ │ user_id (FK) │ │ created_at │ │ code │ │ action │ │ updated_at │ │ purpose │ │ entity_type │ └──────────────┘ │ attempts │ │ entity_id │ │ │ max_attempts │ │ details │ │1 │ expired_at │ │ ip_address │ │ │ used │ │ user_agent │ │ │ created_at │ │ request_id │ │ └──────────────┘ │ created_at │ │ └──────────────┘ │ │1 ┌──────────────┐ └───────────────▶│ auth_tokens │ │──────────────│ │ id (PK) │ │ user_id (FK) │ │ token_hash │ │ token_type │ │ expired_at │ │ revoked │ │ refresh_hash │ │ created_at │ └──────────────┘ ``` ## 实体说明 ### 1. users (用户) 核心用户表,支持学生、企业、管理员三种角色。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | BIGINT | PK, AUTO_INCREMENT | 主键 | | phone | VARCHAR(20) | UNIQUE, NOT NULL | 手机号(登录主键) | | email | VARCHAR(100) | NULLABLE | 邮箱 | | nickname | VARCHAR(50) | NULLABLE | 昵称 | | avatar_url | VARCHAR(500) | NULLABLE | 头像URL | | password_hash | VARCHAR(255) | NULLABLE | BCrypt 密码哈希 | | role | VARCHAR(30) | NOT NULL | 主角色: STUDENT/COMPANY/ADMIN | | is_active | TINYINT(1) | DEFAULT 1 | 是否启用 | | is_verified | TINYINT(1) | DEFAULT 0 | 是否已认证 | | created_at | DATETIME | NOT NULL | 创建时间 | | updated_at | DATETIME | NOT NULL | 更新时间 | ### 2. user_roles (用户角色关联) 多对多关系,支持用户拥有多个角色。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | user_id | BIGINT | FK → users.id, PK | 用户ID | | role | VARCHAR(30) | Enum, PK | 角色: STUDENT/COMPANY/ADMIN | ### 3. sms_verification_codes (短信验证码) 短信验证码记录,用于登录/注册验证。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | BIGINT | PK, AUTO_INCREMENT | 主键 | | phone | VARCHAR(20) | NOT NULL | 手机号 | | code | VARCHAR(10) | NOT NULL | 验证码 | | purpose | VARCHAR(50) | NOT NULL | 用途: login/register 等 | | attempts | INT | DEFAULT 0 | 错误尝试次数 | | max_attempts | INT | DEFAULT 5 | 最大尝试次数 | | expired_at | DATETIME | NOT NULL | 过期时间 | | used | TINYINT(1) | DEFAULT 0 | 是否已使用 | | created_at | DATETIME | NOT NULL | 创建时间 | ### 4. audit_logs (审计日志) 系统操作审计记录,追踪关键业务行为。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | BIGINT | PK, AUTO_INCREMENT | 主键 | | user_id | BIGINT | FK → users.id | 操作用户ID | | action | VARCHAR(50) | NOT NULL | 操作类型: LOGIN/LOGOUT/SEND等 | | entity_type | VARCHAR(50) | NULLABLE | 实体类型 | | entity_id | BIGINT | NULLABLE | 实体ID | | details | TEXT | NULLABLE | 详细描述 | | ip_address | VARCHAR(45) | NULLABLE | 客户端IP | | user_agent | VARCHAR(500) | NULLABLE | 浏览器UA | | request_id | VARCHAR(32) | NULLABLE | 请求追踪ID | | created_at | DATETIME | NOT NULL | 创建时间 | ### 5. auth_tokens (认证Token) JWT Token 管理表,支持 Token 吊销和刷新。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | BIGINT | PK, AUTO_INCREMENT | 主键 | | user_id | BIGINT | FK → users.id, NOT NULL | 用户ID | | token_hash | VARCHAR(255) | NOT NULL | Token Hash (SHA-256) | | token_type | VARCHAR(20) | DEFAULT 'ACCESS' | ACCESS/REFRESH | | expired_at | DATETIME | NOT NULL | 过期时间 | | revoked | TINYINT(1) | DEFAULT 0 | 是否已吊销 | | refresh_token_hash | VARCHAR(255) | NULLABLE | 刷新Token Hash | | created_at | DATETIME | NOT NULL | 创建时间 | ## 后续规划(Week 2+) 以下实体在 Week 1 不实现,仅列出设计意图: | 实体 | 说明 | 关联 | |------|------|------| | companies (企业) | 企业信息、认证状态 | users.role=COMPANY | | jobs (岗位) | 招聘信息、薪资、地点 | companies.id | | applications (投递) | 投递记录、状态流转 | users.id, jobs.id | | ratings (评分) | 企业评分、评价 | users.id(评分者), companies.id(被评) | | evidence (证据) | 证明材料、截图 | users.id, ratings.id | | conversations (会话) | 聊天会话、消息 | users.id, jobs.id | ## 索引策略 - `users.phone` / `users.email`: 唯一索引,用于登录查询 - `sms_verification_codes.phone, created_at`: 复合索引,用于查找最近验证码 - `audit_logs.user_id, created_at`: 复合索引,用于用户操作历史查询 - `audit_logs.created_at`: 单列索引,用于时间范围查询 - `auth_tokens.user_id, revoked`: 复合索引,用于用户Token管理