Mysql

如何對數據庫結構進行建模以保留學生資訊?

  • November 20, 2020

我對數據庫和 SQL 完全陌生。

我在 myphpAdmin 中生成了一個數據庫,其中包含一個包含列的表(name, student number, grade)。基本上這個數據庫將保存一所學校所有學生成績。在我的 Web 應用程序中,index.php 在瀏覽器上顯示數據庫中的所有資訊。

所以基本上每個學生都會在數據庫中有一行。隨著時間的推移,每個學生的**成績將在他們參加考試後添加到數據庫中。我怎樣才能在每個學生行的**成績列中添加更多資訊而不會失去已經存在的成績?(因為 SQL 中的 UPDATE 操作似乎覆蓋了舊數據)。

或者我是不是走錯了路,需要將每個學生自己建構為一個數據庫,然後將他們的成績添加到這些單獨的數據庫中,比如 Grade1Grade2Grade3等?

您需要規範化設計。在正常情況下,一列只能保存一個數據(單數)。

所以像這樣

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。這並沒有考慮到在同一個班級中進行不同的稱重測試和家庭作業所需的額外複雜性。

至少,您可能希望數據庫中至少有兩個表,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. 您甚至可能會遇到這樣一種情況,即 an向多個esinstructor教授相同的內容,這可能會改變 an 所綁定的內容。course``class``assignment

引用自:https://dba.stackexchange.com/questions/178106