在线考试系统功能需求以及数据库定义
由于是技术说明文档,就不再叙述背景以及国内外现状等。
在线考试系统模块需要实现的功能在这里分传统题目考试、程序题目在线判定(Online Judgement)两大部分叙述。
一:传统题目部分
对于题库:
1. 能够添加多种题型(单选、多选、判断、填空、简单等)
2. 能够添加多种题目分类(如“计算机基础“,“管理“),并支持子类父类(如”C语言” 属于 “计算机基础”)
3. 对于每一种题型,能够添加试题
4. 对于每一道试题,有正确率统计,便于出题的时候进行难度判断
5. 对于每一道试题,能够指定属于哪一分类
6. 对于每一道试题,除了设置答案以外,还需有答案解析,便于实现以后某些功能需求(如某些考生看不懂答案)。
对于试卷:
1. 能够设置试卷的名称、分类等(分类参考题库模块的分类)
2. 能够直接从题库里提取试题,组成试卷
3. 组卷选题过程中支持重复性检测,以及难度提示(根据题库中题目的正确率等作为参考)
4. 支持相同题型不同分数(即可根据难度设置分数,参考高考理综考试)
5. 能够查询某一时间段里出的试卷(如今年期末考试出题想参考1999年的试卷)
对于考卷:
1. 能够将试卷的题目乱序以后组成考卷
2. 维护考卷的基本信息
3. 记录考卷中每一道题的正误(题库中题目的正确率来源于此)
4. 支持缓冲。由于对于每一次考试,有多少考生参加就有多少张考卷,如果对每一道题都访问数据库,会由于频繁反问造成系统效率不高,所以需要提供缓冲机制。
5. 支持到时间收卷
对于考生:
1. 维护考生的基本信息
2. 考生作为与外界系统的主要接口,将其他系统的用户与在线考试系统联系起来,所以在该系统中,考生参加考试一律只使用考生编号。
总体草图
对于数据库:
1. 由于在该系统中会涉及到较多的事务处理,所以讲数据库引擎采取ENGINE = InnoDB模式
2. 数据库表如下图所示。
具体每个字段代表什么,以及具体的SQL创建语句已经在“数据库创建语句.sql”里详细列出,这里给出对于某些数据库表的解释:
question_type是什么表?
题型表。如单选题、多选题、判断题、填空题、简答题等。
category是什么表?
类型表。该表包含了指向自身的id,用以实现子类型与父类型的关系。
question是什么表?
题目表。包含题型id,内容id,分类id,出现次数,正确的次数
为什么question表中要单独设置frequency(出现次数)和correct(正确次数)?
为了统计题目的实时正确率,为出题的时候提供难度判断。如果采取直接储存正确率的方式,每当该题目出现在考卷中一次,则需要重新统计该值,工作量巨大。
question表中content_id指什么?
题目具体内容编号,即type_xxx表的id号。
题目具体内容表type_xxx中,都具有describe, analysis以及answer字段,为何不把它们提取出来写到question表中?
为了保持question表的整洁,特别是在需要做一些统计(如题型正确率统计、某一类型出题率等)以及其他操作的时候,只用很少的字段即可完成需求。所以question表里存的都是各相关表的索引ID。基于同样的原因,由于question表里已经有了content_id,为了减少数据的冗余,把具体内容全部移到了type_xxx表中。再者,由于不同题型的试题所需的答案的长度不同(如,判断题只需要1个字符,简单题可能需要500个等),也应该把该字段放到各自的内容表里去。
paper、paper_content、exam_content、exam各是什么表,之间有什么关系?
这四张表主要是用来实现试卷与考卷功能的。
paper为试卷表,paper_content为试卷内容表,exam为考卷表,exam_content为考卷内容表。
paper表主要维护了试卷的基本信息,paper_content表中主要是试卷包含的试题以及该试题在该考卷中的分数设置。
exam表主要维护了考卷的基本信息,包括该考卷属于哪一套试卷,该考卷的考生id,该考卷的开始以及结束时间。exam_content则包含了考卷中具体的题目、该题目出现在考卷中的位置信息及考生的答案。
examinee是什么表?
考生表。其中id代表考生的id。uid代表用户id,是与外部系统对接的时候,外部系统的用户id。
二. 程序题目在线判定
以C语言程序设计课程举例。某老师开设了C语言课程,布置作业后,学生提交C语言程序。老师希望有系统能够自动判定学生提交的程序,并反馈结果(如编译错误,运行通过所有数据,运行超时,使用内存超出题目设定值等)。流程图如下:
流程解释:
- 学生提交程序到系统
- 系统进行编译,如果出错则返回错误信息,如果正确进入第3步
- 运行程序,并从数据输入文件中输入数据
- 运行时候,如果运行错误、超时、超过题目设定的内存使用量则返回错误信息,如果运行正确则得到输出数据并进入第5步
- 将学生程序产生的输出数据与标准输出数据对比,反馈结果(Accept或者Wrong Answer)
- 结束。