我正在构建一个示例在线考试平台(我正在学习 Ruby on Rails),其规范如下:
- 共有 1000 道不同的多项选择问题。
- 每个问题最多可以有 5 个可能的答案,其中 1 个是正确的。
- 一次向用户提出 10 个随机问题(我们将其称为测试)。如果用户正确回答一个问题 2 次,则该问题将不会再次显示给他。
- 如果用户正确回答了每个问题两次,即没有更多问题可供显示,则用户通过考试。
第一次尝试:
student
-student_id
-name
question
-question_id
-text
option
-option_id
-text
-is_correct
-question_id
student_answer
-student_id
-question_id
-option_id
虽然我们只能存储正确的问题,但我决定将“option_id”包含在 Student_answer 表中,以防将来需要显示统计信息(最难的问题等)。
到目前为止,一个问题有很多选项,每个选项都属于一个问题,每次学生回答问题时都会创建一个 Student_answer 行。
在我看来,这种方法会存在一些性能问题,因为对于每个测试,我们都必须选择用户给出的所有答案,按 Question_id 对它们进行分组,为每个问题计算其被回答的正确次数,获取一组不应该显示的question_id,最后从1000个初始问题中随机选择10个问题减去我们刚刚排除的问题。
我的另一个想法是为每个用户提供一个 {[0,0,1,...,1]} 形式的 JSON 数组。每个单元格都是问题的正确答案数,其 id 与数组索引匹配,但我发现这是一个坏主意。
由于我在数据库设计方面相对是一个初学者,因此我希望获得一些关于我的方法的反馈。请随意提出与上述完全不同的方法。
非常感谢。
最佳答案
我认为您可能需要在选项表中包含 Question_id。
一种方法是将部分处理转移到 Ruby 中。
- 选择 1000 个问题。
- 选择用户给出的答案:SELECT count(*) counter, Question_id, option_id FROM Student_answer JOIN option USING (question_id,option_id) WHERE Student_id=x AND option.is_ Correct=1 GROUP BY Question_id,option_id HAVING counter>1
- 在 ruby 中随机化 1000 个问题,迭代它们,并排除在查询该学生的正确答案时找到的任何问题。 10 个问题后停止。
关于mysql - 数据库设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462747/