# 帽石系统 - 数据表结构设计文档 > 适用数据库:MySQL 5.7+ > 对应建表语句:`capstone_exam.sql` > 表名:`t_capstone_exam` --- ## 1. 业务背景 帽石系统用于记录考生对“帽石”进行检测/考试的全程数据。系统可提供的信息包括: - 考生 ID(需同步给对方系统) - 帽石编号 - 实际位置 XY(标准/目标坐标) - 实测数据 XY(考生现场实测坐标) - 出题人 - 成绩 - 考试时间 - 是否合格 本设计围绕以上字段建立单表存储模型,并补充审计字段与同步状态字段,便于跨系统对接与运维。 --- ## 2. 表结构字段说明 | 字段名 | 类型 | 允许空 | 默认值 | 说明 | | --- | --- | --- | --- | --- | | `id` | BIGINT | 否 | 自增 | 主键 ID | | `candidate_id` | VARCHAR(64) | 否 | - | 考生 ID(由外部系统同步至对方系统,作为跨系统关联键) | | `capstone_no` | VARCHAR(64) | 否 | - | 帽石编号 | | `actual_position_x` | DECIMAL(10,3) | 是 | NULL | 实际位置 X(标准/目标坐标) | | `actual_position_y` | DECIMAL(10,3) | 是 | NULL | 实际位置 Y(标准/目标坐标) | | `measured_x` | DECIMAL(10,3) | 是 | NULL | 实测数据 X(考生现场实测坐标) | | `measured_y` | DECIMAL(10,3) | 是 | NULL | 实测数据 Y(考生现场实测坐标) | | `setter` | VARCHAR(64) | 是 | NULL | 出题人 | | `score` | DECIMAL(6,2) | 是 | NULL | 成绩 | | `exam_time` | DATETIME | 否 | - | 考试时间 | | `qualified` | TINYINT(1) | 否 | 0 | 是否合格:0-不合格,1-合格 | | `sync_status` | TINYINT(1) | 否 | 0 | 同步状态:0-未同步,1-已同步(考生 ID 已同步至对方) | | `remark` | VARCHAR(255) | 是 | NULL | 备注 | | `create_time` | DATETIME | 否 | CURRENT_TIMESTAMP | 创建时间 | | `update_time` | DATETIME | 否 | CURRENT_TIMESTAMP(自动更新) | 更新时间 | | `del_flag` | TINYINT(1) | 否 | 0 | 删除标志:0-未删除,1-已删除(软删除) | | `deviation_x` | DECIMAL(11,3) | 是 | 派生 | **生成列**:位置偏差 X = `measured_x - actual_position_x` | | `deviation_y` | DECIMAL(11,3) | 是 | 派生 | **生成列**:位置偏差 Y = `measured_y - actual_position_y` | ### 坐标与偏差说明 - “实际位置 XY”理解为标准/理论目标坐标;“实测数据 XY”为考生现场测得坐标。 - `deviation_x / deviation_y` 用 **MySQL 5.7 生成列(VIRTUAL)** 实时计算 `实测 - 实际`, 不占用额外存储空间,且不会出现“存了偏差却和原始值对不上”的不一致问题。 - 坐标为 DECIMAL(10,3),如需更高精度(如亚毫米),可调整为 DECIMAL(12,4) 等。 --- ## 3. 索引设计 | 索引名 | 字段 | 类型 | 作用 | | --- | --- | --- | --- | | `PRIMARY` | `id` | 主键 | 行唯一标识、聚簇索引 | | `uk_candidate_capstone_time` | `candidate_id`, `capstone_no`, `exam_time` | 唯一索引 | 防止同一考生在同一时间对同一帽石重复录入 | | `idx_candidate` | `candidate_id` | 普通索引 | 按考生维度查询/对账 | | `idx_capstone` | `capstone_no` | 普通索引 | 按帽石维度统计 | | `idx_exam_time` | `exam_time` | 普通索引 | 按考试时间区间检索 | | `idx_qualified` | `qualified` | 普通索引 | 合格/不合格快速筛选 | > 说明:唯一索引包含 `exam_time`(NOT NULL),若业务允许“同一次考试多场次”,可将 `exam_time` 从唯一约束中移除或改为场次字段。 --- ## 4. 关于“考生 ID 同步给对方” - `candidate_id` 是外部系统(对方)的主键/唯一编号,**本表只引用、不生成**。 - `sync_status` 标记该条记录的考生信息是否已成功同步至对方系统: - `0` = 未同步 / 同步中 - `1` = 已同步 - 建议同步任务:查询 `sync_status = 0 AND del_flag = 0` 的记录,调用对方接口同步,成功后置 `sync_status = 1`。 --- ## 5. 常用操作示例 ### 5.1 插入一条考试记录 ```sql INSERT INTO t_capstone_exam (candidate_id, capstone_no, actual_position_x, actual_position_y, measured_x, measured_y, setter, score, exam_time, qualified) VALUES ('STD20260001', 'MS-1001', 12.500, 34.200, 12.480, 34.215, '张老师', 92.50, '2026-10-28 09:30:00', 1); ``` ### 5.2 查询某考生是否合格 ```sql SELECT capstone_no, score, qualified, exam_time FROM t_capstone_exam WHERE candidate_id = 'STD20260001' AND del_flag = 0 ORDER BY exam_time DESC; ``` ### 5.3 统计合格/不合格人数 ```sql SELECT qualified, COUNT(*) AS cnt FROM t_capstone_exam WHERE del_flag = 0 GROUP BY qualified; ``` ### 5.4 查询偏差较大的记录(实测偏离实际 > 0.1) ```sql SELECT candidate_id, capstone_no, actual_position_x, actual_position_y, measured_x, measured_y, deviation_x, deviation_y FROM t_capstone_exam WHERE del_flag = 0 AND (ABS(deviation_x) > 0.1 OR ABS(deviation_y) > 0.1); ``` ### 5.5 标记已同步至对方系统 ```sql UPDATE t_capstone_exam SET sync_status = 1 WHERE id = 1; ``` ### 5.6 软删除(保留数据痕迹) ```sql UPDATE t_capstone_exam SET del_flag = 1 WHERE id = 1; ``` --- ## 6. 设计要点与扩展建议 1. **单表优先**:当前字段均为“一次考试一条记录”的扁平属性,单表即可满足,查询简单、易维护。 2. **坐标拆分**:XY 拆成独立列而非合并字符串,便于数值计算、偏差统计与范围检索。 3. **偏差用生成列**:避免冗余存储与数据不一致,MySQL 5.7 原生支持。 4. **审计字段**:`create_time / update_time / del_flag` 遵循常规后台系统规范,利于排查与软删除。 5. **可扩展方向**(按需追加): - 若帽石有独立属性(类型、规格、所属区段),可建 `t_capstone`(帽石主数据表),本表 `capstone_no` 作为外键引用; - 若需留存每次实测的原始报文/图片,可加 `raw_data` / `image_url` 字段或独立附件表; - 若成绩需要分项(理论分、实操分),可拆 `score` 为 `score_theory / score_practice`。 --- ## 7. MySQL 5.7 兼容性确认 - `ENGINE=InnoDB` + `utf8mb4`:5.7 原生支持; - `DATETIME DEFAULT CURRENT_TIMESTAMP` 与 `ON UPDATE CURRENT_TIMESTAMP`:5.7 支持(5.6 仅 TIMESTAMP 默认可用,故此处用 DATETIME 更稳妥); - `GENERATED ALWAYS AS (...) VIRTUAL` 生成列:5.7 起支持; - `TINYINT(1)` 表示布尔:5.7 通用写法。