5NF 的判準不在資料裡,在業務規則裡

1NF 到 4NF 的判準都能從 schema 和資料看出來。5NF 不行 — 同樣一張表,同樣一批資料,該不該拆取決於一條只存在於領域規則裡的約束。

4NF 之前每個階段都在問「拆成兩張對不對」。5NF 問的是新問題:有沒有一張表,怎麼拆兩張都會出錯,但拆三張剛好對?

業務員表 R(業務員, 品牌, 產品):

業務員品牌產品
AliceToyota轎車
AliceFord貨車

拆兩張不行。 (業務員,品牌) ⋈ (業務員,產品) = 2 × 2 = 4 列,多出「Alice/Toyota/貨車」和「Alice/Ford/轎車」兩筆假資料 — lossy join。所以它不違反 4NF(品牌和產品在這裡矩形不完整,見 多值相依的判準是矩形完整,不是感覺獨立)。

拆三張剛好。 補上 (品牌,產品) = {(Toyota,轎車), (Ford,貨車)},拿它去篩那 4 列,兩筆假的剛好被砍掉,長回原表。第三張表的角色就是把兩兩 join 生出來的假組合篩掉 — 這就是「非拆三張不可」的意思。

但這不是永遠成立的

資料換一批(Bob 也在表裡):

業務員品牌產品
AliceToyota貨車
AliceFord轎車
BobToyota轎車

再看 (Alice, Toyota, 轎車):Alice 賣 Toyota ✅、Alice 賣轎車 ✅、Toyota 有生轎車 ✅ — 三張表都放行,但原表沒這一列。Alice 就是不賣 Toyota 的轎車。這張表不能拆,它已經是 5NF。

決定差別的是這條規則:

如果業務員 s 賣品牌 b、s 賣產品 p、而且 b 有生產 p,那麼 s 一定賣 b 牌的 p。

規則成立 → 連接相依存在 → 違反 5NF → 拆三張。規則不成立(有例外)→ 已是 5NF → 不准拆。

而這條規則你在資料裡看不出來,只能去問「我們公司是不是真的不允許業務員挑掉某個品牌的某項產品」。

實務上幾乎遇不到 5NF 違反,原因也在這裡:現實的業務規則通常有例外,一有例外就自動是 5NF 了。真正會踩到的是 4NF。