Mysql

在消除重複的同時設計多個表?

  • August 13, 2012

當我在一個教育網站上工作時,我的數據庫設計方案遇到了問題——我找不到正確的設計來消除我正在創建的表中的重複。

我正在嘗試設計的是 [ n ] 表將儲存subject_names,subject_idgrade_name grade_numberofcource grade_id。但是由於同一科目可以針對不同年級教授;會有重複。

例如,每個年級都會教授數學,這意味著將有(10+)列subject_name設置為數學,但每列都有不同的grade_id.

我想到的目前設計(我還沒有實現)是創建兩個表,andsubjects表將儲存,gradesand表將包含,和。不幸的是,此設計將包含許多重複項。 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

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