在 MySQL 中存储测验结果的最佳方法


Best method for storing quiz results in MySQL

我正在尝试在数据库中记录测试/测验分数。当可能有很多测试和用户时,最好的方法是什么?

这些是我考虑过的一些选项:我应该为每个测验创建一个新列并为用户创建一个行,还是有其局限性?这会很慢吗?我应该为每个用户和测验创建一个新行吗?我应该坚持使用原始的"用户"数据库并将其编码为文本吗?

详细说明计划:JavaScript测验,使用AJAX提交分数,脚本将其发送到数据库。我是 php 的新手,所以我不确定有什么好方法。

任何帮助将不胜感激:)这是为了学校科学博览会

我建议在您的数据库中使用 3 个数据表:学生、测试和分数。

每个学生都需要有一个ID字段以及您想要记录的任何其他内容(姓名,dob等(。测试应该有 ID 和其他任何字段(名称、日期、权重等(。分数应包含学生 ID、测试 ID 和分数(任何其他内容(。

这意味着您可以查询学生并与分数表联接以获取所有学生的分数。 您还可以将这些结果加入测试表,以将标签放在每个分数上,并根据分数和权重计算成绩。

或者,您可以查询测试并与分数联接以获取给定测试的所有分数,以获取班级统计信息。

我会

说创建一个数据库表,也许一个列出所有学生(姓名,dob,学生ID(的表,然后一个用于所有测试(分数,日期,编写者(。是只有您访问数据库,还是您的学生也可以访问它?如果是后者,您需要确保创建准确的安全性或"视图",以确保学生一次只能看到自己的成绩(不是每个人的成绩(。

绝对不要创建动态列!(每个测验没有列(。此外,当他们不识别用户(或通常任何表项目(时,将列添加到用户表(或通常任何表(是不好的......

这是规范化的一个很好的例子,你应该避免存储任何多余的行。为此,您需要创建 3 个表和外键,以确保分数始终引用现有用户和测验。例如:

  1. users - idnicknamename
  2. quizzes - idquizNamequizOtherData
  3. scores - iduser_id (参考资料 users.id (quiz_id , (参考资料 quizzes.id (score

然后向每个用户每个测验scores表中添加行。此外,您还可以为列user_idquiz_id创建UNIQUE键,以禁止用户多次完成一个测验。

这将很快,并且不会存储冗余(不需要的额外(数据。

要获取 id 例如 4 的测验结果和提交此测验的人员的用户信息(从最高到最低分数排序(,您可以执行以下操作:

SELECT users.*, scores.score
FROM scores RIGHT JOIN users ON(users.id=scores.user_id)
WHERE scores.quiz_id = 4
ORDER BY score DESC

我在这里使用 RIGHT join 的原因是,可能有用户没有做这个测验,但是每个分数总是有一个现有的用户和测验(由于外键

要获取所有用户、测验和分数的总体信息,您可以执行以下操作:

SELECT * 
FROM quizzes 
LEFT JOIN scores ON(quizzes.id=scores.quiz_id)
LEFT JOIN users ON(users.id=scores.user_id)
ORDER BY quizzes.id DESC, scores.score DESC, users.name ASC

顺便说一句:如果你是PHP的新手(或任何读到这篇文章的人(,使用PHP的PDO接口与你的数据库:)通信。避免使用像mysql_query这样的功能,至少使用mysqli_query,但为了便携性,我建议继续使用PDO。