###### tags: '正規化' # RDBMS 正規化 --- ## 1NF (除去重複資料) > 為了要排除重複群的出現,table 內的所有資料均為不可分割的原子所組成。 - [x] 每一個欄位均為atomic,不能存入2筆以上的資料 - [x] 沒有任兩筆data會完全相同(pk不重複) - [x] table包含pk,而其他欄位會相依於pk ### A. 範例 **學生選課table**: |<u>學號<u>|姓名|<u>課程代碼<u>|課程名稱|學分|分數|老師編號|老師姓名| |-|-|-|-|-|-|-|-| |S001|Bill|C001<br>C002|微積分<br>工業數學|4<br>4|98<br>87|T001<br>T002|小名<br>小王| |S002|Jack|C002<br>C003<br>C004|工業數學<br>離散數學<br>線性代數|4<br>2<br>3|62<br>55<br>73|T002<br>T003<br>T004|小王<br>小陳<br>小美| - 多個欄位具有2個以上的值,不符合1NF 1NF後 **學生選課table**: |<u>學號<u>|姓名|<u>課程代碼<u>|課程名稱|學分|分數|老師編號|老師姓名| |-|-|-|-|-|-|-|-| |S001|Bill|C001|微積分|4|98|T001|小明| |S001|Bill|C002|工業數學|4|87|T002|小王| |S002|Jack|C002|工業數學|4|62|T002|小王| |S002|Jack|C003|離散數學|2|55|T003|小陳| |S002|Jack|C004|線性代數|3|73|T004|小美| --- ## 2NF (除去部分相依) > 完成1NF後,table內會出現許多重複的資料,造成資料表空間的浪費;且課程資料會相依於學生,無法單獨針對課程做增刪修。 ### A. 定義 - [x] 符合1NF - [x] 每一個非pk欄位均相依於pk - [x] 換言之,部分功能相依僅會發生於複合主鍵的情況 ### B. 範例 1. **學生選課table**: |<u>學號<u>|姓名|<u>課程代碼<u>|課程名稱|學分|分數|老師編號|老師姓名| |-|-|-|-|-|-|-|-| |S001|Bill|C001|微積分|4|98|T001|小明| |S001|Bill|C002|工業數學|4|87|T002|小王| |S002|Jack|C002|工業數學|4|62|T002|小王| |S002|Jack|C003|離散數學|2|55|T003|小陳| |S002|Jack|C004|線性代數|3|73|T004|小美| - `姓名`只相依於`學號` - `課程名稱`只相依於`課程代號` - 不符合2NF 2NF後: 1. **學生table** |<u>學號<u>|姓名| |-|-| |S001|Bill| |S002|Jack| 2. **課程table** |<u>課程代碼<u>|課程名稱|學分|老師編號|老師姓名| |-|-|-|-|-| |C001|微積分|4|T001|小明| |C002|工業數學|4|T002|小王| |C003|離散數學|2|T003|小陳| |C004|線性代數|3|T004|小美| 3. **學生選課table** |<u>學號<u>|課程代碼|成績| |-|-|-| |S001|C001|98| |S001|C002|87| |S002|C002|62| |S002|C003|55| |S002|C004|73| --- ## 3NF (除去遞移相依) > **課程table** 存在遞移相依的關係 > - `老師姓名`相依於`老師編號` > - `老師編號`相依於`課程代碼` ### A. 定義 - [x] 符合2NF - [x] 各欄位與pk沒有遞移相依 ### B. 範例 1. **課程table** |<u>課程代碼<u>|課程名稱|學分|老師編號|老師姓名| |-|-|-|-|-| |C001|微積分|4|T001|小明| |C002|工業數學|4|T002|小王| |C003|離散數學|2|T003|小陳| |C004|線性代數|3|T004|小美| - `老師姓名`相依於`老師編號` - `老師編號`相依於`課程代碼` - 不符合3NF 3NF後 1. **課程table** |<u>課程代碼<u>|課程名稱|學分|老師編號| |-|-|-|-| |C001|微積分|4|T001| |C002|工業數學|4|T002| |C003|離散數學|2|T003| |C004|線性代數|3|T004| 2. **老師 table** |<u>老師編號<u>|老師姓名| |-|-| |T001|小名| |T002|小王| |T003|小陳| |T004|小美| --- ## BCNF (3NF加強) :::info 通常正規化到BCNF即可 ::: > 單一pk符合BCNF > 複合pk需要再進行BCNF ### A. 定義 - [x] 符合3NF - [x] 每個複合pk不可相依於其餘非主鍵欄位 ### B. 範例 以**學生選課table**為例 |<u>學號<u>|課程代碼|成績| |-|-|-| |S001|C001|98| |S001|C002|87| |S002|C002|62| |S002|C003|55| |S002|C004|73| - `成績`相依於`學號`+`課程代號` - `課程代號`無相依於`成績` - `學號`無相依於`成績` --- ## 4NF (除去多值相依) > ### A. 定義 - [x] 符合BCNF - [x] table擁有3個以上的pk,A對應B時,B有多個值相對應;A對應C時,C也有多個值相對應,B、C之間無關聯 ### B. 範例 1. **學生table** |<u>學號<u>|姓名|<u>指導教授<u>|教授名稱|<u>論文<u>| |-|-|-|-|-| |S001|Bill|T01|教授A|論文1| |S001|Bill|T01|教授A|論文2| |S001|Bill|T01|教授A|論文3| |S001|Bill|T02|教授B|論文2| |S001|Bill|T02|教授B|論文4| - `學號` 對應多個 `指導教授` - `學號` 對應多個 `論文` - `指導教授`、`論文` 無關聯 - 不符合4NF 4NF後 1. 學生興趣table |<u>學號<u>|<u>指導教授<u>| |-|-| |S001|T01| |S001|T02| 2. 學生寵物table |<u>學號<u>|<u>論文<u>| |-|-| |S001|論文1| |S001|論文2| |S001|論文3| |S001|論文4| --- ## 5NF (除去合併相依) ### A. 定義 - [x] 符合4NF - [x] 有3個以上的pk,且pk彼此之間有關連 - 合併相依: 一張table拆分成3張以上的表格,並可以透過多次合併恢復成原來的table ### B. 範例 stc table |<u>student<u>|<u>teacher<u>|<u>course<u>| |-|-|-| |小明|教授A|計算機概論| |小明|教授B|演算法| |小華|教授B|演算法| |小華|教授A|網路安全| |小華|教授C|演算法| 可拆分成 st table |<u>student<u>|<u>teacher<u>| |-|-| |小明|教授A| |小明|教授B| |小華|教授A| |小華|教授B| |小華|教授C| tc table |<u>teacher<u>|<u>course<u>| |-|-| |教授A|計算機概論| |教授A|網路安全| |教授B|演算法| |教授C|演算法| sc table |<u>student<u>|<u>course<u>| |-|-| |小明|計算機概論| |小明|演算法| |小華|演算法| |小華|網路安全| 在合併 st & tc table |<u>student<u>|<u>teacher<u>|<u>course<u>| |-|-|-| |小明|教授A|計算機概論| |小明|教授A|網路安全| |小明|教授B|演算法| |小華|教授A|計算機概論| |小華|教授A|網路安全| |小華|教授B|演算法| |小華|教授C|演算法| 在合併 st & tc & sc table |<u>student<u>|<u>teacher<u>|<u>course<u>| |-|-|-| |小明|教授A|計算機概論| |小明|教授B|演算法| |小華|教授B|演算法| |小華|教授C|演算法| |小華|教授A|網路安全| 恢復成原來的表格,stc table存在合併相依,需要再做拆分 --- ## Reference - http://cc.cust.edu.tw/~ccchen/doc/db_04.pdf - http://spaces.isu.edu.tw/upload/19225/0/news/postfile_349.pdf - http://debussy.im.nuu.edu.tw/sjchen/Database/Final/Ch05.pdf
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up