遞移相依:欄位靠另一個普通欄位才連到主鍵
欄位1 和主鍵相關,欄位2 和欄位1 相關,那麼欄位2 和主鍵就是遞移相依。第三正規化要消除的就是這個。
一眼看得出來的例子
items(id PK, name, price, store_id, store_name, store_address)
| id (PK) | name | price | store_id | store_name | store_address |
|---|---|---|---|---|---|
| 1 | 鉛筆 | 20 | 1 | 久成久 | 東區大學路 |
| 2 | 橡皮擦 | 50 | 1 | 久成久 | 東區大學路 |
主鍵是單一欄,2NF 沒問題。但 store_name 根本不是「鉛筆的名字」,它是**「1 號商店的名字」**——要繞一圈才連得到主鍵:
id → store_id → store_name
^^^^^^^^ 中間這個是普通欄位,不是主鍵
為什麼要消除
久成久改名,要改的不是一列,是所有久成久賣的商品那一堆列。修法是把 store_id / store_name / store_address 抽成獨立的 stores 表,商品只留 FK。
判準一句話:非主鍵欄位彼此之間應該互相獨立,誰也不許靠著誰才連到主鍵。
別跟衍生欄位搞混
total_amount = price × count 這種欄位也該拿掉,但理由不同,見 衍生欄位該拿掉的理由不是遞移相依。三個 NF 的關係見 正規化的三個階段是同一個問句的三種問法。