首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

數據庫範式判斷實戰:R(A,B,C) F={A→B, B→A, C→A} 範式分析

     編輯:程式設計疑難解答

題目條件

  • 關系模式:R(A, B, C)
  • 函數依賴集:F = {A → B, B → A, C → A}

步驟一:求候選碼

計算各屬性集的閉包:


A⁺ = {A, B}  (A→B, B→A 形成循環)
B⁺ = {B, A}  (同理)
C⁺ = {C, A, B} = {A, B, C}  (C→A, A→B)
AB⁺ = {A, B}
AC⁺ = {A, B, C}
BC⁺ = {A, B, C}

候選碼:{C}、{A, C}、{B, C}(最小超鍵)

主屬性:A, B, C(全部屬性都包含在某個候選碼中)

非主屬性:無

步驟二:範式層層判定

1NF(第一范式)

✅ 滿足:假設關系模式中所有屬性均為不可分的基本數據項。

2NF(第二范式)

定義:無非主屬性對候選碼的部分函數依賴。

✅ 滿足:因無非主屬性,不存在部分函數依賴問題。
(即便有部分依賴,也只能是主屬性對候選碼的部分依賴,不違反 2NF)

3NF(第三范式)

定義:無非主屬性對候選碼的傳遞函數依賴。
等價條件:對 F 中每個非平凡函數依賴 X → Y,滿足 X 是超鍵,或 Y 是主屬性。

檢查 F 中每個 FD:

函數依賴左邊 X 是超鍵?右邊 Y 是主屬性?結論
A → B否 (A⁺={A,B})是 (B 是主屬性)✅ 滿足 3NF
B → A否 (B⁺={A,B})是 (A 是主屬性)✅ 滿足 3NF
C → A是 (C 是候選碼)是 (A 是主屬性)✅ 滿足 3NF

結論:滿足 3NF

BCNF(巴澤-科德範式)

定義:對 F 中每個非平凡函數依賴 X → Y,X 必須是超鍵。(比 3NF 更嚴格,不允許主屬性對非超鍵的依賴)

檢查:

  • A → B:A 不是超鍵 ❌ 違反 BCNF
  • B → A:B 不是超鍵 ❌ 違反 BCNF
  • C → A:C 是超鍵 ✅

結論:不滿足 BCNF

最終答案

該關系模式屬於第三范式 (3NF),但不屬於 BCNF。

深度解析:為什麼有主屬性依賴非超鍵?

這是一個經典的主屬性對關鍵字部分依賴/傳遞依賴的例子:

  • A 和 B 相互決定(A ↔ B),形成一個等價類
  • C 決定 A(從而決定 B),C 是唯一能決定全部屬性的單屬性候選碼
  • 但 A、B 作為主屬性,卻依賴於非超鍵(A 依賴 B,B 依賴 A)

分解建議(若需達到 BCNF)


-- 分解為兩個關系:
R1(A, B)  -- F1 = {A → B, B → A}  候選碼:{A}, {B}  → BCNF
R2(C, A)  -- F2 = {C → A}          候選碼:{C}        → BCNF

-- 自然連接 R1 ⋈ R2 可無損恢復原關系
-- 但分解後需注意:原 FD C→B 變為跨關系依賴,應用層需維護一致性

判斷口訣


一范式:看原子性(有無多值屬性)
二范式:看非主屬性是否部分依賴候選碼(無非主屬性直接過)
三范式:看非主屬性是否傳遞依賴候選碼(或:左邊非超鍵時右邊必須是主屬性)
BCNF:看所有決定因是否為超鍵(最嚴格,主屬性也不能依賴非超鍵)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved