199 lines
12 KiB
Markdown
199 lines
12 KiB
Markdown
# RailwaySystem 数据库 V2 表结构清单与模型比对 (Round 1 修订版)
|
||||
|
|
|
|||
|
|
> **技术依据**:[`RailwaySystem 数据库 V2 字段设计与 Kingbase DDL 规范 V1.0.md`](file:///Users/wzb/Desktop/项目/RailwaySystem/doc/RailwaySystem%20数据库%20V2%20字段设计与%20Kingbase%20DDL%20规范%20V1.0.md)
|
|||
|
|
> **状态**:一期 21 张培训业务表全覆盖冻结清单(已完成 Round 1 字段与约束精确审查修订)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 21 张正式表全景分类
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
mindmap
|
|||
|
|
root((RailwaySystem V2 业务表))
|
|||
|
|
基础资料表 (9张)
|
|||
|
|
train_teacher (教师主档)
|
|||
|
|
train_student (学员长期主档)
|
|||
|
|
train_course (课程基础主档)
|
|||
|
|
train_resource (新增: 统一教学资源)
|
|||
|
|
train_course_resource (新增: 课程资源关联)
|
|||
|
|
train_classroom_info (教室信息)
|
|||
|
|
train_training_site (实训场地)
|
|||
|
|
train_electronic_board (电子班牌设备)
|
|||
|
|
train_dormitory_info (宿舍房间)
|
|||
|
|
培训组织表 (4张)
|
|||
|
|
train_class_plan (培训班主档)
|
|||
|
|
train_plan_course (新增: 培训班课程实例)
|
|||
|
|
train_enrollment (新增: 学员参训档案)
|
|||
|
|
train_lesson (新增: 教学活动课次)
|
|||
|
|
培训执行表 (4张)
|
|||
|
|
train_accommodation (新增: 学员住宿安排)
|
|||
|
|
train_dorm_auth (门禁授权同步)
|
|||
|
|
train_class_report (现场报到记录)
|
|||
|
|
train_student_checkin (课次考勤打卡)
|
|||
|
|
培训结果表 (4张)
|
|||
|
|
train_score_item (新增: 考核成绩项配置)
|
|||
|
|
train_student_score (新增: 学员单项成绩明细)
|
|||
|
|
train_study_duration (自主学习时长记录)
|
|||
|
|
train_student_portrait (学员全期画像评估)
|
|||
|
|
淘汰表 (1张)
|
|||
|
|
train_score_info (彻底下线)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 三大核心 ID 架构映射
|
|||
|
|
|
|||
|
|
V2 架构通过三个领域核心 ID 彻底取代旧模型中跨多表重复冗余的复合外键串(`student_id + plan_id + c_id + lesson_time`):
|
|||
|
|
|
|||
|
|
| 核心 ID 标识 | 业务实体表 | 业务语义 | 衍生与引用的业务表 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| **`enrollment_id`** | [`train_enrollment`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql#L72) | **某学员参加某一期培训班的参训全生命周期档案** | `train_accommodation`<br>`train_class_report`<br>`train_student_checkin`<br>`train_student_score`<br>`train_study_duration`<br>`train_student_portrait` |
|
|||
|
|
| **`plan_course_id`** | [`train_plan_course`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql#L52) | **某一期培训班中包含的某一门具体课程实例** | `train_lesson`<br>`train_score_item`<br>`train_study_duration` |
|
|||
|
|
| **`lesson_id`** | [`train_lesson`](file:///Users/wzb/Desktop/项目/RailwaySystem/RuoYi-Vue/sql/train/v2/002_create_new_tables.sql#L106) | **本期某门课程中的具体一次教学活动(课表课次)** | `train_student_checkin` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 21 张正式表详细结构与新旧比对 (含 Round 1 修订)
|
|||
|
|
|
|||
|
|
### 3.1 基础资料模块 (9 张)
|
|||
|
|
|
|||
|
|
#### 1. `train_teacher` (保留并结构升级)
|
|||
|
|
- **主键**:`t_id` (varchar(32))
|
|||
|
|
- **数据保留**:保留当前生产环境唯一 1 行数据。
|
|||
|
|
- **字段变更**:
|
|||
|
|
- 新增:`user_id` (bigint), `org_name` (varchar(100)), `job_title` (varchar(50)), `status` (smallint NOT NULL), `create_by` (varchar(64)), `update_by` (varchar(64)), `del_flag` (char(1) NOT NULL);
|
|||
|
|
- 调整列宽:`t_name` varchar(50), `t_email` varchar(100), `remark` varchar(500);
|
|||
|
|
- 数据迁移:由 `008_migrate_teacher.sql` 将 `t_department` -> `org_name`, `t_title` -> `job_title`, `create_user` -> `create_by`,并在校验后将 `status` 与 `del_flag` 固化为 `NOT NULL`;
|
|||
|
|
- 淘汰删除:`t_department`, `t_title`, `create_user`。
|
|||
|
|
|
|||
|
|
#### 2. `train_student` (保留并重构为企业培训主档)
|
|||
|
|
- **主键**:`s_id` (varchar(32))
|
|||
|
|
- **字段变更**:
|
|||
|
|
- 彻底淘汰高校概念旧列:删除 `s_department`, `s_major`, `s_class`, `create_user`;
|
|||
|
|
- 新增:`user_id` (bigint), `org_name` (varchar(100)), `s_email` (varchar(100)), `id_card_ciphertext` (text, 密文), `id_card_hash` (varchar(128), 精确防重哈希), `id_card_last4` (varchar(4), 脱敏展示), `face_ref` (varchar(255), 人脸凭据), `source_type` (smallint NOT NULL, 1管理员录入/2Excel导入/3平台同步), `status` (smallint NOT NULL), `create_by`, `update_by`, `del_flag`;
|
|||
|
|
- 约束:`UNIQUE(id_card_hash)` (允许为 NULL)。
|
|||
|
|
|
|||
|
|
#### 3. `train_course` (保留并解耦资源附件)
|
|||
|
|
- **主键**:`c_id` (varchar(32))
|
|||
|
|
- **字段变更**:
|
|||
|
|
- 彻底淘汰集中附件旧列:删除 `attach_doc`, `attach_video`, `attach_model_link`, `model_resource_ids`, `create_user`;
|
|||
|
|
- 新增:`c_code` (varchar(50), 统一编码), `status` (smallint NOT NULL), `create_by`, `update_by`, `del_flag`;
|
|||
|
|
- 约束:`UNIQUE(c_code)`。
|
|||
|
|
|
|||
|
|
#### 4. `train_resource` (V2 全新建表)
|
|||
|
|
- **主键**:`resource_id` (varchar(32))
|
|||
|
|
- **字段**:`resource_id`, `resource_name`, `resource_type` (1文档/2视频/3 3D模型/4 VR资源/5外部链接/6其他), `resource_url`, `description`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`。
|
|||
|
|
|
|||
|
|
#### 5. `train_course_resource` (V2 全新建表)
|
|||
|
|
- **主键**:`id` (bigint identity)
|
|||
|
|
- **字段**:`id`, `c_id`, `resource_id`, `sort_no`, `create_by`, `create_time`。
|
|||
|
|
- **约束**:`UNIQUE(c_id, resource_id)`, 外键指向 `train_course` 与 `train_resource`。
|
|||
|
|
|
|||
|
|
#### 6. `train_classroom_info` (保留并补齐审计)
|
|||
|
|
- **主键**:`class_room_id` (varchar(32))
|
|||
|
|
- **字段变更**:删除 `create_user`;补齐 `create_by`, `update_by`, `del_flag`;设置 `room_status` NOT NULL。
|
|||
|
|
|
|||
|
|
#### 7. `train_training_site` (保留并补齐审计)
|
|||
|
|
- **主键**:`site_id` (varchar(32))
|
|||
|
|
- **字段变更**:删除 `create_user`;补齐 `create_by`, `update_by`, `del_flag`;设置 `site_status` NOT NULL。
|
|||
|
|
|
|||
|
|
#### 8. `train_electronic_board` (保留并升级交互架构)
|
|||
|
|
- **主键**:`board_id` (varchar(32))
|
|||
|
|
- **字段变更**:
|
|||
|
|
- 解绑旧关系:删除 `bind_plan_id`, `board_content`, `board_playmode`, `create_user`;
|
|||
|
|
- 新增:`board_name` (varchar(100) NOT NULL, 必填无默认空串), `api_endpoint` (varchar(255)), `create_by`, `update_by`, `del_flag`;
|
|||
|
|
- 约束:`UNIQUE(board_sn)`。
|
|||
|
|
|
|||
|
|
#### 9. `train_dormitory_info` (保留并优化房态模型)
|
|||
|
|
- **主键**:`dorm_id` (varchar(32))
|
|||
|
|
- **字段变更**:
|
|||
|
|
- 移除旧计数列:删除 `bed_total`, `bed_used`;
|
|||
|
|
- 新增:`dorm_floor` (varchar(20) NOT NULL, 无猜测默认值), `capacity` (integer NOT NULL, 无猜测默认值), `gender_type` (smallint, 0不限/1男/2女), `create_by`, `update_by`, `del_flag`;
|
|||
|
|
- 约束:`UNIQUE(dorm_building, dorm_room)`, `CHECK (capacity > 0)`。
|
|||
|
|
- **特别声明**:严禁增加 `train_dorm_bed` 表。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3.2 培训组织模块 (4 张)
|
|||
|
|
|
|||
|
|
#### 10. `train_class_plan` (保留并重构为一班多课)
|
|||
|
|
- **主键**:`plan_id` (varchar(32))
|
|||
|
|
- **字段变更**:删除旧单课 `c_id` 与旧教师 `t_id` 及 `create_user`;新增 `report_deadline`, `create_by`, `update_by`, `del_flag`。
|
|||
|
|
|
|||
|
|
#### 11. `train_plan_course` (V2 全新建表)
|
|||
|
|
- **主键**:`plan_course_id` (bigint identity)
|
|||
|
|
- **字段**:`plan_course_id`, `plan_id`, `c_id`, `sort_no`, `create_by`, `create_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(plan_id, c_id)`。
|
|||
|
|
|
|||
|
|
#### 12. `train_enrollment` (V2 全新建表 - 系统最核心关系)
|
|||
|
|
- **主键**:`enrollment_id` (bigint identity)
|
|||
|
|
- **字段**:`enrollment_id`, `plan_id`, `student_id`, `source_type` (smallint NOT NULL, 参训名单来源,由 train_enrollment_source 字典定义,无默认值), `enrollment_status` (DEFAULT 0 待报到), `accommodation_required` (smallint NOT NULL, 无默认值), `join_time`, `complete_time`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(plan_id, student_id)`。
|
|||
|
|
- **注意**:此处 `source_type` 表示学员进入本期培训班名单的来源,与 `train_student.source_type`(长期人员主档来源)语义完全不同,严禁混用。
|
|||
|
|
|
|||
|
|
#### 13. `train_lesson` (V2 全新建表)
|
|||
|
|
- **主键**:`lesson_id` (bigint identity)
|
|||
|
|
- **字段**:`lesson_id`, `plan_course_id`, `t_id` (varchar(32) NOT NULL, 课次必要组成), `start_time`, `end_time`, `venue_type` (smallint NOT NULL, 1普通教室/2实训场地,无默认值), `class_room_id`, `site_id`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:
|
|||
|
|
- `CHECK (start_time < end_time)`;
|
|||
|
|
- `CHECK ((venue_type = 1 AND class_room_id IS NOT NULL AND site_id IS NULL) OR (venue_type = 2 AND site_id IS NOT NULL AND class_room_id IS NULL))` (场地单行互斥)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3.3 培训执行模块 (4 张)
|
|||
|
|
|
|||
|
|
#### 14. `train_accommodation` (V2 全新建表)
|
|||
|
|
- **主键**:`accommodation_id` (bigint identity)
|
|||
|
|
- **字段**:`accommodation_id`, `enrollment_id`, `dorm_id`, `bed_no`, `assigned_time`, `accommodation_status` (smallint NOT NULL DEFAULT 0, 0预分配/1已入住/2已退宿), `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(enrollment_id)`。
|
|||
|
|
|
|||
|
|
#### 15. `train_dorm_auth` (重构重建)
|
|||
|
|
- **主键**:`auth_id` (bigint identity)
|
|||
|
|
- **字段**:`auth_id`, `accommodation_id`, `auth_start`, `auth_end`, `face_sync_status` (DEFAULT 0 待下发), `retry_count` (DEFAULT 0), `last_error`, `external_auth_id`, `last_sync_time`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(accommodation_id)`。
|
|||
|
|
|
|||
|
|
#### 16. `train_class_report` (重构重建)
|
|||
|
|
- **主键**:`report_id` (bigint identity)
|
|||
|
|
- **字段**:`report_id`, `enrollment_id`, `report_way` (smallint NOT NULL), `report_device_sn`, `report_time`, `verify_result` (smallint NOT NULL, 1通过/2不匹配/3人工放行,无默认值), `verify_note`, `create_by`, `create_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(enrollment_id)`。
|
|||
|
|
|
|||
|
|
#### 17. `train_student_checkin` (重构重建)
|
|||
|
|
- **主键**:`checkin_id` (bigint identity)
|
|||
|
|
- **字段**:`checkin_id`, `enrollment_id`, `lesson_id`, `board_id`, `checkin_way` (smallint NOT NULL, 1人脸/2刷卡/3扫码/4代签,无默认值), `sign_in_time`, `sign_out_time`, `attendance_status` (DEFAULT 0 缺勤), `manual_flag` (DEFAULT 0 自动), `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(enrollment_id, lesson_id)`。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3.4 培训结果模块 (4 张)
|
|||
|
|
|
|||
|
|
#### 18. `train_score_item` (V2 全新建表)
|
|||
|
|
- **主键**:`score_item_id` (bigint identity)
|
|||
|
|
- **字段**:`score_item_id`, `plan_id`, `plan_course_id`, `item_name`, `item_type`, `weight`, `full_score`, `sort_no`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`CHECK (weight >= 0.00 AND weight <= 100.00)`, `CHECK (full_score > 0.00)`。
|
|||
|
|
|
|||
|
|
#### 19. `train_student_score` (V2 全新建表)
|
|||
|
|
- **主键**:`score_id` (bigint identity)
|
|||
|
|
- **字段**:`score_id`, `enrollment_id`, `score_item_id`, `score` (numeric(7,2) NOT NULL, 无默认0), `source_type`, `source_system`, `source_event_id`, `import_time`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(enrollment_id, score_item_id)`, `CHECK (score >= 0.00)`。
|
|||
|
|
|
|||
|
|
#### 20. `train_study_duration` (重构重建)
|
|||
|
|
- **主键**:`dur_id` (bigint identity)
|
|||
|
|
- **字段**:`dur_id`, `enrollment_id`, `plan_course_id`, `resource_id`, `learning_content`, `source_system`, `source_event_id`, `start_time`, `end_time`, `study_seconds`, `sync_time`, `create_by`, `create_time`, `remark`。
|
|||
|
|
- **约束**:
|
|||
|
|
- `CHECK (study_seconds >= 0)`;
|
|||
|
|
- `CHECK (end_time IS NULL OR start_time IS NULL OR end_time >= start_time)`;
|
|||
|
|
- `CHECK (source_event_id IS NULL OR source_system IS NOT NULL)`;
|
|||
|
|
- 双非空部分唯一索引:`UNIQUE(source_system, source_event_id) WHERE source_system IS NOT NULL AND source_event_id IS NOT NULL`。
|
|||
|
|
|
|||
|
|
#### 21. `train_student_portrait` (重构重建)
|
|||
|
|
- **主键**:`portrait_id` (bigint identity)
|
|||
|
|
- **字段**:`portrait_id`, `enrollment_id`, `attendance_rate`, `theory_score`, `practical_score`, `total_study_hour`, `label_tag`, `portrait_content`, `generated_time`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`。
|
|||
|
|
- **约束**:`UNIQUE(enrollment_id)`。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 淘汰旧表说明
|
|||
|
|
|
|||
|
|
### `train_score_info`
|
|||
|
|
- **处理方式**:彻底下线并从 public 生产 schema 中 DROP;
|
|||
|
|
- **现状保障**:实测当前行数精确为 0,无任何真实数据迁移风险。
|