10 KiB
10 KiB
数据库设计文档
数据库概述
本系统采用前后端分离架构,前端不直接操作数据库,但需要了解后端数据库设计以便进行合理的数据交互和界面设计。
数据库选型
推荐数据库
- MySQL 8.0+: 关系型数据库,事务支持完善
- PostgreSQL 13+: 高级特性丰富,JSON 支持好
- MongoDB 5.0+: 文档数据库,灵活 schema
选择建议
- 中小型项目: MySQL
- 大型复杂项目: PostgreSQL
- 快速原型: MongoDB
核心表设计
1. 用户表 (sys_user)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 用户ID |
| username | varchar | 50 | ❌ | ✅ | 用户名 | |
| password | varchar | 100 | ❌ | ✅ | 密码(加密) | |
| nickname | varchar | 50 | ❌ | ❌ | 昵称 | |
| varchar | 100 | ❌ | ❌ | 邮箱 | ||
| phone | varchar | 20 | ❌ | ❌ | 手机号 | |
| avatar | varchar | 500 | ❌ | ❌ | 头像 | |
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0禁用,1启用) |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 | |
| update_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 更新时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 唯一索引: UNIQUE KEY uk_username (username)
- 普通索引: INDEX idx_email (email)
2. 角色表 (sys_role)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 角色ID |
| name | varchar | 50 | ❌ | ✅ | 角色名称 | |
| code | varchar | 50 | ❌ | ✅ | 角色编码 | |
| description | varchar | 200 | ❌ | ❌ | 角色描述 | |
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0禁用,1启用) |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 | |
| update_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 更新时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 唯一索引: UNIQUE KEY uk_code (code)
3. 权限表 (sys_permission)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 权限ID |
| name | varchar | 50 | ❌ | ✅ | 权限名称 | |
| code | varchar | 100 | ❌ | ✅ | 权限编码 | |
| type | tinyint | 1 | ❌ | ✅ | 权限类型(1菜单,2按钮) | |
| parent_id | bigint | 20 | ❌ | ✅ | 0 | 父级ID |
| path | varchar | 200 | ❌ | ❌ | 路由路径 | |
| component | varchar | 200 | ❌ | ❌ | 组件路径 | |
| icon | varchar | 50 | ❌ | ❌ | 图标 | |
| sort | int | 11 | ❌ | ✅ | 0 | 排序 |
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0禁用,1启用) |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 | |
| update_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 更新时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 普通索引: INDEX idx_parent_id (parent_id)
- 普通索引: INDEX idx_type (type)
4. 用户角色关联表 (sys_user_role)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 关联ID |
| user_id | bigint | 20 | ❌ | ✅ | 用户ID | |
| role_id | bigint | 20 | ❌ | ✅ | 角色ID | |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 唯一索引: UNIQUE KEY uk_user_role (user_id, role_id)
- 普通索引: INDEX idx_user_id (user_id)
- 普通索引: INDEX idx_role_id (role_id)
5. 角色权限关联表 (sys_role_permission)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 关联ID |
| role_id | bigint | 20 | ❌ | ✅ | 角色ID | |
| permission_id | bigint | 20 | ❌ | ✅ | 权限ID | |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 唯一索引: UNIQUE KEY uk_role_permission (role_id, permission_id)
- 普通索引: INDEX idx_role_id (role_id)
- 普通索引: INDEX idx_permission_id (permission_id)
6. 菜单表 (sys_menu)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 菜单ID |
| name | varchar | 50 | ❌ | ✅ | 菜单名称 | |
| type | tinyint | 1 | ❌ | ✅ | 菜单类型(1目录,2菜单,3按钮) | |
| parent_id | bigint | 20 | ❌ | ✅ | 0 | 父级ID |
| path | varchar | 200 | ❌ | ❌ | 路由路径 | |
| component | varchar | 200 | ❌ | ❌ | 组件路径 | |
| icon | varchar | 50 | ❌ | ❌ | 图标 | |
| sort | int | 11 | ❌ | ✅ | 0 | 排序 |
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0禁用,1启用) |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 | |
| update_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 更新时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 普通索引: INDEX idx_parent_id (parent_id)
业务表设计
7. 操作日志表 (sys_operation_log)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 日志ID |
| user_id | bigint | 20 | ❌ | ✅ | 用户ID | |
| username | varchar | 50 | ❌ | ✅ | 用户名 | |
| operation | varchar | 100 | ❌ | ✅ | 操作描述 | |
| method | varchar | 10 | ❌ | ✅ | 请求方法 | |
| url | varchar | 500 | ❌ | ✅ | 请求URL | |
| ip | varchar | 50 | ❌ | ✅ | IP地址 | |
| user_agent | varchar | 500 | ❌ | ❌ | 用户代理 | |
| params | text | ❌ | ❌ | 请求参数 | ||
| result | text | ❌ | ❌ | 返回结果 | ||
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0失败,1成功) |
| error_msg | text | ❌ | ❌ | 错误信息 | ||
| execute_time | int | 11 | ❌ | ✅ | 0 | 执行时间(ms) |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 普通索引: INDEX idx_user_id (user_id)
- 普通索引: INDEX idx_create_time (create_time)
8. 字典表 (sys_dict)
| 字段名 | 类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|---|---|---|---|---|---|---|
| id | bigint | 20 | ✅ | ✅ | 自增 | 字典ID |
| type | varchar | 50 | ❌ | ✅ | 字典类型 | |
| code | varchar | 50 | ❌ | ✅ | 字典编码 | |
| name | varchar | 100 | ❌ | ✅ | 字典名称 | |
| value | varchar | 200 | ❌ | ❌ | 字典值 | |
| sort | int | 11 | ❌ | ✅ | 0 | 排序 |
| status | tinyint | 1 | ❌ | ✅ | 1 | 状态(0禁用,1启用) |
| description | varchar | 200 | ❌ | ❌ | 描述 | |
| create_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 创建时间 | |
| update_time | datetime | ❌ | ✅ | CURRENT_TIMESTAMP | 更新时间 |
索引设计:
- 主键索引: PRIMARY KEY (id)
- 唯一索引: UNIQUE KEY uk_type_code (type, code)
- 普通索引: INDEX idx_type (type)
数据库关系图
erDiagram
sys_user ||--o{ sys_user_role : has
sys_role ||--o{ sys_user_role : has
sys_role ||--o{ sys_role_permission : has
sys_permission ||--o{ sys_role_permission : has
sys_permission ||--o{ sys_menu : extends
sys_user {
bigint id PK
varchar username
varchar password
varchar nickname
varchar email
varchar phone
varchar avatar
tinyint status
datetime create_time
datetime update_time
}
sys_role {
bigint id PK
varchar name
varchar code
varchar description
tinyint status
datetime create_time
datetime update_time
}
sys_permission {
bigint id PK
varchar name
varchar code
tinyint type
bigint parent_id
varchar path
varchar component
varchar icon
int sort
tinyint status
datetime create_time
datetime update_time
}
sys_user_role {
bigint id PK
bigint user_id
bigint role_id
datetime create_time
}
sys_role_permission {
bigint id PK
bigint role_id
bigint permission_id
datetime create_time
}
数据字典
状态枚举
| 表名 | 字段名 | 枚举值 | 说明 |
|---|---|---|---|
| sys_user | status | 0 | 禁用 |
| sys_user | status | 1 | 启用 |
| sys_role | status | 0 | 禁用 |
| sys_role | status | 1 | 启用 |
| sys_permission | status | 0 | 禁用 |
| sys_permission | status | 1 | 启用 |
| sys_operation_log | status | 0 | 失败 |
| sys_operation_log | status | 1 | 成功 |
类型枚举
| 表名 | 字段名 | 枚举值 | 说明 |
|---|---|---|---|
| sys_permission | type | 1 | 菜单权限 |
| sys_permission | type | 2 | 按钮权限 |
| sys_menu | type | 1 | 目录 |
| sys_menu | type | 2 | 菜单 |
| sys_menu | type | 3 | 按钮 |
数据库优化建议
1. 索引优化
- 为常用查询字段建立索引
- 避免过度索引影响写入性能
- 定期分析索引使用情况
2. 查询优化
- 使用分页查询避免大数据量
- 避免 SELECT * 查询
- 合理使用 JOIN 查询
3. 存储优化
- 合理设置字段长度
- 使用合适的数据类型
- 定期清理历史数据
4. 安全优化
- 敏感字段加密存储
- 定期备份数据
- 访问权限控制
迁移策略
版本管理
- 使用 Flyway 或 Liquibase 进行数据库版本管理
- 每个版本创建对应的迁移脚本
- 测试环境先行验证
数据迁移
- 生产环境数据备份
- 灰度发布验证
- 回滚方案准备
监控维护
性能监控
- 慢查询日志分析
- 连接数监控
- 磁盘空间监控
日常维护
- 定期数据备份
- 索引重建优化
- 日志文件清理