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

时间:2012-03-07 19:28:43

标签: php mysql

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

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

详细阐述计划:JavaScript测验,使用AJAX提交分数,然后脚本将其发送到数据库。我是php的新手,所以我不确定一个好方法。

任何帮助都将非常感谢:)这是一个学校科学博览会

3 个答案:

答案 0 :(得分:1)

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

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

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

或者,您可以查询测试并加入分数,以获得给定测试的所有分数,以获得班级统计数据。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

这是normalization的典型示例,您应该避免存储任何冗余行。为此,您将创建3个表和foreign keys,以确保分数始终引用现有用户和测验。 E.g:

  1. users - idnicknamename
  2. quizzes - idquizNamequizOtherData
  3. scores - iduser_id (参考users.idquiz_id ,(参考quizzes.idscore
  4. 然后 为每个用户每个测验添加行scores 。另外,您可以为列UNIQUEuser_id创建quiz_id密钥,以禁止用户完成一次测验而不是一次。

    这将是快速的,不会存储冗余(不需要的额外)数据。

    获取带有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加入的原因是因为可能有用户未执行此测验,但每个得分始终都有现有用户和测验(由于foreign keys

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

    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
    

    BTW:如果您不熟悉PHP(或任何阅读此内容的人),请使用PHP's PDO界面与您的数据库进行通信:) AVOID函数如mysql_query,至少使用{{3但是为了便携性,我建议留在PDO。