You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设计数据库存储含子问题的考题及学生考试结果?

优化含子问题的考题与学生答题结果存储方案

先给你点个赞,你现有的表结构已经搭好了核心框架,不过针对含子问题的场景,咱们可以再优化下,让数据存储更精准、后续统计更方便。

一、调整基础题目表的标识性

你的Question_Meta表可以新增一个is_multipart字段(布尔类型),用来标记这道题是否包含子问题。这样后续查询时,不用关联MultiPart_Question就能快速区分单题和多子题,提升查询效率。另外,建议给这个表加上question_content字段——毕竟主问题的文本内容总得有地方存对吧?

调整后的Question_Meta结构大概是:
Question_Meta : [exam_id, question_no, question_type, marks, is_multipart, question_content]

二、完善子问题表的完整性

你的MultiPart_Question目前只有关联ID和分数,建议补充part_content字段存储子问题的具体内容,同时新增一个单独的主键multipart_id(自增ID就行),比用question_meta_id + part_number作为联合主键更方便后续关联答题结果。

优化后的MultiPart_Question结构:
MultiPart_Question : [multipart_id, question_meta_id, part_number, part_content, marks]

三、核心:精准记录子问题的答题结果

原来的Exam_Result表关联的是question_meta_id,但如果是多子题的话,没法单独记录每个子题的得分和答案。这里有两种优化思路:

思路1:兼容单题和子题的统一结果表

修改Exam_Result表,新增multipart_id字段(外键关联MultiPart_Question的multipart_id),当记录的是单题的答题结果时,multipart_id设为NULL;如果是子题的结果,就填入对应的子题ID。同时补充answer_content字段存储学生的答案内容。

最终结构:
Exam_Result : [result_id, exam_id, student_id, question_meta_id, multipart_id, obtained_marks, answer_content]

这种方式的好处是一张表兼容所有答题场景,不用拆分多张表,查询时通过multipart_id是否为NULL就能区分单题和子题的结果。

思路2:拆分单题和子题结果表

如果你的业务中子题的占比很高,且需要单独统计子题数据,可以拆分出两张表:

  • 保留原Exam_Result表,只记录单题的答题结果
  • 新增SubQuestion_Result表,专门记录子题的结果:
    SubQuestion_Result : [sub_result_id, exam_id, student_id, multipart_id, obtained_marks, answer_content]

这种方式的优势是数据结构更清晰,统计子题数据时不用过滤NULL值,但需要维护两张表,适合子题业务占比高的场景。

四、额外的实用建议

  • 给所有表的外键字段加上索引,比如MultiPart_Question的question_meta_id、Exam_Result的student_id和question_meta_id,避免关联查询时性能拉胯。
  • 如果涉及客观题,可以新增一个Answer_Standard表,存储单题或子题的标准答案,方便后续自动判分:
    Answer_Standard : [standard_id, question_meta_id, multipart_id, standard_answer]

内容的提问来源于stack exchange,提问作者hardcore developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:04:04