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