正規化的三個階段是同一個問句的三種問法
三個 NF 背起來像三條無關的規則,但它們其實都在問同一件事:這個欄位到底跟誰有關。目標也只有一個——一張表只單純描述一個事實。
| 問句 | 犯規長相 | |
|---|---|---|
| 1NF | 這一格裝了幾個值? | items = "鉛筆, 橡皮擦" |
| 2NF | 這個欄位是不是只跟主鍵的一部分有關? | PK = (customer_id, item_id),但 item_name 只跟 item_id 有關 |
| 3NF | 這個欄位是不是先跟另一個普通欄位有關,才輪到主鍵? | store_name 其實是「1 號商店的名字」,不是「這個商品的名字」 |
2NF 和 3NF 的修法都是拆表,差別只在犯規的欄位是巴著主鍵的一部分,還是巴著另一個普通欄位。看懂這點就不用死記兩條規則。
順帶兩個定義:
- 候選鍵:能讓資料唯一、而且是最小的欄位組合。
- 部分相依通常只發生在複合主鍵的情況(見 單一主鍵讓 2NF 自動成立,但重複一點都沒少)。
正規化本身不是目的,改漏一列的代價不是工多,是資料安靜地不一致 才是它要買的保險。
這個問句到 BCNF 為止都還成立(只是判準從主鍵換成候選鍵,見 正規化的判準是候選鍵,不是主鍵);4NF 之後問句就換了 — 問的不再是「這個欄位」而是「這一組值」跟誰有關,全景見 正規化的五個階段對應三種相依性。