☆李游
(宜宾市一中,四川宜宾 644000)
为了提高教学质量,笔者一直想为学生编写一个在线测试练习系统。在网上查询了多篇关于试题库结构设计的文章,大多讨论的是试题系统设计方面的理论知识,讨论从底层实现数据库存储的文章还比较缺乏,而真正把数据结构拿来分析的则更少了。经过一段时间的思考研究,笔者最终完成了试题库系统的设计,现将里面使用到的题库存储数据结构拿出来与大家交流讨论。
首先从题型结构分析,在日常各种类型考试中,我们经常见到的题型可以归纳为以下七种。
(1)判断题——题型描述:判断题是一种以对或错来选择的答案。一般表现为出一句话,然后在后面进行对错的选择,
例:柳宗元是唐代诗人? 正确 错误
(2)单项选择——题型描述:题干给出一定的描述,然后在下面给出若干个备选项,要求考生把被选择项进行比较,选出正确且符合题意的一个。
例:下列选项中哪位不是唐代的诗人?
A、李白 B、杜甫 C、陶渊明 D、高适
(3)多项选择、不定项选择——题型描述:题干给出一定的描述,然后在下面给出若干个备选项,要求考生把被选择项进行比较,选出一个或多个符合题意的答案。
例:下面哪些诗人是唐代诗人。
A、白居易 B、陆游 C、洛宾王 D、王安石E、孟浩然
(4)配伍选择题、连线题——题型描述:一般将题目分为若干组,备选项分为若干组,备选项可重复选用,也可不选用,每题只有1个最佳答案备选项相应。这类题型在医学考试中经常出现。
例:请将下面诗人与所在朝代进行配对。
A、唐朝 B、宋朝 C、明朝 D、清朝
①柳宗元 ②贾仲明 ③陆游 ④朱熹 ⑤陈子龙
(5)填空题、填充题——题型描述:其形式大概为先给出已知条件,在而后的语句中空出要问的答案以横线或括号代替,以此要求应试者填上正确解。
例:白居易是( )朝代的著名诗人。
(6)名词解释、简答题、问答题、论述题——题型描述:这类题一般都是给出一个问题,要求考生用自己的语言对问题的理解进行阐述。
例:请谈谈唐代诗人以及他们诗歌的特点。
(7)综合题——题型描述:将以上若干种题型组合起来形成一种综合试题的结构。比如:语文、英语中的阅读理解、公务员考试中的资料分析等题型,它是一种复合题,里面可能由填空、判断、单选、简答等多种题型的组合。
例:请阅读下面诗句回答下面问题。
红豆生南国,春来发几枝?
愿君多采撷,此物最相思。
①此诗的标题是( ),作者是( )。
②作者所在的朝代是( )。
A、唐朝 B、宋朝 C、明朝 D、清朝
③此诗表明了作者什么样的思想感情?
……
为了能对各个试题进行有效管理和高效利用,我们使用两个表来存储试题章节、专题(知识点)等内容。两个表的数据结构相似。
以章节表为例进行介绍。ID为字符型,使用每两位存储一个大的分类级别,采用树型结构存储,可以进行几十个层次的分类;ChapterName用来存储章节的名称;ParentID用来存储父一级的章节ID,如果为空则为最顶级;Memo用来存储章节说明,其数据结构如表1、表2所示。
表1
表2
为了让试题库有更好的灵活性,又能提高数据库的处理效率,因此对于试题库我们采用Question、Options、Answer三个表来储存。
ID为自增字段用来唯一标识试题。
Content为文本类型,用来存储试题的题干部份。由于综合题的题干也存储在这里,因此,它的字段长度要设置得够大,至少能容纳语文或英语中阅读题的文章。对于填空题,由于填空内容是处于题干中的,所以,我们对每个需要填空的地方插入一个“【】”标记来处理。当出题程序识别出是填空题题型时,程序就会去搜索这个字段中“【】”的内容,替换成文本输入框显示在出题程序中,供用户输入填空内容。
Flag为题型标记字段,分别用1至7来标记试题的类型。1为判断题,2为单选题,3为多选题,4为配伍题,5为填空题,6为简答题,7为综合题。
ParentQuestionID为数值型,用于记录父级题目的ID编号。由于试题中配伍题、综合题两种试题它下面会有两个或以上的子试题目,属于复合型试题。通过这个标记可以让每个子试题唯一对应一个父题目,而当标记为-1时,说明这个试题是独立的试题。使用这种存储结构可以轻易地表示出几十上百个子试题出来。
ChapterID为字符型,它用于关联章节表中的ID。
TopicID为字符型,它用于关联专题表中的ID。
表3 Question表
ID为自增字段用来唯一标识备选项。
QuestionID为数值型用来存储Question表题目的ID,从而标记选项是属于哪个题目的。
Option为字符型或文本类型用于存储选择中的每个备选项。
这种数据结构特有的好处就是可以灵活处理选择项的数量,无论是三项选择还是六项的选择,甚至几十项的选择都可以轻易表示出来。
表4 Options表
ID为自增字段用来唯一标答案。
QuestionID为数值型用来存储Question表题目的ID,从而标记选项是属于哪个题目的。
DifficultLevel为数值型,用来存储试题的难易度,这个难易度是由试题录入人员人工判断的,作为题库系统应该需要考虑存储这个信息。
Answer为字符型,用来存储试题的答案。
判断题:使用0,1来标记正确和错误。
单选题:(包括配伍题里面的子题目)使用1,2,3,4……来表示A、B、C、D……
多选题:使用 1,2,3,4……来表示 A、B、C、D……,对于多选题中多于2个以上的选项只需要将每个选项序列依次排列即可,比如:134表示ACD。
填空题:如果一个题目有多个空需要回答,则每个填空对应的参考答案用特殊标记“●”来间隔,但对于多个一个空可能出现多个答案都是正确的情况比如:某个空填写“唐代”或“唐朝”都算正确的话,就在每个备选答案之间用特殊标记“★”间隔。
简答题:此处设置为空,直接使用后面的分析部分作为参考答案。
Right、Wrong为数值型,用来存储客观题测试时正确和错误的次数,从而更为精确地计算出难度系数。
Analysis为文本型,能存储大量文字信息,用来存储各个试题的分析。而主观试题的分析也就是答案,直接存储在这个字段即可。
表5 Answer表
本文详细介绍了一种比较通用的试题库系统的数据结构设计,并结合7种典型的题型详细介绍了它们在数据库中存储结构。目前,已经将这个数据结构成功应用到我们的试题问答系统和在线测试系统中,具有较好的实用性和灵活通用性,程序执行效率也高,希望本文能为即将进行测试系统设计开发的朋友提供参考。另外,我们设计了一个信息技术教育考试网,数据库就使用了这个结构,网址是<http://itedu.17ks.net/>,欢迎大家光临。
[1]谭顺平,卢琼红,胡晓燕.基于知识点的试题库建设研究[J].广西教育,2011,(27).
[2]叶文,试题库的研究与开发[J]科技致富向导,2011,(30).