跳到主要内容

数据库表结构设计

引用文件

目录

  1. 项目概述
  2. 数据库设计原则
  3. 表命名规范
  4. 字段设计规范
  5. 索引策略
  6. 核心业务表结构
  7. 外键关系设计
  8. 数据完整性保障
  9. 分表分库策略
  10. 性能优化建议
  11. 运维实践
  12. 总结

项目概述

yudao-cloud是一个基于Spring Boot和Vue.js的企业级应用开发平台,采用MySQL作为主要数据库存储。该项目包含完整的用户认证授权、权限管理、系统监控、工作流管理等多个功能模块。

根据项目结构分析,数据库设计遵循了现代化的企业级应用设计原则,采用了模块化的表结构设计和完善的索引策略。

数据库设计原则

1. 统一性原则

  • 所有业务表均采用统一的字段设计模式
  • 使用统一的数据类型和约束规范
  • 保持表结构的一致性和可维护性

2. 可扩展性原则

  • 为未来功能扩展预留字段空间
  • 支持多租户架构设计
  • 具备良好的水平扩展能力

3. 完整性原则

  • 实施严格的外键约束
  • 采用软删除机制
  • 保证数据的一致性和完整性

4. 性能优先原则

  • 合理设计索引策略
  • 优化查询性能
  • 支持大数据量场景

表命名规范

命名约定

  • 系统模块表system_* 前缀,如 system_usersystem_role
  • 基础设施表infra_* 前缀,如 infra_configinfra_file
  • 业务流程表bpm_* 前缀,如 bpm_process_definition
  • 通用基础表:直接使用业务含义命名,如 dict_type

命名风格

  • 采用下划线分隔的蛇形命名法
  • 使用英文单词,避免拼音缩写
  • 保持语义清晰,便于理解

字段设计规范

标准字段设计

所有业务表都包含以下标准字段:

字段名类型约束说明
idbigint主键,自增记录唯一标识
creatorvarchar(64)可空创建者
create_timedatetime非空,默认当前时间创建时间
updatervarchar(64)可空更新者
update_timedatetime非空,默认当前时间更新时间
deletedbit(1)非空,默认0逻辑删除标记
tenant_idbigint非空,默认0租户标识

数据类型选择

  • 大整数:使用 bigint 存储ID和数值
  • 短文本:使用 varchar(n) 存储字符串
  • 长文本:使用 textmediumtext 存储大段文本
  • 日期时间:使用 datetime 存储时间戳
  • 布尔值:使用 tinyintbit(1) 存储开关状态

索引策略

主键索引

  • 所有表都定义了主键索引
  • 主键采用自增策略,确保插入性能
  • 主键索引使用 PRIMARY KEY 约束

唯一索引

  • 对于需要唯一性的字段建立唯一索引
  • system_oauth2_access_tokenaccess_token 字段
  • 唯一索引确保数据的唯一性

复合索引

  • 基于查询频率和条件组合建立复合索引
  • 优化常见的查询场景
  • 避免过度索引影响写入性能

索引示例

OAuth2令牌表索引

-- 访问令牌索引
INDEX `idx_access_token`(`access_token` ASC) USING BTREE,
-- 刷新令牌索引
INDEX `idx_refresh_token`(`refresh_token` ASC) USING BTREE

API访问日志索引

-- 时间戳索引
INDEX `idx_create_time`(`create_time` ASC) USING BTREE

短信验证码索引

-- 手机号索引
INDEX `idx_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号'

核心业务表结构

用户管理系统表

用户表 (system_user)

-- 用户基本信息表
CREATE TABLE system_user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL COMMENT '用户账号',
nickname VARCHAR(30) NOT NULL COMMENT '用户昵称',
avatar VARCHAR(500) COMMENT '头像地址',
status TINYINT NOT NULL DEFAULT 0 COMMENT '用户状态',
remark TEXT COMMENT '备注',
-- 标准字段...
);

角色表 (system_role)

-- 角色信息表
CREATE TABLE system_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
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 '数据范围',
data_scope_dept_ids VARCHAR(500) NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)',
status TINYINT NOT NULL COMMENT '角色状态',
type TINYINT NOT NULL COMMENT '角色类型',
remark TEXT COMMENT '备注',
-- 标准字段...
);

菜单表 (system_menu)

-- 菜单权限表
CREATE TABLE system_menu (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '菜单名称',
permission VARCHAR(100) NOT NULL DEFAULT '' COMMENT '权限标识',
type TINYINT NOT NULL COMMENT '菜单类型',
sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序',
parent_id BIGINT NOT NULL DEFAULT 0 COMMENT '父菜单ID',
path VARCHAR(200) COMMENT '路由地址',
icon VARCHAR(100) DEFAULT '#' COMMENT '菜单图标',
component VARCHAR(255) COMMENT '组件路径',
status TINYINT NOT NULL DEFAULT 0 COMMENT '菜单状态',
visible BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否可见',
-- 标准字段...
);

权限认证表

OAuth2客户端表 (system_oauth2_client)

-- OAuth2 客户端表
CREATE TABLE system_oauth2_client (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
client_id VARCHAR(255) NOT NULL COMMENT '客户端编号',
secret VARCHAR(255) NOT NULL COMMENT '客户端密钥',
name VARCHAR(255) NOT NULL COMMENT '应用名',
logo VARCHAR(255) NOT NULL COMMENT '应用图标',
status TINYINT NOT NULL COMMENT '状态',
access_token_validity_seconds INT NOT NULL COMMENT '访问令牌有效期',
redirect_uris VARCHAR(255) NOT NULL COMMENT '重定向URI地址',
scopes VARCHAR(255) COMMENT '授权范围',
-- 标准字段...
);

OAuth2访问令牌表 (system_oauth2_access_token)

-- OAuth2 访问令牌
CREATE TABLE system_oauth2_access_token (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '用户编号',
user_type TINYINT NOT NULL COMMENT '用户类型',
access_token VARCHAR(255) NOT NULL COMMENT '访问令牌',
refresh_token VARCHAR(32) NOT NULL COMMENT '刷新令牌',
client_id VARCHAR(255) NOT NULL COMMENT '客户端编号',
expires_time DATETIME NOT NULL COMMENT '过期时间',
-- 标准字段...
);

系统监控表

API访问日志表 (infra_api_access_log)

-- API 访问日志表
CREATE TABLE infra_api_access_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
trace_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '链路追踪编号',
user_id BIGINT NOT NULL DEFAULT 0 COMMENT '用户编号',
application_name VARCHAR(50) NOT NULL COMMENT '应用名',
request_method VARCHAR(16) NOT NULL DEFAULT '' COMMENT '请求方法名',
request_url VARCHAR(255) NOT NULL DEFAULT '' COMMENT '请求地址',
begin_time DATETIME NOT NULL COMMENT '开始请求时间',
end_time DATETIME NOT NULL COMMENT '结束请求时间',
duration INT NOT NULL COMMENT '执行时长',
result_code INT NOT NULL DEFAULT 0 COMMENT '结果码',
-- 标准字段...
);

操作日志表 (system_operate_log)

-- 操作日志记录 V2 版本
CREATE TABLE system_operate_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
trace_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '链路追踪编号',
user_id BIGINT NOT NULL COMMENT '用户编号',
user_type TINYINT NOT NULL DEFAULT 0 COMMENT '用户类型',
type VARCHAR(50) NOT NULL COMMENT '操作模块类型',
action VARCHAR(2000) NOT NULL DEFAULT '' COMMENT '操作内容',
success BIT(1) NOT NULL DEFAULT b'1' COMMENT '操作结果',
request_method VARCHAR(16) COMMENT '请求方法名',
request_url VARCHAR(255) COMMENT '请求地址',
-- 标准字段...
);

工作流管理表

BPM流程分类表 (bpm_category)

-- BPM 流程分类
CREATE TABLE bpm_category (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) DEFAULT '' COMMENT '分类名',
code VARCHAR(30) DEFAULT '' COMMENT '分类标志',
description VARCHAR(255) NOT NULL DEFAULT '' COMMENT '分类描述',
status TINYINT COMMENT '分类状态',
sort INT COMMENT '分类排序',
-- 标准字段...
);

BPM表单定义表 (bpm_form)

-- BPM 表单定义表
CREATE TABLE bpm_form (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64) NOT NULL COMMENT '表单名',
status TINYINT NOT NULL COMMENT '开启状态',
conf VARCHAR(1000) NOT NULL COMMENT '表单的配置',
fields VARCHAR(5000) NOT NULL COMMENT '表单项的数组',
remark VARCHAR(255) COMMENT '备注',
-- 标准字段...
);

外键关系设计

关系映射

项目采用松耦合的外键设计,主要通过业务逻辑保证数据一致性:

Mermaid Diagram Code:

erDiagram
SYSTEM_USER ||--o{ SYSTEM_USER_ROLE : "拥有"
SYSTEM_ROLE ||--o{ SYSTEM_USER_ROLE : "分配给"
SYSTEM_MENU ||--o{ SYSTEM_ROLE_MENU : "关联"
SYSTEM_ROLE ||--o{ SYSTEM_ROLE_MENU : "拥有"
SYSTEM_USER {
bigint id PK
varchar username
varchar nickname
bigint tenant_id
}
SYSTEM_ROLE {
bigint id PK
varchar name
varchar code
bigint tenant_id
}
SYSTEM_MENU {
bigint id PK
varchar name
varchar permission
bigint tenant_id
}
SYSTEM_USER_ROLE {
bigint id PK
bigint user_id FK
bigint role_id FK
}
SYSTEM_ROLE_MENU {
bigint id PK
bigint role_id FK
bigint menu_id FK
}

外键约束策略

  • 软外键:通过业务层验证替代硬外键约束
  • 级联更新:支持用户信息变更时的级联更新
  • 数据隔离:通过租户ID实现数据隔离

数据完整性保障

事务控制

  • 所有关键业务操作都在事务中执行
  • 支持分布式事务处理
  • 提供事务回滚机制

并发控制

  • 使用乐观锁防止并发更新冲突
  • 支持批量操作的原子性
  • 提供数据版本控制

数据验证

  • 前端和后端双重数据验证
  • 采用Bean Validation进行参数校验
  • 支持自定义验证规则

分表分库策略

水平分片策略

基于时间的分片

Mermaid Diagram Code:

flowchart TD
Start([数据写入]) --> CheckTime["检查数据时间"]
CheckTime --> IsOld{"是否历史数据?"}
IsOld --> |是| OldShard["历史分片表"]
IsOld --> |否| NewShard["实时分片表"]
OldShard --> InsertOld["插入历史表"]
NewShard --> InsertNew["插入实时表"]
InsertOld --> End([完成])
InsertNew --> End

基于用户ID的分片

  • 用户表按用户ID取模分片
  • 支持动态扩缩容
  • 提供分片迁移工具

垂直分片策略

  • 将大字段分离到独立表
  • 优化热点数据访问
  • 支持冷热数据分离

分片实施步骤

  1. 评估分片需求:分析数据增长趋势和访问模式
  2. 设计分片规则:确定分片键和分片算法
  3. 数据迁移:制定平滑的数据迁移方案
  4. 系统改造:修改应用代码以支持分片
  5. 监控验证:验证分片效果和性能指标

性能优化建议

查询优化

  • 索引优化:为高频查询字段建立合适索引
  • 查询重写:避免SELECT *,只查询必要字段
  • 分页优化:使用LIMIT和OFFSET优化大数据量查询
  • 连接优化:合理使用JOIN,避免笛卡尔积

缓存策略

  • Redis缓存:缓存热点数据和配置信息
  • 本地缓存:使用Caffeine减少数据库访问
  • 查询缓存:对静态数据启用查询缓存

连接池优化

  • 连接池配置:合理设置最大连接数和超时时间
  • 连接复用:使用连接池复用数据库连接
  • 连接监控:监控连接池使用情况

存储优化

  • 压缩存储:对大文本字段启用压缩
  • 分区表:对历史数据使用分区表
  • 归档策略:定期归档历史数据

运维实践

备份策略

Mermaid Diagram Code:

flowchart TD
Daily[每日增量备份] --> Weekly[每周全量备份]
Weekly --> Monthly[每月全量备份]
Monthly --> Quarterly[每季度异地备份]
Quarterly --> Yearly[每年离线备份]
Daily --> Archive[备份归档]
Weekly --> Archive
Monthly --> Archive
Quarterly --> Archive
Yearly --> Archive

监控指标

  • 数据库性能:QPS、TPS、连接数、慢查询
  • 存储空间:表大小、索引大小、日志文件
  • 系统资源:CPU、内存、磁盘IO、网络带宽

故障处理

  • 故障预警:设置合理的告警阈值
  • 快速恢复:制定详细的故障恢复流程
  • 数据修复:提供数据修复和恢复工具

版本管理

  • 数据库版本控制:使用Liquibase管理数据库变更
  • 迁移脚本:提供完整的数据库迁移脚本
  • 回滚机制:支持数据库版本回滚

总结

yudao-cloud的数据库设计体现了现代企业级应用的最佳实践:

设计优势

  • 标准化程度高:统一的表结构和字段设计
  • 扩展性强:支持多租户和水平扩展
  • 性能优化:合理的索引策略和查询优化
  • 运维友好:完善的监控和备份机制

技术特点

  • 采用模块化设计,便于功能扩展
  • 实施软删除机制,保证数据安全
  • 支持多种数据库适配,提高兼容性
  • 提供完整的运维工具链

发展方向

随着业务规模的增长,建议持续优化:

  • 进一步完善分片策略
  • 加强缓存和CDN优化
  • 增强数据分析和报表功能
  • 提升自动化运维水平

通过遵循这些设计原则和最佳实践,yudao-cloud能够为企业提供稳定可靠的数据存储解决方案。

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答