範式理論是關係型數據庫設計的基石,旨在消除數據冗餘、避免更新異常。本文以通俗語言解釋三大範式核心要求,並給出違反範式的典型反模式與修正方案。
A → B 表示 A 唯一決定 B(如學號 → 姓名)。定義:每個屬性不可再分,無重複組、無嵌套表。
| 違反 1NF 例 | 問題 | 修正 |
|---|---|---|
hobbies: '足球,籃球,游泳' | 單列存多值,非原子 | 拆分關聯表 user_hobby(user_id, hobby) |
address: {city:'北京', district:'海淀'} | 嵌套結構 | 展開為獨立列或單獨表 |
定義:非主鍵屬性完全函數依賴於候選鍵(無部分依賴)。
| 違反 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 例 | 依賴分析 | 異常 | 修正 |
|---|---|---|---|
員工表(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) |
定義:每個決定因素都是候選鍵(消除主鍵屬性對候選鍵的部分/傳遞依賴)。
實務中 3NF 通常足夠,BCNF 針對多候選鍵重疊場景。