10 KiB
数据库当前状态
1. 审计边界与结论
本次只检查代码、Mapper XML、配置、SQL 文件和数据表设计文档,没有连接或查询实时数据库。因此本文件区分三种事实:
- 代码引用:Mapper 明确执行某张表。
- 设计存在:
doc/学员管理系统数据表设计_20260907_1_.docx描述了该表。 - 数据库实存:本次未验证,不能由 Entity 或 Mapper 的存在推导。
代码正配置为 KingbaseES,但仓库中的唯一系统初始化脚本和多处 Mapper 仍为 MySQL 方言;培训业务又完全没有可执行 DDL/迁移。这是继续开发前必须先确认的数据库基线问题。
2. 数据源与驱动
| 项目 | 当前状态 | 代码依据 |
|---|---|---|
| 数据库 | KingbaseES | RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml 使用 jdbc:kingbase8: |
| 驱动类 | com.kingbase8.Driver |
同上 |
| Maven 驱动 | com.kingbase:kingbase8:8.6.0 |
RuoYi-Vue/pom.xml、ruoyi-admin/pom.xml |
| 连接池 | Druid 1.2.27 | 根 POM、application-druid.yml |
| 当前库/schema | 配置指向 training / public |
application-druid.yml;主机、用户名和口令不在报告中复述 |
| 其他驱动 | MySQL Connector 仍在 ruoyi-admin 依赖中 |
RuoYi-Vue/ruoyi-admin/pom.xml:46 |
| PageHelper 方言 | 固定为 mysql |
application.yml:109 |
3. 表分类
A. 若依系统表,不建议修改
RuoYi-Vue/sql/ry_20250522.sql 定义并由 ruoyi-system、ruoyi-framework、ruoyi-quartz、ruoyi-generator 使用的主要表包括:
- 账号与组织:
sys_user、sys_dept、sys_post、sys_role。 - 权限关系:
sys_menu、sys_user_role、sys_role_menu、sys_role_dept、sys_user_post。 - 基础配置:
sys_config、sys_dict_type、sys_dict_data、sys_notice。 - 日志:
sys_oper_log、sys_logininfor。 - 定时任务:
sys_job、sys_job_log,以及quartz.sql中的qrtz_*表。 - 代码生成:
gen_table、gen_table_column。
这些表支撑若依登录、RBAC、菜单、数据权限、字典、配置、公告、日志、任务和代码生成。培训业务应通过新增菜单、角色关系和业务关联复用它们,不应改造其结构来代替培训领域表。本次未修改任何 sys_* 表。
B. 当前培训业务表
以下 14 张表同时出现在设计文档和 Mapper XML 中:
| 表 | Entity | 主键 | Mapper SQL | 设计字段与 Entity/Mapper |
|---|---|---|---|---|
train_teacher |
TrainTeacher |
t_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_student |
TrainStudent |
s_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_course |
TrainCourse |
c_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_class_plan |
TrainClassPlan |
plan_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_dormitory_info |
TrainDormitoryInfo |
dorm_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_dorm_auth |
TrainDormAuth |
auth_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
train_classroom_info |
TrainClassroomInfo |
class_room_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_training_site |
TrainTrainingSite |
site_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_class_report |
TrainClassReport |
report_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
train_electronic_board |
TrainElectronicBoard |
board_id / String |
查、增、改、物理删 | 显式业务字段一致;另继承 BaseEntity 属性 |
train_student_checkin |
TrainStudentCheckin |
checkin_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
train_score_info |
TrainScoreInfo |
score_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
train_study_duration |
TrainStudyDuration |
dur_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
train_student_portrait |
TrainStudentPortrait |
portrait_id / Long |
查、增、改、物理删;generated keys | 显式业务字段一致;另继承 BaseEntity 属性 |
“一致”仅指设计文档字段名与 Entity/Mapper 显式映射的静态比对,未验证真实 Kingbase 表结构、长度、默认值、约束和类型。
C. 代码中引用但设计文档没有的培训表
在 ruoyi-train/src/main/resources/mapper/train 的当前 14 个 XML 中未发现此类表。旧知识图谱/天气前端页面调用的接口没有相应当前培训后端 Controller,不能据此认定存在业务表。
D. 设计文档存在但代码尚未实现的表
以《学员管理系统数据表设计》列出的 14 张具体表为范围,未发现只在设计文档存在而完全没有 Entity/Mapper 的表。
需要区分:需求与功能分析材料提出或暗示了参训关系、课次/课表、床位、设备同步流水等概念,但这些并不是该数据表设计文档中已经命名的表,因此不计入本节 D 类;它们作为领域缺口列在 10_gap_and_conflict_analysis.md。
4. 字段与公共字段
14 个 Train* Domain 全部 extends BaseEntity。BaseEntity 提供:searchValue、createBy、createTime、updateBy、updateTime、remark、params。
当前培训设计和 Mapper 的实际使用方式并不完全统一:
- 教师、学员、课程、计划、宿舍、宿舍权限、教室、场地、班牌显式定义
createUser,映射数据库create_user;同时从 BaseEntity 继承createTime、updateTime、remark。 - 报到表只显式映射
create_time,没有create_user、update_time、remark。 - 签到表没有通用审计字段。
- 成绩表使用
import_time,学习时长表使用sync_time,画像表使用update_time。 - 培训表 Mapper 未使用 BaseEntity 的
createBy/updateBy写入create_by/update_by;业务表设计使用的是create_user。 - 部分 ServiceImpl 会设置
createTime或updateTime,但没有统一填充器;这不是 MyBatis-Plus 项目。
因此,虽然所有实体继承 BaseEntity,不能据此认为所有培训表都具备完整一致的若依公共字段。
5. 主键生成
- 字符串业务主键:
t_id、s_id、c_id、plan_id、dorm_id、class_room_id、site_id、board_id。Mapper 仅在属性非空时插入,没有 UUID/雪花算法等 Java 侧生成逻辑;前端表单需提供或数据库必须有另行默认值。 - 数字主键:
auth_id、report_id、checkin_id、score_id、dur_id、portrait_id。相应 XML 使用useGeneratedKeys="true"与keyProperty。 - 设计文档将数字主键写为
INT AUTO_INCREMENT。这属于 MySQL 表述;在 Kingbase 应由实际 identity/sequence 定义与驱动回填能力共同保证。本次未连接数据库,未验证生成键行为。
6. 删除方式
- 14 个培训 Mapper 的删除语句均为
delete from train_*,包括批量IN删除。 - 培训 Domain 未发现
delFlag,设计文档也未为这些表定义del_flag。 - 因此当前培训 CRUD 是物理删除,不是若依系统表常用的逻辑删除。
7. 外键与完整性
设计文档在描述列中标注多处“外键”,但仓库没有培训 DDL,也没有 FOREIGN KEY 约束脚本。Mapper 采用单表 SQL,ServiceImpl 未见关联对象存在性检查、级联策略或事务编排。
所以当前只能确认“字段表达了引用意图”,不能确认数据库中已创建外键、唯一索引或级联规则。
8. SQL 初始化与迁移
仓库中可见:
RuoYi-Vue/sql/ry_20250522.sql:若依系统表初始化,整体为 MySQL DDL/DML 风格。RuoYi-Vue/sql/quartz.sql:Quartz 表脚本。
未发现:
- 14 张
train_*表的可执行 DDL或种子数据。 - 培训
sys_menu、角色和权限初始化 SQL。 - Flyway、Liquibase 或其他版本化迁移目录/配置。
设计 DOCX 只是表结构说明,不是可执行迁移。
9. Kingbase 兼容性事实
当前配置与代码同时存在以下待验证点:
application.yml固定pagehelper.helperDialect: mysql。ry_20250522.sql大量使用AUTO_INCREMENT、ENGINE=InnoDB、反引号、MySQL 类型宽度和sysdate()。- 系统 Mapper 使用
date_format(...)、find_in_set(...)、ifnull(...)和反引号列名,例如SysUserMapper.xml、SysDeptMapper.xml、SysMenuMapper.xml。 DataScopeAspect动态拼接find_in_set。- 代码生成器读取
information_schema时同时依赖current_database()以及 MySQL 的column_key、column_comment、extra='auto_increment'、column_type语义。 - 培训设计文档采用
DATETIME、TINYINT、AUTO_INCREMENT和ON UPDATE CURRENT_TIMESTAMP。 - 培训数字主键依赖 JDBC generated keys。
- Druid 校验 SQL 为
SELECT 1 FROM DUAL。
这不等于所有语句在 Kingbase 必然失败,因为 Kingbase 可能启用兼容模式;但仓库没有记录目标兼容模式,也没有验证脚本/测试结果。不能把“已换驱动和 URL”视为完成数据库适配。
10. sys_* 表当前如何被使用
sys_user:登录主体、个人资料、用户管理、角色/岗位关系。sys_role:角色定义与数据范围类型。sys_menu:菜单树、路由组件、权限字符串;/getRouters动态返回前端路由。sys_role_menu、sys_user_role:RBAC 关系。sys_dept、sys_role_dept:部门树与数据权限。sys_oper_log、sys_logininfor:操作与登录日志。sys_dict_*、sys_config、sys_notice:字典、参数、公告。sys_job、sys_job_log:Quartz 任务定义与执行日志。
培训表当前未与 sys_user 建立代码层关系,培训 Service 也未应用若依数据权限切面。后续应在现有权限体系上增加培训关系和权限配置,不应修改系统表结构来复制一套登录/RBAC。