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

資料庫設計三大範式通俗解析:1NF、2NF、3NF 實戰應用

     編輯:關於SqlServer

為什麼需要範式?

建立冗余少、結構合理、易維護的關聯式資料庫。範式是設計規範的總結。

第一範式 (1NF):確保每欄位原子性

規則:所有欄位值皆為不可分割的原子值。

實例:地址欄位拆分

違反 1NF符合 1NF
用戶表
ID | 姓名 | 地址
1 | 張三 | 台灣台北市信義區信義路五段7號
用戶表
ID | 姓名 | 省份 | 城市 | 區 | 詳細地址
1 | 張三 | 台灣 | 台北市 | 信義區 | 信義路五段7號

判斷標準:系統是否需要單獨查詢/統計「城市」?若是,必須拆分滿足 1NF。

第二範式 (2NF):消除部分函數相依(針對複合主鍵)

規則:每個非主鍵欄位必須完全函數相依於整個主鍵,而非部分主鍵。

違反 2NF 實例:訂單資訊表

主鍵:(訂單編號, 商品編號)

訂單編號商品編號商品名稱單位單價數量
O001P01筆記本本502
O001P02滑鼠個3001

問題:商品名稱、單位、單價只相依於「商品編號」(部分主鍵),導致資料冗余、更新異常。

符合 2NF 拆分

商品資訊表訂單明細表
商品編號(PK) | 商品名稱 | 單位 | 單價
P01 | 筆記本 | 本 | 50
P02 | 滑鼠 | 個 | 300
訂單編號(FK) | 商品編號(FK) | 數量
O001 | P01 | 2
O001 | P02 | 1

第三範式 (3NF):消除傳遞函數相依

規則:非主鍵欄位必須直接相依於主鍵,不可間接相依(A→B→C)。

違反 3NF 實例:訂單表含客戶詳細資訊

訂單編號客戶編號客戶姓名所屬公司金額
O001C01王小明ABC公司5000

問題:客戶姓名、公司相依於「客戶編號」,而非「訂單編號」(傳遞相依)。

符合 3NF 拆分

客戶資訊表訂單表
客戶編號(PK) | 客戶姓名 | 所屬公司
C01 | 王小明 | ABC公司
訂單編號(PK) | 客戶編號(FK) | 金額
O001 | C01 | 5000

三大範式口訣

  1. 1NF:一欄一值,不可再分
  2. 2NF:非主鍵靠全鍵,不靠部分鍵
  3. 3NF:非主鍵靠主鍵,不靠傳遞

實務建議

  • 核心交易系統:至少滿足 3NF
  • 數據倉庫/報表:適度反範式化(星型/雪花模型)提升查詢效能
  • 不要為了範式而範式,業務需求永遠優先
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved