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

148 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库当前状态
## 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。