本篇會繼續以第二正規化(2NF)的基本原則來優化老師資料表(teachers)。
我們先來看看 teachers 資料表的欄位:
| 欄位名稱 | 說明 | 
|---|---|
| teacher_id | 主鍵,識別唯一老師 | 
| first_name | 依賴 teacher_id | 
| last_name | 依賴 teacher_id | 
| birth_date | 依賴 teacher_id | 
| subject_taught | ❌不依賴 teacher_id | 
| address fields | 依賴 teacher_id | 
subject_taught 是該教師教授的科目名稱。然而,該欄位內容不是依賴 teacher_id 而產生的原始資料,而是來自 subjects 資料表的欄位(例如:subject_id或subject_name)。
將科目名稱直接存於 teachers 資料表中會導致資料重複與不一致性,也違反了 2NF 的原則。
一位教師可以教授多個科目 → 是 一對多(1:N)的關係(雖然實務上一門科目可以有多位老師,不過這裡假設一門科目只有一位老師,更精確的意思是 teachers 與 subjects 是一對多關係),所以應將資料從 teachers 資料表中移出,改為在 subjects 資料表中透過外鍵(Foreign Key)關聯。
在 subjects 資料表中新增一個欄位 teacher_id。
這個欄位作為外鍵,指向 teachers 資料表的主鍵。
這樣就可以表示某個科目是由哪位教師教授。
接著,從 teachers 資料表中移除 subject_taught 欄位。
teacher_id 完全相依。subject_taught 已透過關聯關係分離處理。將 teachers 資料表正規化至第二正規形式的核心在於:
更新後的資料表關聯圖如下: