目錄
Normalization(范式化)
為什么需要 Normalization?
🧩 表格分析:
第一范式(1NF)?
?什么是第一范式(First Normal Form)?
?第二范式(2NF)
?什么是第二范式(2NF)?
怎么規范化成 2NF?
?第三范式(3NF)
什么是第三范式(3NF)?
當前表違反 3NF 的原因:
規范化為3NF?
Normalization(范式化)
為什么需要 Normalization?
目的:
-
減少數據冗余(重復)
-
避免數據不一致
-
提高數據完整性
-
簡化維護(插入、更新、刪除)
🧩 表格分析:
原始表(未規范化):
Student | Year | Class | Teacher |
---|---|---|---|
John Smith | 9 | Geography | Mr. Green |
Tom Buchanan | 9 | Geography | Mr. Green |
Sarah Bennet | 8 | Physics | Mrs. Einstein |
Charlie Brown | 9 | Geography | Mr. Green |
April Barnes | 10 | Music | Mrs. Sharpe |
這個表的問題:
-
“Geography - Mr. Green” 重復了 3 次。
-
如果某天 Mr. Green 改名了,需要修改所有相關記錄 → 數據一致性風險
-
如果 Geography 班級沒有學生,無法記錄老師信息 → 數據不完整
第一范式(1NF)?
?什么是第一范式(First Normal Form)?
-
字段中不能有多個值(必須是原子值)
-
字段名不應重復(如 Class1, Class2)
-
每一行記錄應代表一個唯一實體的單一信息單位
Student | Year | Class |
---|---|---|
Paul Dawson | 11 | Math |
Peggy Mitchell | 10 | History |
Paul Dawson | 11 | Math |
Brian Cox | 8 | English, Chemistry |
Linda Marsh | 7 | Math, History, Biology |
? 為什么這個表不滿足第一范式(1NF)?
-
字段“Class”不是原子值(存在多個值組合成一個字段):
-
Brian Cox 的 Class 是 “English, Chemistry”(包含多個課程)
-
Linda Marsh 的 Class 是 “Math, History, Biology”
-
這違反了 1NF 的“每個字段必須只包含一個值”的規則。
-
-
存在重復行(Paul Dawson 出現了兩次,內容完全一樣)。
?規范化后的學生信息表
💡 拆解多值字段 → 變為多行,每行只包含一個原子值
學生姓名(Student) | 年級(Year) | 課程(Class) |
---|---|---|
Paul Dawson | 11 | Math |
Peggy Mitchell | 10 | History |
Paul Dawson | 11 | Math |
Brian Cox | 8 | English |
Brian Cox | 8 | Chemistry |
Linda Marsh | 7 | Math |
Linda Marsh | 7 | History |
Linda Marsh | 7 | Biology |
?第二范式(2NF)
?什么是第二范式(2NF)?
2NF 的定義: 一個表滿足 2NF,要求它首先是 1NF,且不能有任何“非主屬性”對主鍵的部分依賴。?
通俗講:
-
如果主鍵是復合主鍵(比如由 Student, Subject?組成),
-
那么其他字段(如 Age) 必須依賴于整個主鍵,而不能只依賴主鍵的一部分。
? 看看這個表的問題在哪:
Student | Subject | Grade | Age |
---|---|---|---|
Natasha Williams | Maths | A | 15 |
Natasha Williams | English | B | 15 |
Daniel James | Maths | C | 16 |
Simon Brown | Chemistry | A | 14 |
Emma Thomas | Geography | B | 14 |
-
Grade
依賴于整個(Student + Subject)
,這是 OK 的? -
但
Age
只依賴于Student
,不依賴 Subject? → 部分依賴!
怎么規范化成 2NF?
我們要“消除部分依賴” → 拆成兩個表:讓每張表中,非主屬性都完全依賴主鍵。
表一:成績表(以 Student + Subject
為主鍵)?
Student | Subject | Grade |
---|---|---|
Natasha Williams | Maths | A |
Natasha Williams | English | B |
Daniel James | Maths | C |
Simon Brown | Chemistry | A |
Emma Thomas | Geography | B |
表二:學生基本信息表(以 Student
為主鍵)?
Student | Age |
---|
Natasha Williams | 15 |
Daniel James | 16 |
Simon Brown | 14 |
Emma Thomas | 14 |
-
主鍵:
Student
-
非主屬性:
Age
-
Age
完全依賴于Student
,符合第二范式 ?
?第三范式(3NF)
什么是第三范式(3NF)?
一個關系模式滿足 3NF,需要:
-
滿足 2NF;
-
所有非主屬性 必須直接依賴主鍵,不能依賴其他非主屬性(即消除傳遞依賴)。
原始表:
Subject | Year | Star Pupil | Star Pupil Date Of Birth |
---|---|---|---|
Math | 2015 | Matthew Taylor | 1999-03-21 |
Physics | 2015 | William Edwards | 1999-09-15 |
Chemistry | 2015 | Georgina Simon | 1998-11-04 |
Math | 2016 | Benjamin Long | 2000-05-02 |
Physics | 2016 | William Edwards | 1999-09-15 |
當前表違反 3NF 的原因:
-
主鍵候選是
(Subject, Year)
-
Star Pupil
是依賴于(Subject, Year)
? -
但是
Star Pupil Date Of Birth
是依賴于Star Pupil
? → 傳遞依賴存在
規范化為3NF?
表一:課程之星表?
主鍵:Subject + Year,非主鍵:Star Pupil)
Subject | Year | Star Pupil |
---|---|---|
Math | 2015 | Matthew Taylor |
Physics | 2015 | William Edwards |
Chemistry | 2015 | Georgina Simon |
Math | 2016 | Benjamin Long |
Physics | 2016 | William Edwards |
表二:學生信息表?
(主鍵:Star Pupil,非主鍵:Date of Birth)
Star Pupil | Date of Birth |
---|---|
Matthew Taylor | 1999-03-21 |
William Edwards | 1999-09-15 |
Georgina Simon | 1998-11-04 |
Benjamin Long | 2000-05-02 |
通過拆分:
-
我們將“課程→之星學生”和“學生→出生日期”的兩種關系分離;
-
保證每個非主屬性直接依賴其所屬表的主鍵;