【数据库范式】第二范式分析
2、第二范式2NF
定義:數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴,即符合第二范式。
簡單的說就是不要字段冗余
《注:什么是函數依賴,詳見百度百科(http://baike.baidu.com/view/40008.htm)。
如果一個表中某一個字段A的值是由另外一個字段或一組字段B的值來確定的,就稱為A函數依賴于B。》
2NF可以減少插入異常,刪除異常和修改異常。
簡單的說,一方面,第二范式肯定要滿足第一范式,否則就沒有必要談第二范式。
另一方面,當某張表中的非主鍵信息不是由整個主鍵函數來決定時,即存在依賴于該表中不是主鍵的部分或者依賴于主鍵一部分的部分時,通常會違反2NF。
我們再來看上面的滿足1NF的表1-2
|
CardNo |
StudentNo |
StudentName |
Sex |
Academy |
Major |
class |
CardCash |
UserID |
UserLevel |
Date |
Time |
|
001 |
021101 |
小明 |
男 |
教育學院 |
心理系 |
1 |
100 |
Operator |
操作員 |
2011/10/03 |
09:00 |
我們看到,在這張表中,通過CardNo和StudentNo就可以確定StudentName,Sex,Academy,Major,class,CardCash,UserID,Date,Time。所以可以把CardNo和StudentNo的組合作為主鍵。
但是,我們發現CardCash并不完全依賴于CardNo和StudentNo,僅僅通過CardNo就可以確定CardCash,因為一張卡,一定會有卡內金額。這就造成了部分依賴。出現這種情況,就不滿足第二范式。
修改為:
我們再來看另一個例子,學生上下機記錄表,會更明顯些。表2-1
|
CardNo |
StudentNo |
StudentName |
Sex |
Department |
Major |
class |
OnDate |
OnTime |
OffDate |
OffTime |
ConsumeTime |
ConsumeMoney |
|
001 |
0211 |
小明 |
男 |
教育學院 |
心理系 |
1 |
2011/10/14 |
09:00 |
2011/10/14 |
10:00 |
1 |
2 |
我們看到,在這張表中,StudentName,Sex,Department,Major,class都是直接依賴于StudentNo,而不依賴與表中的其他字段,這樣的設計也不符合2NF非主鍵信息不是由整個主鍵函數來決定時。
我們可以把1-2和2-1優化為:
3-1
|
StudentNo |
CardNo |
UserID |
UserLevel |
Date |
Time |
|
021101 |
001 |
Operator |
操作員 |
2011/10/03 |
09:00 |
3-2
|
CardNo |
CardCash |
|
001 |
98 |
3-3
|
CardNo |
OnDate |
OnTime |
OffDate |
OffTime |
ConsumeTime |
ConsumeMoney |
|
001 |
2011/10/14 |
09:00 |
2011/10/14 |
10:00 |
1 |
2 |
3-4
|
StudentNo |
StudentName |
Sex |
Academy |
Major |
class |
|
021101 |
小明 |
男 |
教育學院 |
心理系 |
1 |
----------------------------------------
第二范式
每一行的數據只能與其中一列相關,即一行數據只做一件事。只要數據列中出現數據重復,就要把表拆分開來。
一個人同時訂幾個房間,就會出來一個訂單號多條數據,這樣子聯系人都是重復的,就會造成數據冗余。我們應該把他拆開來。
這樣便實現啦一條數據做一件事,不摻雜復雜的關系邏輯。同時對表數據的更新維護也更易操作。
----------------------------------------
2.第二范式(確保表中的每列都和主鍵相關)
第二范式在第一范式的基礎之上更進一層。第二范式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵,如下表所示。
訂單信息表
這樣就產生一個問題:這個表中是以訂單編號和商品編號作為聯合主鍵。這樣在該表中商品名稱、單位、商品價格等信息不與該表的主鍵相關,而僅僅是與商品編號相關。所以在這里違反了第二范式的設計原則。
而如果把這個訂單信息表進行拆分,把商品信息分離到另一個表中,把訂單項目表也分離到另一個表中,就非常完美了。如下所示。
這樣設計,在很大程度上減小了數據庫的冗余。如果要獲取訂單的商品信息,使用商品編號到商品信息表中查詢即可。
總結
以上是生活随笔為你收集整理的【数据库范式】第二范式分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原创】锐捷交换机实现双星型拓扑网络(链
- 下一篇: 正则领悟