6.3 KiB
6.3 KiB
帽石系统 - 数据表结构设计文档
适用数据库: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 插入一条考试记录
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 查询某考生是否合格
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 统计合格/不合格人数
SELECT qualified, COUNT(*) AS cnt
FROM t_capstone_exam
WHERE del_flag = 0
GROUP BY qualified;
5.4 查询偏差较大的记录(实测偏离实际 > 0.1)
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 标记已同步至对方系统
UPDATE t_capstone_exam
SET sync_status = 1
WHERE id = 1;
5.6 软删除(保留数据痕迹)
UPDATE t_capstone_exam
SET del_flag = 1
WHERE id = 1;
6. 设计要点与扩展建议
- 单表优先:当前字段均为“一次考试一条记录”的扁平属性,单表即可满足,查询简单、易维护。
- 坐标拆分:XY 拆成独立列而非合并字符串,便于数值计算、偏差统计与范围检索。
- 偏差用生成列:避免冗余存储与数据不一致,MySQL 5.7 原生支持。
- 审计字段:
create_time / update_time / del_flag遵循常规后台系统规范,利于排查与软删除。 - 可扩展方向(按需追加):
- 若帽石有独立属性(类型、规格、所属区段),可建
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 通用写法。