Question Engine #
一次Quiz Attempt可以拆分成若干次Question Attempt。学生参加一次Quiz Attempt,就好像参加多次独立的Question Attempt,然后把多个Question Attempt的结果综合在一起。
数据库表的含义 #
根据测验的cmid可从m_context中查出该模块的contextid,再根据该contextid可查出所有m_question_usages的id,每个m_question_usages的id对应多条m_question_attempts记录(如果该测验有6题,则每个question_usage会对应6个question_attempt)。 quiz_attempts表的uniqueid为question_usages的id。先查出Quiz的id,再到quiz_attempts中查uniqueid,就能得到本次测验的所有question_usages的id,然后再查出question_attempts的所有id。课程页面URL中显示的id均为m_course_modules表的id。如果要查quiz在m_quiz中的id,需要m_course_modules和m_modules结合起来查。
假定某测验共有10题,某学生参加一次测验,就会是一次question_usage,会有独立的question_usage_id,该question_usage会包含10条question_attempt记录,每条question_attempt对应一道题目。为什么userid出现在question_attempt_steps表中,而不是出现在question_usages表中,或question_attempts表?有没有可能出现同一个question_attempt,却由不同的用户来完成?根据对某次测验数据表的数据分析,每次question_usage只会有一个用户ID,没有出现同一次question_usage中有两个不同用户的情形。是设计者没有想到吗?
question_usages记录题库(Question Bank)的使用,Moodle2.7的数据显示,目前使用Question Bank的component只有mod_quiz和core_question_preview,以后可能会有其它插件来使用Question Bank。如果不考虑到可能有其它插件使用Question Bank的话,那么可以不用question_usages,只要有quiz_attempts表就可以了。学生参加一次测验,就会生成一条quiz_attempt记录,quiz_attempt记录又会包含多条question_attempt记录。有了question_usages,那就变成了,一次测验会生成quiz_attempt记录,还会生成一条question_usages记录,再由question_usages记录对应多条question_attempt记录。quiz_attempts与question_usages应该是一对一关联,但question_usages包含有与quiz_attempts表对应记录之外的记录。
这样看起来,question_attempt_steps表中的userid是冗余的数据,或许只是考虑到性能问题,避免一次连接过多的表,才加入的userid字段。quiz_attempts表有userid,由此就可以查出该用户在该quiz中的所有记录,只不过涉及的表很多: quiz_attempts -> question_usages -> question_attempts -> question_attempt_steps -> question_attempt_step_data
查询 #
- 连接M_USER,M_QUESTION_ATTEMPT_STEPS,M_QUESTION_ATTEMPTS,M_QUESTION可查出用户在某题目上的所有的尝试。
题型 #
完型填空 #
完形填空题会被拆成多个填空题,原来题干中需要填空的地方(如{SAC:final})会被替换成{#1},{#2}这样的符号,保存到question表中。接下来分析每个填空位置的符号,每个填空位置会被拆分成一个填空题,题目和答案分别写入question表和question_answers表。最后需要在question_multianswer表中记下相应位置对应题目题的id及顺序。比如:
mysql> select * from mdl_question_multianswer;
| id | question | sequence |
| 1 | 2 | 3,4 |
上表说明,id为2的cloze题目中,其填空位置分别由id为3,4的填空题组成。
多选题 #
题干保存在question表中,每个选项保存在question_answers表中,每个选项会设置比例分值(fraction),选项答案正确与否,完全取决于fraction的值。因此选项的数量可以任意,正确答案的数量由应用程序计算得出,如果需要选中三个才算完成的话,每个正确选项的分值就是33.3333%了。 qtype_multichoice_options表中记录了该多选题的一些参数,如:是否更换选项次序,是否单选,选项编号的格式等等。
CBM #
http://helderenwijzer.nl/2011/10/certainty-based-marking-in-moodle/ https://docs.moodle.org/27/en/Using_certainty-based_marking