基于SpringAI的在线考试系统-数据库设计核心业务方案(微调)

更新后的核心数据流转链路总结(修正版)

应该是 marking_quality_control.marking_score_id → marking_score.id,这样更清晰准确。基于这个修正重新梳理核心数据流转链路。

修正后的全流程数据流转图

第六阶段:结果沉淀
第五阶段:阅卷闭环
第四阶段:考生作答
第三阶段:考试组织
第二阶段:内容生成
第一阶段:基础配置
grade_id
class_id
subject_id
knowledge_id
question_id
paper_id
class_id
exam_id
user_id
exam_record_id
question_id
exam_id
user_id
exam_id
user_id
task_id
teacher_id
answer_id
assignment_id
exam_record_id
question_id
marking_score.id
marking_score_id
question_id
task_id
actual_score汇总
exam_record_id
user_id
collection_id
marking_score
knowledge_id
user_id
grade表
classroom表
subject表
user表
subject表
knowledge表
knowledge_closure表
question表
subject表
paper表
question表
paper_question表
mock_exam表
mock_exam_record表
mock_exam_answer表
exam_screen_record表
marking_task表
marking_task_assignment表
基于题型分配
基于考生分配
marking_score表
marking_quality_control表
wrong_question_collection表
wrong_question_item表
全量表操作
operation_log表

修正后的阅卷表外键关系

关键外键修正说明

  1. 原设计marking_quality_control.task_id → marking_score.id
  2. 修正后设计marking_quality_control.marking_score_id → marking_score.id

这样设计的好处:

  1. 语义更清晰:字段名明确表示关联到评分记录
  2. 避免混淆 :与marking_quality_control.task_id(关联阅卷任务)区分开
  3. 便于维护:代码和查询中更容易理解字段含义

修正后的阅卷表完整外键关联图

外键字段说明
marking_quality_control表字段
marking_score_id: 关联具体评分记录
task_id: 关联阅卷任务
question_id: 关联试题
阅卷模块外键关联
exam_id
user_id

create_by
task_id
teacher_id
assignment_id
answer_id
exam_record_id
question_id
id
marking_score_id
task_id
question_id
质量问题定位
任务质量统计
mock_exam表
marking_task表
user表
marking_task_assignment表
marking_score表
mock_exam_answer表
mock_exam_record表
question表
marking_quality_control表

详细外键关联表

主表 主键 从表 外键字段 关联说明
mock_exam id marking_task exam_id 阅卷任务关联考试
user id marking_task create_by 阅卷任务创建人
marking_task id marking_task_assignment task_id 任务分配关联阅卷任务
user id marking_task_assignment teacher_id 任务分配关联阅卷教师
marking_task_assignment id marking_score assignment_id 评分明细关联任务分配
mock_exam_answer id marking_score answer_id 评分明细关联答题记录
mock_exam_record id marking_score exam_record_id 评分明细关联考试记录
question id marking_score question_id 评分明细关联试题
marking_score id marking_quality_control marking_score_id 关键修正:质量管控关联具体评分记录
question id marking_quality_control question_id 质量管控关联试题
marking_task id marking_quality_control task_id 质量管控关联阅卷任务

修正后的质量管控表结构

marking_quality_control 表结构设计

sql 复制代码
CREATE TABLE marking_quality_control (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    
    -- 三重关联设计
    marking_score_id BIGINT NOT NULL COMMENT '关联的评分记录ID',
    task_id BIGINT NOT NULL COMMENT '关联的阅卷任务ID',
    question_id BIGINT NOT NULL COMMENT '关联的试题ID',
    
    -- 双评信息
    first_teacher_id BIGINT COMMENT '第一位阅卷教师ID',
    second_teacher_id BIGINT COMMENT '第二位阅卷教师ID',
    first_score DECIMAL(5,2) COMMENT '第一位教师评分',
    second_score DECIMAL(5,2) COMMENT '第二位教师评分',
    score_diff DECIMAL(5,2) COMMENT '分差绝对值',
    
    -- 仲裁信息
    arbitration_teacher_id BIGINT COMMENT '仲裁教师ID',
    arbitration_score DECIMAL(5,2) COMMENT '仲裁分数',
    
    -- 状态控制
    status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0-无需仲裁,1-待仲裁,2-已仲裁',
    threshold DECIMAL(5,2) COMMENT '分差阈值',
    
    -- 时间戳
    created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    arbitrated_time DATETIME COMMENT '仲裁时间',
    
    -- 外键约束
    FOREIGN KEY (marking_score_id) REFERENCES marking_score(id) ON DELETE CASCADE,
    FOREIGN KEY (task_id) REFERENCES marking_task(id) ON DELETE CASCADE,
    FOREIGN KEY (question_id) REFERENCES question(id) ON DELETE RESTRICT,
    FOREIGN KEY (first_teacher_id) REFERENCES user(id) ON DELETE SET NULL,
    FOREIGN KEY (second_teacher_id) REFERENCES user(id) ON DELETE SET NULL,
    FOREIGN KEY (arbitration_teacher_id) REFERENCES user(id) ON DELETE SET NULL,
    
    -- 索引优化
    INDEX idx_marking_score_id (marking_score_id),
    INDEX idx_task_id (task_id),
    INDEX idx_question_id (question_id),
    INDEX idx_status (status),
    INDEX idx_created_time (created_time)
) COMMENT '质量管控表';

