308 lines
10 KiB
Markdown
308 lines
10 KiB
Markdown
|
|
# 数据库设计文档
|
|||
|
|
|
|||
|
|
## 数据库概述
|
|||
|
|
|
|||
|
|
本系统采用前后端分离架构,前端不直接操作数据库,但需要了解后端数据库设计以便进行合理的数据交互和界面设计。
|
|||
|
|
|
|||
|
|
## 数据库选型
|
|||
|
|
|
|||
|
|
### 推荐数据库
|
|||
|
|
- **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 | ❌ | ❌ | | 昵称 |
|
|||
|
|
| email | 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)
|
|||
|
|
|
|||
|
|
## 数据库关系图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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 进行数据库版本管理
|
|||
|
|
- 每个版本创建对应的迁移脚本
|
|||
|
|
- 测试环境先行验证
|
|||
|
|
|
|||
|
|
### 数据迁移
|
|||
|
|
- 生产环境数据备份
|
|||
|
|
- 灰度发布验证
|
|||
|
|
- 回滚方案准备
|
|||
|
|
|
|||
|
|
## 监控维护
|
|||
|
|
|
|||
|
|
### 性能监控
|
|||
|
|
- 慢查询日志分析
|
|||
|
|
- 连接数监控
|
|||
|
|
- 磁盘空间监控
|
|||
|
|
|
|||
|
|
### 日常维护
|
|||
|
|
- 定期数据备份
|
|||
|
|
- 索引重建优化
|
|||
|
|
- 日志文件清理
|