在消除重複的同時設計多個表?
當我在一個教育網站上工作時,我的數據庫設計方案遇到了問題——我找不到正確的設計來消除我正在創建的表中的重複。
我正在嘗試設計的是 [ n ] 表將儲存
subject_names
,subject_id
和grade_name
grade_number
ofcourcegrade_id
。但是由於同一科目可以針對不同年級教授;會有重複。例如,每個年級都會教授數學,這意味著將有(10+)列
subject_name
設置為數學,但每列都有不同的grade_id
.我想到的目前設計(我還沒有實現)是創建兩個表,and
subjects
表將儲存,grades
and表將包含,和。不幸的是,此設計將包含許多重複項。subjects``subject_name``subject_id``grade_id``grades``grade_id``grade_name``grade_number
那麼,創建這樣一個數據庫設計的正確方法是什麼?
提前致謝。
編輯:
對不起,我指的
grade
是一年的教育。
我的建議是只包含subject_name 和subject_id 的主題表,只包含grade_name 和grade_id 的成績表。然後創建第三個名為 subject_grades 的表,其中包含 subject_id 和grade_id 列,在該表上為 subject.subject_id 列和 Grades.grades_id 列創建外鍵。我強烈建議在此表中的兩列上放置一個主鍵,或者至少在一個唯一鍵上放置一個主鍵。
我希望這可以幫助你。
Mr.Brownstone 的回答聽起來不錯,但請注意,對於少量數據,擁有完美“規範化”的模式可能會適得其反。讓我稍微解釋一下。
您將擁有三個表,並且不需要重複任何數據。附加表通常稱為“數據透視”表,其中可能沒有任何“真實”數據。相反,它有元數據。它列出了成績和科目相關的所有方式。
布朗斯通先生提到的主鍵,由數據透視表上的兩列組成,稱為“複合自然鍵”。你可以找到很多網路文章說它是邪惡的。它不一定是邪惡的,但如果你不小心,它可能會很麻煩。如果您在其上建構一個大型程式結構,將您從鍵中抽像出來,因此您可以輕鬆更改鍵而無需過多更改程式碼,您會沒事的。但聽起來你不會那樣做。因此,您最終會得到處理多部分鍵的專用程式碼。呸。當您的網路應用程序想要參考學生的最終成績時,它不會發送/接收(例如通過 URL)代表它的單個整數,而是發送代表主題/成績組合的鍵對。
你可以擴展這個想法,因為你可以有主題/年級/學期/年復合鍵來引用曾經教過的每一門課。或者一年中一個班級可能有多個地點或老師。
因此,“複合自然鍵”的替代方案是“代理鍵”。現在,您的主題/年級配對有一個數字表示。所以你有一個表,裡面只有三個關鍵列。當您開發此應用程序時,您可以看到這可能不會讓您的生活變得更簡單。數據透視表通常很難手動開發。
但是,另一方面,也許你在 7 年級和 8 年級教的並不是真正的“數學”。也許是幾何和微積分。故意“非規範化”您的數據是完全可以接受的。許多非常流行的開源應用程序都這樣做,這使它們更強大,而不是更少。所以現在,我們回到起點,你最好有一張表,上面寫著:
id grade course_title 0 5 Math 1 6 Math 2 7 Geometry 3 8 Calculus