修正后的质量管控数据流转

marking_task表 仲裁教师 question表 marking_quality_control表 marking_score表 系统 marking_task表 仲裁教师 question表 marking_quality_control表 marking_score表 系统 质量管控流程(修正后) alt [分差未超阈值] [分差超阈值] 双重视角统计 读取双评教师评分数据 (同一试题的两条评分记录) 返回两条评分记录信息 计算分差(score_diff = |score1 - score2|) 插入质量记录 (marking_score_id=主评记录ID, status=0) 返回记录结果 插入质量记录 (marking_score_id=主评记录ID, status=1) 返回记录结果 推送超限分差任务 查看待仲裁记录 返回评分详情及分差 录入仲裁分数,更新status=2 同步仲裁分数至actual_score 反馈同步结果 通过marking_score_id定位具体问题 通过task_id统计任务整体质量

优化后的核心流转链路

完整链路(修正后)

复制代码
基础表(grade/classroom/subject/user) 
→ 内容表(knowledge/question) 
→ 试卷考试表(paper/paper_question/mock_exam) 
→ 作答表(mock_exam_record/mock_exam_answer/exam_screen_record) 
→ 阅卷表(marking_task → marking_task_assignment → marking_score → marking_quality_control) 
→ 沉淀表(wrong_question_collection/wrong_question_item/operation_log)

精简链路(含双分配规则)

复制代码
grade/class/subject/user 
→ knowledge/question 
→ paper/paper_question/mock_exam 
→ mock_exam_record/mock_exam_answer 
→ marking_task 
→ 【基于题型/基于考生】marking_task_assignment 
→ marking_score 
→ marking_quality_control(marking_score_id→marking_score.id修正)
→ wrong_question_collection/wrong_question_item

修正后的质量管控查询示例

1. 直接定位具体问题的评分记录(修正后)

sql 复制代码
-- 查询有质量问题的评分记录详情
SELECT 
    mq.*,
    ms.actual_score,
    ms.marking_comment,
    q.stem,
    u.username as teacher_name
FROM marking_quality_control mq
JOIN marking_score ms ON mq.marking_score_id = ms.id  -- 修正后的关联
JOIN question q ON mq.question_id = q.id
JOIN marking_task_assignment mta ON ms.assignment_id = mta.id
JOIN user u ON mta.teacher_id = u.id
WHERE mq.status = 1  -- 待仲裁
ORDER BY mq.score_diff DESC;

2. 向上统计阅卷任务整体质量(修正后)

sql 复制代码
-- 统计阅卷任务的整体质量情况
SELECT 
    mt.task_name,
    COUNT(DISTINCT mta.id) as assignment_count,
    COUNT(DISTINCT ms.id) as score_count,
    SUM(CASE WHEN mq.status = 1 THEN 1 ELSE 0 END) as pending_arbitration,
    SUM(CASE WHEN mq.status = 2 THEN 1 ELSE 0 END) as arbitrated,
    AVG(mq.score_diff) as avg_score_diff
FROM marking_task mt
JOIN marking_task_assignment mta ON mt.id = mta.task_id
JOIN marking_score ms ON mta.id = ms.assignment_id
LEFT JOIN marking_quality_control mq ON ms.id = mq.marking_score_id  -- 修正后的关联
GROUP BY mt.id
ORDER BY pending_arbitration DESC;

