Data - 資料庫正規化
先來一個未正規化的表格
學生ID | 學生姓名 | 課程 | 教師姓名 | 教師聯絡方式 |
---|---|---|---|---|
S001 | 王小明 | 程式設計, 數據結構 | 李老師, 張老師 | 李老師: li@example.com, 張老師: zhang@example.com |
S002 | 李小花 | 程式設計 | 李老師 | li@example.com |
S002 | 李小花 | 計算機原理 | 趙老師 | zhao@example.com |
S003 | 張大千 | 數據結構, 計算機原理 | 張老師, 趙老師 | zhang@example.com, zhao@example.com |
第一正規化 (1NF)
目的要達成:
- 每一欄位只有單一值:將課程和教師姓名及其聯絡方式分解成原子資料。
- 去除重複值。
- 設定 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 |