數據庫中的一對多關係

當表A中的每條記錄在表B中可能有許多鏈接記錄時,數據庫中會出現一對多關係 ,但表B中的每條記錄在表A中可能只有一條對應記錄。數據庫是最常見的關係數據庫設計,是良好設計的核心。

考慮一下老師和他們教授的課程之間的關係。 一位老師可以教授多門課程,但課程與老師的關係不一樣。

因此,對於“教師”表中的每條記錄,“課程”表中可能有許多記錄。 這是一對多的關係:一個老師到多個課程。

為什麼建立一對多關係很重要

要表示一對多關係,至少需要兩個表。 讓我們看看為什麼。

也許我們創建了一張教師表,我們想記錄教授的名字和課程。 我們可以這樣設計它:

教師和課程
Teacher_ID 老師的名字 課程
Teacher_001 卡門 生物學
Teacher_002 維羅尼卡 數學
Teacher_003 喬治 英語

如果卡門教授兩門或兩門以上課程會怎麼樣? 這種設計有兩種選擇。 我們可以將它添加到卡門現有的記錄中,如下所示:

教師和課程
Teacher_ID 教師 _姓名 課程
Teacher_001 卡門 生物學,數學
Teacher_002 維羅尼卡 數學
Teacher_003 喬治 英語

然而,上面的設計不夠靈活,以後在嘗試插入,編輯或刪除數據時可能會導致問題。

這使得難以搜索數據。 這種設計違反了數據庫標準化的第一個原則,即第一範式(1NF) ,該原則規定每個表格單元應包含單個離散的數據片段。

另一種設計方案可能是簡單地為卡門添加第二條記錄:

教師和課程
老師 _ID 教師 _姓名 課程
Teacher_001 卡門 生物學
Teacher_001 卡門 數學
Teacher_002 維羅尼卡 數學
Teacher_003 喬治 英語

這符合1NF的要求,但數據庫設計仍然很差,因為它引入了冗餘,並且可能會不必要地膨脹一個非常大的數據庫。 更重要的是,數據可能會變得不一致。 例如,如果卡門的名字改變了怎麼辦? 有人使用這些數據可能會將她的名字更新為一條記錄,並且無法在第二條記錄中對其進行更新。 這種設計違反了第二範式(2NF),其遵守1NF,並且還必須通過將數據子集分成多個表並且在它們之間建立關係來避免多個記錄的冗餘。

如何設計具有一對多關係的數據庫

要在教師和課程表中實現一對多關係,我們將表分成兩部分,並使用外鍵將它們鏈接起來。

在這裡,我們已經移除了教師表中的課程列:

教師
老師 _ID 教師 _姓名
Teacher_001 卡門
Teacher_002 維羅尼卡
Teacher_003 喬治

這是課程表。 請注意,其外鍵Teacher_ID將課程鏈接到Teachers表中的教師:

培訓班
COURSE_ID 課程名 Teacher_ID
Course_001 生物學 Teacher_001
Course_002 數學 Teacher_001
Course_003 英語 Teacher_003

我們使用外鍵在教師和課程表之間建立了關係。

這告訴我們,卡門教授生物學和數學,而喬治教英語。

我們可以看到這個設計如何避免任何可能的冗餘,允許個別教師教授多門課程,並實現一對多的關係。

數據庫也可以實現一對一的關係和多對多的關係。