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

資料庫三大範式深度解析:1NF、2NF、3NF 完整說明與範例

     編輯:MySQL 綜合教學

資料庫三大範式深度解析

資料庫設計範式是關聯式資料庫結構設計的規範標準。符合範式的資料表結構清晰、無冗余,能避免插入、刪除、更新異常。本文詳細說明第一、第二、第三範式的定義、判斷標準、違反後果與修正範例。

一、第一範式(1NF):屬性不可再分

定義: 資料表每一欄位皆為不可分割的基本資料項,同一欄位不得包含多個值,亦不得有重複屬性欄位。

判斷標準: 無巢狀表格、無多值欄位、每列僅儲存單一值。

符合 1NF 範例:

學號姓名課程成績
001王小明數學90
001王小明英文85

違反 1NF 範例:

學號姓名課程1成績1課程2成績2
001王小明數學90英文85

現代關聯式 DBMS 均強制符合 1NF,無法建立多值欄位,故實務上極少違反。

二、第二範式(2NF):非主鍵屬性完全依賴主鍵

前提: 必須先符合 1NF。

定義: 每個非主鍵屬性完全函數依賴於候選鍵(不存在部分依賴)。若主鍵為複合鍵,非主鍵屬性不得僅依賴主鍵的一部分。

違反 2NF 範例:選課表

學號 (PK一部分)課程名稱 (PK一部分)姓名年齡學分成績
001數學王小明20390
001英文王小明20285
002數學李小美19388

部分依賴關係:

  • 課程名稱 → 學分(學分僅依賴課程,非完整複合鍵)
  • 學號 → 姓名, 年齡(姓名、年齡僅依賴學號)

違反 2NF 造成的異常:

  1. 資料冗余: 同一課程的學分重複儲存;同一學生的姓名、年齡重複出現
  2. 更新異常: 課程學分調整需更新所有該課程記錄,否則出現不一致
  3. 插入異常: 新開課程若無學生選修,無法記錄課程名稱與學分(缺學號)
  4. 刪除異常: 刪除某學生選課記錄,可能導致課程資訊連帶消失

符合 2NF 拆分:

  • 學生表: Student(學號 PK, 姓名, 年齡)
  • 課程表: Course(課程名稱 PK, 學分)
  • 選課表: SelectCourse(學號 FK, 課程名稱 FK, 成績) — 複合主鍵

單一主鍵的資料表自動符合 2NF(不存在複合鍵部分依賴問題)。

三、第三範式(3NF):非主鍵屬性不傳遞依賴於主鍵

前提: 必須先符合 2NF。

定義: 非主鍵屬性不得傳遞函數依賴於候選鍵。即不存在:主鍵 → 非主鍵A → 非主鍵B 的鏈式依賴。

違反 3NF 範例:學生表含學院資訊

學號 (PK)姓名年齡所在學院學院地點學院電話
001王小明20資工系工程大樓3樓02-1234567
002李小美19資工系工程大樓3樓02-1234567

傳遞依賴: 學號 → 所在學院 → 學院地點, 學院電話

違反 3NF 同樣造成四大異常(冗余、更新、插入、刪除異常)。

符合 3NF 拆分:

  • 學生表: Student(學號 PK, 姓名, 年齡, 所在學院 FK)
  • 學院表: Department(學院 PK, 地點, 電話)

四、總結對照表

範式核心要求解決問題關鍵詞
1NF屬性原子性,無重複欄位結構合法性無重複列
2NF非主鍵完全依賴主鍵(消除部分依賴)複合鍵資料冗余與異常完全依賴
3NF非主鍵不傳遞依賴主鍵(消除傳遞依賴)非主鍵間依賴導致的異常無傳遞依賴

實務設計中,通常以 3NF 為標準。特定場景(如數據倉庫、報表查詢)為效能考量可適度反正規化,但需清楚權衡利弊並文件化。

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