Files
railwaysystem/docs/codebase-audit/03_database_current_state.md
T

10 KiB
Raw Blame History

数据库当前状态

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 兼容性事实

当前配置与代码同时存在以下待验证点:

  1. application.yml 固定 pagehelper.helperDialect: mysql。
  2. ry_20250522.sql 大量使用 AUTO_INCREMENT、ENGINE=InnoDB、反引号、MySQL 类型宽度和 sysdate()。
  3. 系统 Mapper 使用 date_format(...)、find_in_set(...)、ifnull(...) 和反引号列名,例如 SysUserMapper.xml、SysDeptMapper.xml、SysMenuMapper.xml。
  4. DataScopeAspect 动态拼接 find_in_set。
  5. 代码生成器读取 information_schema 时同时依赖 current_database() 以及 MySQL 的 column_key、column_comment、extra='auto_increment'、column_type 语义。
  6. 培训设计文档采用 DATETIME、TINYINT、AUTO_INCREMENT 和 ON UPDATE CURRENT_TIMESTAMP。
  7. 培训数字主键依赖 JDBC generated keys。
  8. 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。