# 資料庫正規化
###### tags:`database`
### Database Normalization
---
## 為何要執行正規化?
1. 提昇儲存資料與資料庫操作效率
2. 減少資料異常
3. 使資料庫維護更容易
---
### 你484也建過像這樣的table?
Comsumptions

---

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

---

問題:出現過多重複資料
---
## 第二正規化
---
第二NF要完成的工作:
-----
1. 為將會重複出現的欄位資料建立一個獨立的資料表
2. 透過一個foreign key來關聯這些資料表的資料
---

---

| 姓名 | 性別| 項目 |價格|數量|總金額 |商店 | 地址 | 日期 |訂單編號
| --|---|--- | ---|---|-- | ----|--|---- |---|---|
| 阿寶 | 女 | 鉛筆|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
總金額和商品、數量存在遞移相依(相依於商品和數量但和主鍵無直接關係)
為了避免數量改變而總金額沒改到造成資料錯誤,應該把總金額那個欄位移除
---

---
## BUT,
---
Ex:想找豆芽買牛奶的地址
---

---
#### 結論:資料庫正規化要進行到什麼程度,
#### 應視資料量與操作資料的需求而定。
{"metaMigratedAt":"2023-06-15T02:36:23.533Z","metaMigratedFrom":"Content","title":"資料庫正規化","breaks":true,"contributors":"[{\"id\":\"ea099c4f-2fde-4dbd-a3da-086167041870\",\"add\":5161,\"del\":3390}]"}