第一范式:確保每列的原子性.
如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一范式.
例如:顧客表(姓名、編號、地址、……)其中"地址"列還可以細分為國家、省、市、區等。
第二范式:在第一范式的基礎上更進一層,目標是確保表中的每列都和主鍵相關.
如果一個關系滿足第一范式,并且除了主鍵以外的其它列,都依賴于該主鍵,則滿足第二范式.
例如:訂單表(訂單編號、產品編號、定購日期、價格、……),"訂單編號"為主鍵,"產品編號"和主鍵列沒有直接的關系,即"產品編號"列不依賴于主鍵列,應刪除該列。
這樣就產生一個問題:這個表中是以訂單編號和產品編號作為聯合主鍵。【即有可能一個訂單編號對應的是多個產品編號,那么數據就出現冗余了。而且這個冗余還是不必要的】這樣在該表中商品名稱、單位、商品價格等信息不與該表的主鍵相關,而僅僅是與商品編號相關。所以在這里違反了第二范式的設計原則。
也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
第三范式:在第二范式的基礎上更進一層,目標是確保每列都和主鍵列直接相關,而不是間接相關.
如果一個關系滿足第二范式,并且除了主鍵以外的其它列都不依賴于主鍵列,則滿足第三范式.
例如:訂單表(訂單編號,定購日期,顧客編號,顧客姓名,……),初看該表沒有問題,滿足第二范式,每列都和主鍵列"訂單編號"相關,再細看你會發現"顧客姓名"和"顧客編號"相關, "顧客編號"和"訂單編號"又相關,最后經過傳遞依賴,"顧客姓名"也和"訂單編號"相關。為了滿足第三范式,應去掉"顧客姓名"列,放入客戶表中。
有時候適當的冗余也是有必要的。
三范式:http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
轉載于:https://www.cnblogs.com/web21/p/6007604.html