1. 程式人生 > >mysql的三大範式

mysql的三大範式

並且 http 理解 必須 其它 構造 重要 模型 數學

網上找的,原創不知:諒解
更詳細的是知乎劉慰老師:https://www.zhihu.com/question/24696366/answer/29189700 後面還有王紅波用戶的解釋可以借鑒
第一範式:確保每列的原子性.
如果每列(或者每個屬性)都是不可再分的最小數據單元(也稱為最小的原子單元),則滿足第一範式.
例如:顧客表(姓名、編號、地址、……)其中"地址"列還可以細分為國家、省、市、區等。

第二範式:在第一範式的基礎上更進一層,目標是確保表中的每列都和主鍵相關.
如果一個關系滿足第一範式,並且除了主鍵以外的其它列,都依賴於該主鍵,則滿足第二範式.
例如:訂單表(訂單編號、產品編號、定購日期、價格、……),"訂單編號"為主鍵,"產品編號"和主鍵列沒有直接的關系,即"產品編號"列不依賴於主鍵列,應刪除該列。

第三範式:在第二範式的基礎上更進一層,目標是確保每列都和主鍵列直接相關,而不是間接相關.
如果一個關系滿足第二範式,並且除了主鍵以外的其它列都不依賴於主鍵列,則滿足第三範式.
為了理解第三範式,需要根據Armstrong公裏之一定義傳遞依賴。假設A、B和C是關系R的三個屬性,如果A-〉B且B-〉C,則從這些函數依賴中,可以得出A-〉C,如上所述,依賴A-〉C是傳遞依賴。
例如:訂單表(訂單編號,定購日期,顧客編號,顧客姓名,……),初看該表沒有問題,滿足第二範式,每列都和主鍵列"訂單編號"相關,再細看你會發現"顧客姓名"和"顧客編號"相關,"顧客編號"和"訂單編號"又相關,最後經過傳遞依賴,"顧客姓名"也和"訂單編號"相關。為了滿足第三範式,應去掉"顧客姓名"列,放入客戶表中。

作用
實際上設計任何一種數據庫應用系統,不論是基於何種數據模型的,都會遇到如何構造合適的數據模式即邏輯結構的問題。
由於關系模型有嚴格的數學理論基礎,並且可以向別的數據模型轉換。所以要設計合適的關系模式,使其邏輯結構更加符合要求,出現了規範化理論。
而三大範式即第一、第二和第三範式就是規範化理論重要部分,是為了在設計中更好的解決數據冗余,數據有效性檢查,提高存儲效率。
另外還有第四範式、第五範式等。第一範式的作用是要求每個關系的屬性為原子性的,不可再分。
即表中不能還有表。滿足第二範式必須滿足第一範式。第二範式(2NF)要求數據庫表中的每個實例或行必須可以被唯一地區分。
滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。

mysql的三大範式