正規化的三個階段是同一個問句的三種問法

三個 NF 背起來像三條無關的規則,但它們其實都在問同一件事:這個欄位到底跟誰有關。目標也只有一個——一張表只單純描述一個事實。

問句犯規長相
1NF這一格裝了幾個值?items = "鉛筆, 橡皮擦"
2NF這個欄位是不是只跟主鍵的一部分有關?PK = (customer_id, item_id),但 item_name 只跟 item_id 有關
3NF這個欄位是不是先跟另一個普通欄位有關,才輪到主鍵?store_name 其實是「1 號商店的名字」,不是「這個商品的名字」

2NF 和 3NF 的修法都是拆表,差別只在犯規的欄位是巴著主鍵的一部分,還是巴著另一個普通欄位。看懂這點就不用死記兩條規則。

順帶兩個定義:

正規化本身不是目的,改漏一列的代價不是工多,是資料安靜地不一致 才是它要買的保險。

這個問句到 BCNF 為止都還成立(只是判準從主鍵換成候選鍵,見 正規化的判準是候選鍵,不是主鍵);4NF 之後問句就換了 — 問的不再是「這個欄位」而是「這一組值」跟誰有關,全景見 正規化的五個階段對應三種相依性。