我正在尝试在数据库中记录测试/测验分数。当可能有很多测试和用户时,最好的方法是什么?
这些是我考虑的一些选项:我应该为每个用户的测验和行创建一个新列,还是这有其局限性?这可能会慢吗?我应该为每个用户创建一个新行吗?测验?我应该坚持使用原始的“用户”数据库并将其编码为文本吗?
详细阐述计划:JavaScript测验,使用AJAX提交分数,然后脚本将其发送到数据库。我是php的新手,所以我不确定一个好方法。
任何帮助都将非常感谢:)这是一个学校科学博览会
答案 0 :(得分:1)
我建议您在数据库中使用3个数据表:学生,测试和分数。
每个学生都需要有ID的字段以及您想要记录的其他任何内容(名称,dob等)。 测试应该包含ID和其他任何字段(名称,日期,重量等)。 分数应该包含学生ID,考试ID和分数(任何其他内容)。
这意味着您可以查询学生并加入分数表以获得所有学生的分数。您还可以将这些结果加入测试表,以获得放在每个分数上的标签,并根据分数和重量计算分数。
或者,您可以查询测试并加入分数,以获得给定测试的所有分数,以获得班级统计数据。
答案 1 :(得分:0)
我想创建一个数据库表,可能是一个列出所有学生(名称,dob,学生ID),然后一个列出所有测试(得分,日期) ,写的)。只有您访问数据库,或者您的学生也可以访问它吗?如果是后者,您需要确保创建准确的安全性或“视图”,以确保学生一次只能看到自己的成绩(不是每个人)。
答案 2 :(得分:0)
绝对不要创建动态列! (每个测验没有列)。当用户表(或通常是任何表项)未识别用户时(或通常任何表项),也将列添加到用户表(或通常是任何表)是不好的方法......
这是normalization的典型示例,您应该避免存储任何冗余行。为此,您将创建3个表和foreign keys,以确保分数始终引用现有用户和测验。 E.g:
users
- id
,nickname
,name
quizzes
- id
,quizName
,quizOtherData
scores
- id
,user_id
(参考users.id
),quiz_id
,(参考quizzes.id
),score
然后 为每个用户每个测验添加行scores
表 。另外,您可以为列UNIQUE
和user_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。