首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

關係型資料庫設計三大範式(1NF/2NF/3NF)核心原則與實例解析

     編輯:Oracle 教學

關係型資料庫設計三大範式(1NF/2NF/3NF)核心原則與實例解析

範式是關係型資料庫設計的基石,解決資料冗餘、更新異常與刪除異常。本文以通俗語言解析前三範式核心原則。

第一範式 (1NF) - 原子性

定義: 關係模式的每個屬性都是不可分割的基本資料項(原子值)。

三大準則:

  1. 單一值:每個屬性只能包含一個值,不可為集合、陣列、多值欄位
  2. 同數量:每個元組 (行) 必須包含相同數量的屬性值
  3. 唯一性:任意兩個元組不得完全相同(需有主鍵區分)

違反 1NF 範例

學號姓名課程 (違反:多值)電話 (違反:多值)
S001張三數學,英文,物理0912-345678, 02-23456789

修正: 拆分為學生表、選課表、電話表,每欄位僅存單一原子值。

第二範式 (2NF) - 完全函數依賴

前提: 必須滿足 1NF。

定義: 非主鍵屬性必須完全依賴於主鍵(而非部分依賴)。

核心判斷: 若主鍵為複合鍵 (K1, K2),非主鍵屬性 A 不能僅依賴 K1 或 K2 的一部分。

違反 2NF 範例:學生選課表

學號 (PK)課程號 (PK)學生姓名課程名稱學分成績
S001C01張三數學390
S001C02張三英文285

問題:

  • 學生姓名「部分依賴」於學號 (PK 的一部分)
  • 課程名稱、學分「部分依賴」於課程號 (PK 的一部分)
  • 導致資料冗餘:張三姓名重複儲存、數學課程名重複儲存
  • 異常:新增課程無學生無法記錄;刪除唯一選課記錄導致課程資訊遺失

符合 2NF 拆分

學生表課程表選課表
學號 (PK)姓名課程號 (PK)課程名稱學分學號 (FK)課程號 (FK)成績

非主鍵屬性現在完全依賴各自表的主鍵。

第三範式 (3NF) - 無傳遞函數依賴

前提: 必須滿足 2NF。

定義: 非主鍵屬性不得對候選鍵產生傳遞函數依賴(即:非主鍵屬性不依賴於其他非主鍵屬性)。

口訣: 「非主鍵不依賴非主鍵」

違反 3NF 範例:員工表

員工號 (PK)姓名部門號部門名稱部門地點
E001李四D01研發部台北
E002王五D01研發部台北

依賴鏈: 員工號 → 部門號 → (部門名稱, 部門地點)

  • 部門名稱、部門地點「傳遞依賴」於員工號 (透過部門號)
  • 屬於非主鍵屬性 (部門號) 決定其他非主鍵屬性

符合 3NF 拆分

員工表部門表
員工號 (PK)姓名部門號 (FK)部門號 (PK)部門名稱部門地點

範式遞進關係總結

1NF (原子性) → 2NF (消除部分依賴) → 3NF (消除傳遞依賴)
每一層都是下一層的基礎,不可跳級。

實務中的平衡:適度反正規化

嚴格遵循 3NF 會導致查詢需多表 JOIN,影響效能。實務上常見策略:

場景策略風險控管
高頻 JOIN 查詢保留冗餘欄位 (如部門名稱在員工表)觸發器/應用層同步更新、定期一致性檢查
歷史快照/報表維度建模 (星型/雪花模型)接受受控冗餘,ETL 保證一致性
核心交易系統嚴格 3NF/BCNF資料完整性優先,效能靠索引/分區優化

BCNF (Boyce-Codd 範式) 簡介

3NF 的強化版:每個決定因素都必須是候選鍵。處理「主鍵屬性對主鍵屬性的部分/傳遞依賴」極端情況。實務中 3NF 通常已足夠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved