当前位置: 首页 > 后端技术 > PHP

关于某教育机构考试系统的设计

时间:2023-03-29 13:48:24 PHP

前言最近在做一套答题系统,参考某教育机构的设计。本章将和大家聊聊考试制度的核心——如何参加考试?简单来说,所谓的考试系统就是一个答题系统,完成答题打分后,通过返回答题结果来完成整个过程。当然,有些数据需要在过程中存储,有些可以后期查询计算(个人理解)。作答题,从而组装成一套完整的答题(考试)系统。一张试卷(问卷)使用一组试卷,试卷(问卷)与试卷是一对一的关系,试卷与试卷(问卷)是多对多的关系CREATETABLE`company_paper`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`title`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'examname',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`)=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;这个只是一个简单的设计,看实际需要,如果是考试相关的需求,需要加上考试时间(time)和考试及格分数(grade),类似的字段其实是不应该加到试卷中的,上面说了试卷和考试是多对多的关系,所以以上字段应添加到测试表中。CREATETABLE`company_examine`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`paper_id`int(11)NOTNULLCOMMENT'试卷代码',`start_time`int(11)NOTNULLCOMMENT'考试开始时间',`time_limit`int(11)NOTNULLCOMMENT'时间限制',`score`doubleNOTNULLCOMMENT'及格分数',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;上面是试卷,通过paper_id绑定对应的试卷。题库题库与试卷无关,只是对试题的分类管理。对试题进行分类后,在添加试卷动作时选择试题更加方便。当然,他也是多对多的关系。CREATETABLE`company_question_database`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'questionbankname',`created_at`timestampNULLDEFAULTNULL,`updated_at`EFAULTtimestampN,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;如上表结构,题库是分类的,所以没有过度设计。试题试题应该算是整个系统设计过程中比较繁琐的部分。先看数据表CREATETABLE`company_question`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`database_id`int(11)NOTNULLCOMMENT'属于题库',`title`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'title',`option`textCOLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'option',`answer`varchar(255)COLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'answer',`type`tinyint(4)NOTNULLDEFAULT'0'COMMENT'type0singlechoice1multiplechoice',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;首先按照传统试卷将试题分为三部分:stem(主题)选项和答案。这三个部分归纳为一个问题。这里的option和answer选择使用序列化来存储//option>>>serialize(["A"=>"OptionA","B"=>"OptionB"])=>"a:2:{s:1:"A";s:7:"OptionA";s:1:"B";s:7:"OptionB";}"//Answer>>>serialize(["A"])=>"a:1:{i:0;s:1:"A";}"没有使用json的存储方式有两个原因。我觉得mysql做json查询还不够完善,sql太复杂,而且后者扩展性不够,低版本不兼容。从打分到打分这一步算是整个考试的80%,这是不可能的,真正完成的功能还不到50%。还是引用电商文章相关的那句话,能存的都存起来判断。这是如何做到的CREATETABLE`company_user_paper`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`user_id`int(11)NOTNULLCOMMENT'usercode',`paper_id`int(11)NOTNULLCOMMENT'试卷代码',`answer`textCOLLATEutf8mb4_unicode_ciNOTNULLCOMMENT'answer',`score`double(8,2)NOTNULLDEFAULT'0.00'COMMENT'score',`correct`double(8,2)NOTNULLDEFAULT'0.00'COMMENT'正确率',`date_length`int(11)NOTNULLDEFAULT'0'COMMENT'examduration',`created_at`timestampNULLDEFAULTNULL,`updated_at`timestampNULLDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;见上表,记录了用户每次测试的所有动作详情,方便查询,答案依然采用序列化的方式。查答案的时候,直接反序列化计算数组差分,完成打分,得到交集是没有问题的。$answerArr=unserialize($answer)$successAnswerArr=unserialize($successAnswer)array_diff($answerArr,$successAnswerArr)考试毕竟不是一道题那么简单,可以选择迭代完成。如果题目数量比较多。或者如果用户比较集中,建议使用队列异步完成评分操作,通过socket等方式通知客户端(web端)会更安全。致谢本章内容到此结束,感谢您阅读到这里,希望本文能对您有所帮助。谢谢!

最新推荐
猜你喜欢