Mysql 关于数据库设计的建议

Mysql 关于数据库设计的建议,mysql,database,database-design,Mysql,Database,Database Design,我正在按照以下规范构建一个示例在线考试平台(我正在学习Ruby on Rails): 有1000个不同的选择题 每个问题最多可以有5个可能的答案,其中1个是正确的 一次向用户提出10个随机问题(我们称之为测试)。如果用户正确回答了一个问题两次,那么这个问题将不会再次显示给他 如果用户已正确回答了每个问题2次,也就是说,当没有更多的问题可以显示给他时,他将通过考试 第一次尝试: student -student_id -name question -question_id -text op

我正在按照以下规范构建一个示例在线考试平台(我正在学习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
虽然我们只能存储正确的问题,但我决定在学生答案表中包含“选项id”,以防将来需要显示统计数据(最难的问题等)

到目前为止,一个问题有很多选项,每个选项都属于一个问题,每次学生回答一个问题时,就会创建一个学生回答行

在我看来,这种方法可能会有一些性能问题,因为对于每个测试,我们必须选择用户给出的所有答案,根据问题id对它们进行分组,计算每个问题的正确回答次数,获取一组不应显示的问题id,最后从1000个初始问题减去我们刚刚排除的问题中随机选择10个

我的另一个想法是为每个用户提供一个{[0,0,1,…,1]}形式的JSON数组。每个单元格都是一个id与数组索引匹配的问题的正确答案数,但我发现这不是一个好主意

因为我在数据库设计方面相对来说是一个初学者,所以我希望得到一些关于我的方法的反馈。请随意提出与上述完全不同的方法


非常感谢。

我想您可能需要在选项表中包含问题id

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

  • 选择1000个问题
  • 选择用户给出的答案:选择计数(*)计数器、问题id、选项id,从学生答案加入选项中使用(问题id、选项id),其中学生id=x和选项。是否正确=1按问题id分组,选项id的计数器>1
  • 在ruby中随机化1000个问题,迭代它们,并排除在该学生的正确答案查询中发现的任何问题。回答10个问题后停止

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


您描述了一些未按设计添加种子的实体。您可能不需要存储“测试”,但这一点以及学生答案上的主键有助于建立一个模型,从而更容易回答有关数据的不同问题。

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

你好,谢谢你的回答。我真正的意思是,“测试”只是一组10个(或N个)问题,遵循上述限制。但我明白为什么最好从每个选项中删除“是否正确”列,并在简单问题中添加“正确答案”列。谢谢您的评论。不太清楚为什么有人会否决你的答案。你是对的,我应该在选项表中包含问题id,这是一个打字错误-已经纠正了我上面的问题。因此,除了使用Ruby解决部分问题外,您认为目前的数据库设计会有任何明显的性能问题吗?我认为只要在我建议的查询中有支持联接的列索引,就可以了。