多值相依的判準是矩形完整,不是感覺獨立

4NF 的教材幾乎都說「兩組值彼此獨立就違反 4NF」。獨立是結論不是判準 — 拿一張真表來你還是不知道怎麼判。多值相依有一個可以直接驗資料的定義。

X ↠ Y 成立 ⟺ 只要表裡同時有 (x, y₁, z₁) 和 (x, y₂, z₂),就一定也有 (x, y₁, z₂) 和 (x, y₂, z₁)。

翻成白話:同一個 x 底下的 (Y × Z) 必須是完整的笛卡兒積,一格都不能缺。 叫它矩形完整性。

披薩店 (餐廳, 口味, 配送區):只要 A1 店有「起司/北區」和「海鮮/南區」,就一定要有「起司/南區」和「海鮮/北區」。這順手解釋了原文說的「列數變成乘積」— 定義本來就要求它是乘積,新增一種口味要為每個區各插一列。

反過來才是關鍵

只要缺一格,多值相依就不成立,這張表已經是 4NF,不准拆。

如果 A1 的起司披薩只送北區、南區不送,那口味和配送區就不獨立,這張表記的是真正的三元事實;硬拆成兩張再 join 回來會生出「起司/南區」這條不存在的資料。

三個定義上的齒輪

  • 每條函數相依都是多值相依的特例,所以 4NF 蘊含 BCNF。
  • 平凡多值相依是 Y ⊆ X 或 X ∪ Y 已是全部欄位 → 兩欄的表永遠是 4NF。
  • 表裡不能有第三種跟著「組合」跑的欄位。加一欄「該口味在該區的售價」,多值相依就破了 — 那欄同時相依於口味和配送區。

違反 4NF 等於把 join 的笛卡兒積放大結果直接存進磁碟(JOIN 貴在每一列都要去另一張表配對 講的是同一個現象發生在查詢時),而漏插一列就是 改漏一列的代價不是工多,是資料安靜地不一致:某區買不到某個口味,資料庫不會抗議。