Files
admin-vben/docs/数据库设计文档.md

308 lines
10 KiB
Markdown
Raw Permalink Normal View History

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