Files
tjt_czjs_backend/doc/数据库设计.md

698 lines
20 KiB
Markdown
Raw Normal View History

2026-01-19 18:54:03 +08:00
# Lyzsys 数据库设计文档
## 📖 目录
- [数据库概述](#数据库概述)
- [设计规范](#设计规范)
- [核心表设计](#核心表设计)
- [索引设计](#索引设计)
- [数据字典](#数据字典)
- [多租户设计](#多租户设计)
- [数据库优化](#数据库优化)
- [数据库管理](#数据库管理)
---
## 数据库概述
### 技术选型
| 特性 | 说明 |
|------|------|
| 数据库 | MySQL 5.7+ / 8.0+ |
| 字符集 | utf8mb4 |
| 排序规则 | utf8mb4_unicode_ci |
| 引擎 | InnoDB |
| 时区 | Asia/Shanghai |
### 支持的数据库
- MySQL 5.7、8.0+
- PostgreSQL 9.6+
| Oracle 11g+
| SQL Server 2012+
| H2 2.x (开发测试)
### 数据库特点
1. **多数据库支持**: 通过 MyBatis Plus 实现
2. **租户隔离**: 支持多租户数据隔离
3. **逻辑删除**: 支持软删除
4. **数据权限**: 支持行级数据权限
5. **审计日志**: 完整的创建、更新日志
---
## 设计规范
### 命名规范
#### 数据库命名
- 格式: `lyzsys`
- 示例: `lyzsys`
#### 表命名
- 格式: `{模块}_{业务}_{实体}`
- 规则: 小写字母 + 下划线
- 示例:
- `system_users` - 系统用户表
- `system_roles` - 系统角色表
- `mall_orders` - 商城订单表
- `bpm_process_instance` - 工作流实例表
#### 字段命名
- 格式: 小写字母 + 下划线
- 规则: 使用有意义的单词组合
- 示例:
- `user_id` - 用户 ID
- `user_name` - 用户名
- `create_time` - 创建时间
- `update_time` - 更新时间
#### 索引命名
- 主键索引: `PRIMARY`
- 唯一索引: `uniq_{字段名}`
- 普通索引: `idx_{字段名}`
- 示例:
- `uniq_username` - 用户名唯一索引
- `idx_dept_id` - 部门 ID 普通索引
### 字段类型
#### 整数类型
| 类型 | 字节 | 范围 | 用途 |
|------|------|------|------|
| TINYINT | 1 | -128 ~ 127 | 状态、标识 |
| SMALLINT | 2 | -32768 ~ 32767 | 枚举值 |
| INT | 4 | -21亿 ~ 21亿 | 数量、序号 |
| BIGINT | 8 | 极大数值 | 主键、外键 |
#### 字符串类型
| 类型 | 长度 | 用途 |
|------|------|------|
| CHAR | 0-255 | 固定长度字符串 |
| VARCHAR | 0-65535 | 变长字符串 |
| TEXT | 0-65535 | 长文本 |
| LONGTEXT | 0-4294967295 | 超长文本 |
#### 日期时间类型
| 类型 | 格式 | 用途 |
|------|------|------|
| DATE | YYYY-MM-DD | 日期 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 日期时间 |
| TIMESTAMP | 时间戳 | 时间戳 |
#### 小数类型
| 类型 | 用途 |
|------|------|
| DECIMAL(M,D) | 金额、精度数值 |
### 通用字段
每张表都包含以下通用字段:
```sql
-- 主键
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键'
-- 创建信息
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
creator VARCHAR(64) COMMENT '创建人'
-- 更新信息
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
updater VARCHAR(64) COMMENT '更新人'
-- 删除标记
deleted BIT NOT NULL DEFAULT FALSE COMMENT '是否删除'
-- 租户 ID (多租户表)
tenant_id BIGINT NOT NULL COMMENT '租户 ID'
```
---
## 核心表设计
### 系统管理模块
#### 1. 用户表 (system_users)
```sql
CREATE TABLE `system_users` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(30) NOT NULL COMMENT '用户账号',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`nickname` VARCHAR(30) NOT NULL COMMENT '用户昵称',
`remark` VARCHAR(500) COMMENT '备注',
`dept_id` BIGINT NOT NULL COMMENT '部门ID',
`post_ids` VARCHAR(255) COMMENT '岗位编号数组',
`email` VARCHAR(50) COMMENT '用户邮箱',
`mobile` VARCHAR(11) COMMENT '手机号码',
`sex` TINYINT COMMENT '用户性别',
`avatar` VARCHAR(100) COMMENT '头像地址',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '帐号状态0正常 1停用',
`login_ip` VARCHAR(50) COMMENT '最后登录IP',
`login_date` DATETIME COMMENT '最后登录时间',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
) ENGINE=InnoDB COMMENT='用户信息表';
```
#### 2. 角色表 (system_roles)
```sql
CREATE TABLE `system_roles` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`name` VARCHAR(30) NOT NULL COMMENT '角色名称',
`code` VARCHAR(100) NOT NULL COMMENT '角色权限字符串',
`sort` INT NOT NULL COMMENT '显示顺序',
`data_scope` TINYINT NOT NULL DEFAULT 1 COMMENT '数据范围1全部数据权限 2本部门及以下数据权限 3本部门数据权限 4仅本人数据权限',
`data_scope_dept_ids` VARCHAR(500) COMMENT '数据范围-部门数组',
`status` TINYINT NOT NULL COMMENT '角色状态0正常 1停用',
`type` TINYINT NOT NULL COMMENT '角色类型1系统内置 2自定义',
`remark` VARCHAR(500) COMMENT '备注',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='角色信息表';
```
#### 3. 菜单表 (system_menu)
```sql
CREATE TABLE `system_menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
`name` VARCHAR(50) NOT NULL COMMENT '菜单名称',
`permission` VARCHAR(100) NOT NULL COMMENT '权限标识',
`type` TINYINT NOT NULL COMMENT '菜单类型1目录 2菜单 3按钮',
`sort` INT NOT NULL DEFAULT 0 COMMENT '显示顺序',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父菜单ID',
`path` VARCHAR(200) COMMENT '路由地址',
`icon` VARCHAR(100) COMMENT '菜单图标',
`component` VARCHAR(255) COMMENT '组件路径',
`component_name` VARCHAR(255) COMMENT '组件名',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '菜单状态0正常 1停用',
`visible` BIT NOT NULL DEFAULT TRUE COMMENT '是否可见',
`keep_alive` BIT NOT NULL DEFAULT FALSE COMMENT '是否缓存',
`always_show` BIT NOT NULL DEFAULT FALSE COMMENT '是否总是显示',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='菜单权限表';
```
#### 4. 部门表 (system_dept)
```sql
CREATE TABLE `system_dept` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '部门id',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父部门id',
`name` VARCHAR(30) NOT NULL COMMENT '部门名称',
`sort` INT NOT NULL DEFAULT 0 COMMENT '显示顺序',
`leader_user_id` BIGINT COMMENT '负责人',
`phone` VARCHAR(11) COMMENT '联系电话',
`email` VARCHAR(64) COMMENT '邮箱',
`status` TINYINT NOT NULL COMMENT '部门状态0正常 1停用',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='部门表';
```
#### 5. 字典表 (system_dict_type)
```sql
CREATE TABLE `system_dict_type` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '字典主键',
`name` VARCHAR(100) NOT NULL COMMENT '字典名称',
`type` VARCHAR(100) NOT NULL COMMENT '字典类型',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0正常 1停用',
`remark` VARCHAR(500) COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_type` (`type`, `update_time`, `deleted`)
) ENGINE=InnoDB COMMENT='字典类型表';
```
### 基础设施模块
#### 6. 代码生成表 (infra_codegen_column)
```sql
CREATE TABLE `infra_codegen_column` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
`table_id` BIGINT NOT NULL COMMENT '表编号',
`column_name` VARCHAR(200) NOT NULL COMMENT '字段名',
`data_type` VARCHAR(100) NOT NULL COMMENT '字段类型',
`column_comment` VARCHAR(500) COMMENT '字段描述',
`nullable` BIT NOT NULL COMMENT '是否允许为空',
`pk` BIT NOT NULL COMMENT '是否主键',
`ordinal_position` INT NOT NULL COMMENT '排序',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='代码生成字段表';
```
#### 7. 定时任务表 (infra_job)
```sql
CREATE TABLE `infra_job` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '任务ID',
`name` VARCHAR(200) NOT NULL COMMENT '任务名称',
`status` TINYINT NOT NULL COMMENT '任务状态',
`handler_name` VARCHAR(200) NOT NULL COMMENT '处理器的名字',
`handler_param` VARCHAR(500) COMMENT '处理器的参数',
`cron_expression` VARCHAR(100) NOT NULL COMMENT 'Cron 表达式',
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '重试次数',
`retry_interval` INT NOT NULL DEFAULT 0 COMMENT '重试间隔',
`monitor_timeout` INT NOT NULL DEFAULT 0 COMMENT '监控超时时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='定时任务表';
```
### 工作流模块
#### 8. 流程实例表 (bpm_process_instance)
```sql
CREATE TABLE `bpm_process_instance` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
`process_definition_id` VARCHAR(64) NOT NULL COMMENT '流程定义的编号',
`process_instance_id` VARCHAR(64) NOT NULL COMMENT '流程实例的编号',
`start_user_id` BIGINT NOT NULL COMMENT '发起人的用户编号',
`name` VARCHAR(255) COMMENT '流程实例的名字',
`business_key` VARCHAR(64) COMMENT '业务标识',
`status` TINYINT NOT NULL COMMENT '流程实例的状态',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='流程实例表';
```
### 商城模块
#### 9. 商品表 (mall_product)
```sql
CREATE TABLE `mall_product` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品编号',
`name` VARCHAR(200) NOT NULL COMMENT '商品名称',
`sell_point` VARCHAR(500) COMMENT '卖点',
`description` VARCHAR(2000) COMMENT '商品详情',
`category_id` BIGINT NOT NULL COMMENT '分类编号',
`brand_id` BIGINT COMMENT '品牌编号',
`price` BIGINT NOT NULL COMMENT '价格,单位:分',
`stock` INT NOT NULL COMMENT '库存',
`pic_url` VARCHAR(500) COMMENT '商品主图',
`status` TINYINT NOT NULL COMMENT '商品状态',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='商品表';
```
#### 10. 订单表 (mall_order)
```sql
CREATE TABLE `mall_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`user_id` BIGINT NOT NULL COMMENT '用户编号',
`order_no` VARCHAR(64) NOT NULL COMMENT '订单号',
`total_price` BIGINT NOT NULL COMMENT '订单总价,单位:分',
`status` TINYINT NOT NULL COMMENT '订单状态',
`pay_time` DATETIME COMMENT '付款时间',
`delivery_time` DATETIME COMMENT '发货时间',
`receiver_time` DATETIME COMMENT '收货时间',
`comment_time` DATETIME COMMENT '评论时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_order_no` (`order_no`)
) ENGINE=InnoDB COMMENT='订单表';
```
---
## 索引设计
### 索引类型
#### 1. 主键索引 (PRIMARY KEY)
每张表都有主键索引:
```sql
PRIMARY KEY (`id`)
```
#### 2. 唯一索引 (UNIQUE)
用于保证字段的唯一性:
```sql
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
```
#### 3. 普通索引 (INDEX)
用于提升查询性能:
```sql
KEY `idx_dept_id` (`dept_id`)
```
#### 4. 联合索引
用于多字段查询:
```sql
KEY `idx_user_id_status` (`user_id`, `status`)
```
### 索引规范
1. **主键索引**: 使用自增 BIGINT
2. **唯一索引**: 业务唯一字段
3. **普通索引**: 频繁查询的字段
4. **联合索引**: 多字段组合查询,遵循最左前缀原则
5. **索引数量**: 单表索引不超过 5 个
### 索引示例
```sql
-- 用户表索引
PRIMARY KEY (`id`)
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
KEY `idx_dept_id` (`dept_id`)
KEY `idx_status` (`status`)
-- 订单表索引
PRIMARY KEY (`id`)
UNIQUE KEY `uniq_order_no` (`order_no`)
KEY `idx_user_id` (`user_id`)
KEY `idx_status` (`status`)
KEY `idx_create_time` (`create_time`)
```
---
## 数据字典
### 通用数据字典
#### 1. 用户性别 (system_user_sex)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 男 | blue |
| 2 | 女 | pink |
| 3 | 未知 | gray |
#### 2. 用户状态 (system_common_status)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 0 | 启用 | success |
| 1 | 停用 | danger |
#### 3. 菜单类型 (system_menu_type)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 目录 | |
| 2 | 菜单 | |
| 3 | 按钮 | |
#### 4. 数据范围 (system_data_scope)
| 字典值 | 字典标签 |
|--------|----------|
| 1 | 全部数据权限 |
| 2 | 本部门及以下数据权限 |
| 3 | 本部门数据权限 |
| 4 | 仅本人数据权限 |
#### 5. 流程实例状态 (bpm_process_instance_status)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 进行中 | primary |
| 2 | 已结束 | success |
---
## 多租户设计
### 租户隔离策略
#### 1. 共享数据库、共享 Schema
所有租户共享同一个数据库,通过 `tenant_id` 字段隔离。
#### 2. 自动过滤
MyBatis Plus 拦截器自动添加租户条件:
```java
// 查询时自动添加租户条件
List<UserDO> users = userMapper.selectList();
// 实际 SQL
SELECT * FROM system_users
WHERE deleted = 0
AND tenant_id = 1
```
### 租户表设计
#### 租户表 (system_tenant)
```sql
CREATE TABLE `system_tenant` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '租户编号',
`name` VARCHAR(30) NOT NULL COMMENT '租户名',
`contact_user_id` BIGINT NOT NULL COMMENT '联系人的用户编号',
`contact_name` VARCHAR(30) NOT NULL COMMENT '联系人',
`contact_mobile` VARCHAR(11) COMMENT '联系手机',
`status` TINYINT NOT NULL COMMENT '租户状态',
`website` VARCHAR(256) COMMENT '绑定域名',
`package_id` BIGINT NOT NULL COMMENT '租户套餐编号',
`expire_time` DATETIME NOT NULL COMMENT '过期时间',
`account_count` INT NOT NULL COMMENT '账号数量',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='租户表';
```
#### 租户套餐表 (system_tenant_package)
```sql
CREATE TABLE `system_tenant_package` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '套餐编号',
`name` VARCHAR(30) NOT NULL COMMENT '套餐名',
`status` TINYINT NOT NULL COMMENT '套餐状态',
`remark` VARCHAR(500) COMMENT '备注',
`menu_ids` VARCHAR(500) NOT NULL COMMENT '关联的菜单编号',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='租户套餐表';
```
---
## 数据库优化
### SQL 优化
#### 1. 避免全表扫描
```sql
-- 不推荐
SELECT * FROM system_users
-- 推荐
SELECT id, username, nickname FROM system_users
```
#### 2. 使用索引
```sql
-- 不推荐
SELECT * FROM system_users WHERE SUBSTRING(username, 1, 3) = 'adm'
-- 推荐
SELECT * FROM system_users WHERE username LIKE 'adm%'
```
#### 3. 分页查询
```sql
-- 使用分页插件
SELECT * FROM system_users
LIMIT 10 OFFSET 0
```
### 表结构优化
#### 1. 字段类型选择
```sql
-- 不推荐
VARCHAR(1000) -- 过长
-- 推荐
VARCHAR(200) -- 合理长度
```
#### 2. 字段数量控制
单表字段数量不超过 50 个。
#### 3. 表分区
大表可以采用分区策略:
```sql
-- 按时间分区
CREATE TABLE `system_operate_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`create_time` DATETIME NOT NULL,
PRIMARY KEY (`id`, `create_time`)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(create_time)) (
PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01'))
);
```
---
## 数据库管理
### 数据库备份
#### 1. 逻辑备份
```bash
# 备份
mysqldump -u root -p lyzsys > lyzsys_backup.sql
# 恢复
mysql -u root -p lyzsys < lyzsys_backup.sql
```
#### 2. 物理备份
```bash
# 复制数据文件
cp -r /var/lib/mysql/lyzsys /backup/lyzsys
```
### 数据库监控
#### 1. 慢查询日志
```sql
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
```
#### 2. 性能监控
```sql
-- 查看连接数
SHOW PROCESSLIST;
-- 查看状态
SHOW STATUS;
```
### 数据库维护
#### 1. 表优化
```sql
-- 优化表
OPTIMIZE TABLE system_users;
-- 分析表
ANALYZE TABLE system_users;
-- 修复表
REPAIR TABLE system_users;
```
#### 2. 索引优化
```sql
-- 查看索引使用情况
SHOW INDEX FROM system_users;
-- 删除无用索引
DROP INDEX idx_unused ON system_users;
```
---
**文档版本**: v1.0.0
**最后更新**: 2025-01-19
**维护团队**: Lyzsys 数据库团队