双分配规则下的质量管控查询

基于题型分配的质量统计(修正后)

sql 复制代码
-- 基于题型分配的质量统计
SELECT 
    mta.question_type,
    COUNT(*) as total_scores,
    SUM(CASE WHEN mq.id IS NOT NULL THEN 1 ELSE 0 END) as quality_issues,
    AVG(CASE WHEN mq.score_diff IS NOT NULL THEN mq.score_diff ELSE 0 END) as avg_diff
FROM marking_task_assignment mta
JOIN marking_score ms ON mta.id = ms.assignment_id
LEFT JOIN marking_quality_control mq ON ms.id = mq.marking_score_id  -- 修正后的关联
WHERE mta.assign_rule = 1  -- 基于题型分配
GROUP BY mta.question_type
ORDER BY quality_issues DESC;

基于考生分配的质量统计(修正后)

sql 复制代码
-- 基于考生分配的质量统计
SELECT 
    mer.user_id,
    u.username as student_name,
    COUNT(DISTINCT ms.id) as scored_questions,
    SUM(CASE WHEN mq.status = 1 THEN 1 ELSE 0 END) as pending_arbitration,
    SUM(CASE WHEN mq.status = 2 THEN 1 ELSE 0 END) as arbitrated
FROM mock_exam_record mer
JOIN marking_score ms ON mer.id = ms.exam_record_id
LEFT JOIN marking_quality_control mq ON ms.id = mq.marking_score_id  -- 修正后的关联
JOIN user u ON mer.user_id = u.id
WHERE EXISTS (
    SELECT 1 FROM marking_task_assignment mta 
    WHERE mta.id = ms.assignment_id 
    AND mta.assign_rule = 2  -- 基于考生分配
)
GROUP BY mer.user_id
ORDER BY pending_arbitration DESC;

业务优势总结

1. 精准定位与统计

  • marking_score_id:精准定位到具体的评分记录,便于快速处理质量问题
  • task_id:向上统计整个阅卷任务的质量情况
  • question_id:关联试题,便于分析特定题目的评分质量

2. 数据一致性保障

  • 仲裁结果通过 marking_score_id 直接同步到对应的评分记录
  • 外键约束确保关联数据的完整性
  • 乐观锁机制防止并发冲突

3. 灵活的查询支持

  • 支持从评分记录到质量管控的直接查询
  • 支持从阅卷任务到质量问题的聚合查询
  • 支持按题型、按考生的多维度质量分析

4. 双规则分配适配

  • 基于题型分配:便于统计同一题型的评分一致性
  • 基于考生分配:便于分析特定考生的评分问题
  • 两种分配规则下的质量管控都能有效支持

总结

通过修正 marking_quality_control.marking_score_id → marking_score.id 的外键关联,我们实现了:

  1. 语义清晰:字段名准确表达关联关系,避免混淆
  2. 精准定位:直接关联到具体评分记录,便于问题定位
  3. 统计灵活:通过三重关联(评分记录、阅卷任务、试题)支持多维度统计分析
  4. 业务适配:完美支持双分配规则下的质量管控需求

这样的设计既满足了教育考试系统阅卷模块的实际业务需求,又确保了数据模型的一致性和可维护性,为系统的长期稳定运行奠定了坚实基础。

相关推荐
笨手笨脚の2 小时前
深入理解 Java 虚拟机-02 对象
java·jvm·压缩指针·对象分配
_ziva_2 小时前
大模型面试与实用技巧教学
人工智能
L1624762 小时前
KeepAlived 搭建 MySQL 双主模式高可用集群(详细安装配置教程)
数据库·mysql·adb
生成滞涨网络~2 小时前
MySQL 索引优化实战指南:从原理到实践
数据库·mysql
kaoshi100app2 小时前
2026年注册安全工程师报考条件解读
开发语言·人工智能·职场和发展·学习方法
deepdata_cn2 小时前
交叉熵损失分类及应用
人工智能·分类·数据挖掘
yangminlei2 小时前
Spring Boot 3 + Spring AI 实战:十分钟集成 OpenAI API 构建智能应用
java·openvino
是三好2 小时前
java集合
java·开发语言
凯子坚持 c2 小时前
Qt常用控件指南(5)
开发语言·数据库·qt