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

數據庫設計三大範式(1NF/2NF/3NF)核心原則與反模式識別

     編輯:MySQL 綜合教學

範式理論是關係型數據庫設計的基石,旨在消除數據冗餘、避免更新異常。本文以通俗語言解釋三大範式核心要求,並給出違反範式的典型反模式與修正方案。

前置概念

  • 函數依賴:A → B 表示 A 唯一決定 B(如學號 → 姓名)。
  • 完全函數依賴:組合鍵 (A,B) → C,且無真子集決定 C。
  • 部分函數依賴:組合鍵 (A,B) → C,但 A → C 或 B → C 成立。
  • 傳遞函數依賴:A → B,B → C,故 A → C(非鍵屬性間依賴)。
  • 候選鍵:能唯一標識元組的最小屬性集;主鍵從中選一。

第一範式 (1NF):屬性原子性

定義:每個屬性不可再分,無重複組、無嵌套表。

違反 1NF 例問題修正
hobbies: '足球,籃球,游泳'單列存多值,非原子拆分關聯表 user_hobby(user_id, hobby)
address: {city:'北京', district:'海淀'}嵌套結構展開為獨立列或單獨表

第二範式 (2NF):消除部分依賴(建立在 1NF 基礎上)

定義:非主鍵屬性完全函數依賴於候選鍵(無部分依賴)。

違反 2NF 例依賴分析異常修正
選課表(student_id, course_id, student_name, course_name, score)PK=(student_id,course_id)
student_id → student_name (部分依賴)
course_id → course_name (部分依賴)
插入異常:無課程無法錄入學生名
刪除異常:刪課程導致學生名丟失
更新異常:改學生名需改多行
拆三表:
學生(student_id, student_name)
課程(course_id, course_name)
選課(student_id, course_id, score)

第三範式 (3NF):消除傳遞依賴(建立在 2NF 基礎上)

定義:非主鍵屬性不傳遞依賴於候選鍵(即非鍵屬性間無函數依賴)。

違反 3NF 例依賴分析異常修正
員工表(emp_id, emp_name, dept_id, dept_name, dept_manager)PK=emp_id
emp_id → dept_id → dept_name, dept_manager (傳遞依賴)
插入異常:無員工無法建立部門
刪除異常:刪最後員工導致部門信息丟失
更新異常:改部門名需改所有員工行
拆兩表:
員工(emp_id, emp_name, dept_id)
部門(dept_id, dept_name, dept_manager)

BCNF(Boyce-Codd 範式):3NF 強化版

定義:每個決定因素都是候選鍵(消除主鍵屬性對候選鍵的部分/傳遞依賴)。

實務中 3NF 通常足夠,BCNF 針對多候選鍵重疊場景。

範式與性能的權衡

  • 高範式(3NF+):寫入快、存儲省、一致性強,但查詢需多表 JOIN。
  • 反範式化:為讀性能引入冗餘(如訂單表冗餘用戶名、商品名),需配合觸發器/應用層保證一致性。
  • 原則:先按 3NF 設計邏輯模型,再根據訪問熱點、查詢模式做有針對性的反範式化,並文檔化冗餘同步邏輯。

快速自檢清單

  1. 是否有非原子列?(逗號分隔、JSON 未展開) → 1NF
  2. 是否有複合主鍵表,非鍵列僅依賴主鍵一部分? → 2NF
  3. 是否有非鍵列 A 決定非鍵列 B? → 3NF
  4. 外鍵關係是否完整定義?引用完整性是否由數據庫層保證?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved