关于数据库设计的建议

时间:2017-02-25 23:12:43

标签: mysql database database-design

我正在建立一个样本在线考试平台(我在学习Ruby on Rails的过程中),其中包含以下规范:

  • 有1000种不同的多选问题。
  • 每个问题最多可以有5个答案,其中1个是正确的。
  • 一次向用户呈现10个随机问题(让我们称之为测试)。如果用户正确回答了2次问题,则不会再向他显示此问题。
  • 如果用户正确回答了每个问题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匹配数组索引的问题的正确答案数,但我发现这是一个坏主意。

由于我在数据库设计方面相对初学者,我希望对我的方法有一些反馈。请随意提出与上述完全不同的方法。

非常感谢。

3 个答案:

答案 0 :(得分:1)

我认为您可能需要在选项表中包含question_id。

一种方法是将一些处理转移到Ruby中。

  • 选择1000个问题。
  • 选择用户给出的答案:SELECT count(*)counter,question_id,option_id FROM student_answer JOIN选项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个问题后停止。

答案 1 :(得分:0)

如果只有一个答案可以正确,那么为什么在选项表中存储正确性,问题记录应该包含正确答案的外键。

您描述了一些未被您的设计添加的实体。您可能不需要存储测试'但是这个,以及student_answer上的主键使得模型更容易回答有关数据的不同问题。

答案 2 :(得分:0)

我认为你有一个很好的方法,我可能也会这样做。 - symcbean确实在上面提出了一个很好的观点,但我的解决办法是在student_answer表中存储一个布尔列,以确定答案是否正确。