数据库范式介绍
寫給自己復習的..
第一范式
所謂第一范式就是不允許出現重復組. 所謂重復組就是一列中有多個數據.. 第一范式是關系數據庫的標志, 如果第一范式不滿足, 就不是關系數據庫表.
1. 避免重復列.
例如:
學生?????? 科目
Jason??? 語文, 數學
Peter???? 英語
我們應該增加一個數據行確保列種每個值都是單一值.
學生?????? 科目
Jason??? 語文
Jason? 數學
Peter???? 英語
第二范式
第二范式有點難度了:
1. 第二范式的前提是符合第一范式
2. 表中每個數據行都可以必須唯一標識(primary key).
3. 數據表中的所有非主鍵列必須完全依賴于主鍵
1, 2點都很容易理解.
關鍵是怎么理解那個完全依賴于了.
下面舉例:
學生?????? 科目??? 總課時??? 考試得分
Jason??? 語文?? 80??????????? 67
Jason?? 英語 ? 70???????????? 82
Hebe ? ? 語文?? 80????????? ? 80
Peter???? 英語?? 70??????????? 91
上面那個表數據很常見吧,?? 可以看出上面的表的primary key 是1個組合鍵(學生,科目)
而考試得分這個列是完全依賴于這個組合鍵的.? 即是單單憑學生或者單單憑科目是決定不了考試得分的值的.
但是總課時至于組合鍵中的科目有關,? 與學生并沒有依賴關系, 所以不是完全依賴于主鍵, 只是依賴于主鍵中的1個列.
所以上面那張表不符合第二范式.]
如果要讓它符合第二范式, 可以把 總課時這個列移除到另1個表中.
學生?????? 科目???? 考試得分
Jason??? 語文???????????? 67
Jason?? 英語 ??????????? 82
Hebe ? ? 語文???????? ? 80
Peter???? 英語??????????? 91
科目,? 總課時
語文?? 80
英語? 70
那么上面的兩張表就符合第二范式了.
第三范式
其實第三范式相對來講更加容易理解.1. 第三范式必須符合第二范式
2. 所有非主鍵的屬性之間沒有依賴關系.
舉例:
產品id??? 價格???? 制造商??? 制造商地址
1???????????? 300 ????????? A???????????? addr_a
2??????????? 280 ?????????? B???????????? addr_b
上面的表主鍵是產品id.? 非主鍵的價格 和 制造商沒有依賴關系,? 但是制造商地址依賴于制造商...
所以一旦制造商地址改變, 往往導致要修改數據庫中多個數據行.
就不符合第三范式了.
解決方法就如上面第二范式的例子, 把 制造商和其地址的對應關系放到另1張表中.
Boyce-Codd 范式
所謂的BC范式,?? 其實是第三范式的一個子集.
第三范式規定所有非主鍵屬性都不能依賴于其中之一的非主鍵屬性
BC范式更加嚴格,? 所有屬性都不能依賴于其中之一的非主鍵屬性.
依舊是說, BC范式中的主鍵不能依賴于任何非主鍵.
例子:
國家(key) ?? 縮寫???? 人口?? 區域
日本?????????? JPN????? 1億?? 亞洲
英國??? ? ? ?? ENG???? 半億? 歐洲
上面例子中的主鍵國家能決定縮寫, 但是縮寫也能決定國家, 所以國家和縮寫之間是互相依賴的,? 主鍵依賴于了非主鍵, 它符合第三范式
但是不符合BC范式...
總結
- 上一篇: 在数据准备区中允许使用的数据结构有哪些,
- 下一篇: Oracle with子句的简单介绍.