Skip to main content

資料庫正規化

先來一個未正規化的表格

學生ID學生姓名課程教師姓名教師聯絡方式
S001王小明程式設計, 數據結構李老師, 張老師李老師: li@example.com, 張老師: zhang@example.com
S002李小花程式設計李老師li@example.com
S002李小花計算機原理趙老師zhao@example.com
S003張大千數據結構, 計算機原理張老師, 趙老師zhang@example.com, zhao@example.com

第一正規化 (1NF)

目的要達成:

  1. 每一欄位只有單一值:將課程教師姓名及其聯絡方式分解成原子資料。
  2. 去除重複值。
  3. 設定 primary key:這裡我們選擇學生ID + 課程作為聯合主鍵。
學生ID學生姓名課程教師姓名教師聯絡方式
S001王小明程式設計李老師li@example.com
S001王小明數據結構張老師zhang@example.com
S002李小花程式設計李老師li@example.com
S002李小花計算機原理趙老師zhao@example.com
S003張大千數據結構張老師zhang@example.com
S003張大千計算機原理趙老師zhao@example.com

第二正規化 (2NF)

目的:確保所有非主鍵字段完全依賴於主鍵
在這個例子中,需要把教師姓名教師聯絡方式移至一個新表,因為它們與課程有依賴關係,但不直接依賴於聯合主鍵學生ID + 課程

學生課程表(學生ID + 課程仍作為聯合主鍵)

學生ID學生姓名課程
S001王小明程式設計
S001王小明數據結構
S002李小花程式設計
S002李小花計算機原理
S003張大千數據結構
S003張大千計算機原理

課程教師表

課程教師姓名教師聯絡方式
程式設計李老師li@example.com
數據結構張老師zhang@example.com
計算機原理趙老師zhao@example.com

第三正規化 (3NF)

第三正規化要求滿足2NF,並且所有非主鍵欄位之間不能有相互依賴的關係。
在這個例子中,教師聯絡方式直接依賴於教師姓名,而不是依賴於課程。因此,將教師姓名教師聯絡方式移到一個新的教師資訊表中。

學生課程表(保持不變)

學生ID學生姓名課程
S001王小明程式設計
S001王小明數據結構
S002李小花程式設計
S002李小花計算機原理
S003張大千數據結構
S003張大千計算機原理

課程教師表(僅包含課程和教師姓名)

課程教師姓名
程式設計李老師
數據結構張老師
計算機原理趙老師

教師聯絡資訊表

教師姓名教師聯絡方式
李老師li@example.com
張老師zhang@example.com
趙老師zhao@example.com