# 資料庫正規化 ###### tags:`database` ### Database Normalization --- ## 為何要執行正規化? 1. 提昇儲存資料與資料庫操作效率 2. 減少資料異常 3. 使資料庫維護更容易 --- ### 你484也建過像這樣的table? Comsumptions ![](https://i.imgur.com/h4E5H2u.png) --- ![](https://i.imgur.com/T6yVjcu.png) 1. 一個欄位儲存多筆資料 2. 出現意義上重複的欄位 3. 缺乏主鍵(Primary Key) --- ## 第一正規化 --- 第一NF要完成的工作: ----- 1. 一個欄位只能有單一值 2. 消除意義上重複的欄位 3. 決定主鍵 --- comsumptions | 姓名 | 性別|gender | 項目 |價格|數量|總金額 商店 | 地址 | 日期 | | --|---|--- | ---|---|-- | ----|--|---- |---| | 阿寶 | 女 | F | 鉛筆|20|1|20|久成久|東區大學路|12/17 | 阿寶 | 女 | F | 橡皮擦|50|2|100|久成久|東區大學路|12/17 | 豆芽 | 女 | F | 牛奶|70|3|210|全家|東區北門路|12/18 | 豆芽 | 女 | F | 三明治|10|1|10|全家|東區北門路|12/18 | 豆芽 | 女 | F | 牛奶|70|3|210|全家|東區北門路|12/19 | 豆芽 | 女 | F | 三明治|10|4|40|全家|東區北門路|12/19 | 老皮 | 男 | M |蛋餅|30|1|30|日蝕|東區成功路|12/19 | 老皮 | 男 | M |奶茶|40|2|80|日蝕|東區成功路|12/19 ![](https://i.imgur.com/OKbmqfk.png) --- ![](https://i.imgur.com/8jSE6Am.png) 問題:出現過多重複資料 --- ## 第二正規化 --- 第二NF要完成的工作: ----- 1. 為將會重複出現的欄位資料建立一個獨立的資料表 2. 透過一個foreign key來關聯這些資料表的資料 --- ![](https://i.imgur.com/sqxSmEV.png) --- ![](https://i.imgur.com/5QviXhn.png) | 姓名 | 性別| 項目 |價格|數量|總金額 |商店 | 地址 | 日期 |訂單編號 | --|---|--- | ---|---|-- | ----|--|---- |---|---| | 阿寶 | 女 | 鉛筆|20|1|20|久成久|東區大學路|12/17|1| | 阿寶 | 女 | 橡皮擦|50|2|100|久成久|東區大學路|12/17|1| | 豆芽 | 女 | 牛奶|70|3|210|全家|東區北門路|12/18|2| | 豆芽 | 女 | 三明治|10|1|10|全家|東區北門路|12/18|2| | 豆芽 | 女 | 牛奶|70|3|210|全家|東區北門路|12/19|3 | 豆芽 | 女 | 三明治|10|4|40|全家|東區北門路|12/19|3 | 老皮 | 男 |蛋餅|30|1|30|日蝕|東區成功路|12/19|4 | 老皮 | 男 | 奶茶|40|2|80|日蝕|東區成功路|12/19|4 consumers | 姓名 | 性別| |---|--- | | 阿寶 | 女 | |豆芽 | 女 | |老皮 | 男 | 商店 商店 | 地址 | |--|---- |---| | 久成久|東區大學路| | 久成久|東區大學路| | 全家|東區北門路| | 全家|東區北門路| | 全家|東區北門路| | 全家|東區北門路| | 日蝕|東區成功路| | 日蝕|東區成功路| 商品 項目 |價格|商店 | | ---|---|-- | ----| | 鉛筆|20|久成久| | 橡皮擦|50|久成久| | 牛奶|70|全家| | 三明治|10|全家| |蛋餅|30|日蝕| | 奶茶|40|日蝕| 訂單 消費者|單價|數量|總金額 |商店 | 日期 |訂單編號 |---| ---|---|-- | ----|--|---|---| |阿寶| 20|1|20|久成久|12/17|1 |阿寶| 50|2|100|久成久|12/17|1 |豆芽| 70|3|210|全家|12/18|2 |豆芽| 10|1|10|全家|12/18|2 |豆芽| 70|3|210|全家|12/19|3 |老皮| 10|4|40|全家|12/19|3 |老皮|30|1|30|日蝕|12/19|4 |老皮| 40|2|80|日蝕|12/19|4 問題:存在部份欄位與主欄位的間接(遞移)相依 --- ## 第三正規化 --- 第三NF要完成的工作: * 消除資料表中的遞移相依 訂單 消費者|商品|數量|總金額 |商店 | 日期 |訂單編號 |---| ---|---|-- | ----|--|---| |阿寶| 鉛筆|1|20|久成久|12/17|1 |阿寶| 橡皮擦|2|100|久成久|12/17|1 |豆芽| 牛奶|2|140|全家|12/18|2 |豆芽| 三明治|1|10|全家|12/18|2 |豆芽| 牛奶|3|210|全家|12/19|3 |豆芽| 三明治|4|40|全家|12/19|3 |老皮|蛋餅|1|30|日蝕|12/19|4 |老皮| 奶茶|2|80|日蝕|12/19|4 總金額和商品、數量存在遞移相依(相依於商品和數量但和主鍵無直接關係) 為了避免數量改變而總金額沒改到造成資料錯誤,應該把總金額那個欄位移除 --- ![](https://i.imgur.com/HFGtnV4.png) --- ## BUT, --- Ex:想找豆芽買牛奶的地址 --- ![](https://i.imgur.com/s0N4U0x.png) --- #### 結論:資料庫正規化要進行到什麼程度, #### 應視資料量與操作資料的需求而定。
{"metaMigratedAt":"2023-06-15T02:36:23.533Z","metaMigratedFrom":"Content","title":"資料庫正規化","breaks":true,"contributors":"[{\"id\":\"ea099c4f-2fde-4dbd-a3da-086167041870\",\"add\":5161,\"del\":3390}]"}
    950 views