mysql - 数据库设计建议

标签 mysql database database-design

我正在构建一个示例在线考试平台(我正在学习 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/

相关文章:

mysql - LEFT 在学说查询生成器中加入两个表

php - 如何在 PHP 中插入 2 个表?

mysql - 从子查询中选择 "the best result"?

mysql - Mysql Query Plan是如何生成的?

php - 带有指向另一个表中行的链接的 SQL 表

mysql - 如何使复合键唯一?

database-design - 在数据库中存储名称的标准方法

php - 为什么相同编码的字符串在 MySQL 和 HTML 上呈现不同的效果?

database - 当环大小改变时迁移 Riak 数据

mysql - 最多可以有两个值的属性的列命名