我对数据库和SQL完全陌生。
我在myphpAdmin中生成了一个数据库,该数据库由一个带有(name, student number, grade)列的表组成。基本上,这个数据库将保存一所学校所有学生的成绩。在我的web应用程序中,index.php在浏览器上显示数据库中的所有信息。
所以基本上每个学生在数据库中都会有一行。随着时间的推移,每个学生的成绩将被添加到数据库中,一旦他们参加考试。如何才能在每个学生行的年级列中添加更多信息而不丢失已经存在的分数?(因为SQL中的UPDATE操作似乎覆盖了旧数据)。
或者我是不是走错了路,需要把每个学生作为一个数据库,然后用grade1、grade2、grade3等将他们的成绩添加到那些单独的数据库中?
发布于 2017-07-05 20:10:46
你得把设计规范化。在正常情况下,列只能保存基准(单数)。
所以像这样的事情
CREATE TABLE student (
studentid int AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE class (
classid int AUTO_INCREMENT PRIMARY KEY,
classname text
);
CREATE TABLE student_class_grade (
classid int REFERENCES class,
studentid int REFERENCES student,
grade float
);这是非常简单的,所以每个学生都有一个studentid,每个类都有一个classid,您可以为stupid_class_grade放尽可能多的条目。这并没有考虑到在同一堂课中以不同的方式来衡量测试和家庭作业所需要的额外复杂性。
发布于 2017-07-05 20:13:57
至少,您可能希望数据库中至少有两个表,student和graded_assignment (或者graded_test,如果所有的分数都是基于测试的话)。
student会有学生的名字和身份证。
graded_assignment将拥有学生的ID (将年级与特定的学生联系起来)、作业的可能积分值以及学生获得的实际积分数。
将通过查询计算总分,如下所示:
SELECT s.name, s.id, SUM(g.points_earned) * 100 / SUM(g.points_possible) as percent_grade
FROM student s
INNER JOIN graded_assignment g ON (s.id = g.student_id)
GROUP BY s.name, s.id
;实际上,您可能会有一个单独的assignment表,该表将列出每个赋值/测试/其他方面的信息,包括可用的总分,而graded_assignment表将链接回该表。
很可能,您还会有许多其他的表。学生将在一个或多个class;每个class将有一个instructor,谁可能教多个classes;作业将绑定到一个class。您甚至可能有这样一种场景,即instructor向多个classes教授相同的course,这可能会改变assignment所依赖的内容。
https://dba.stackexchange.com/questions/178106
复制相似问题