數(shù)據(jù)庫范式實例
第一范式定義:如果關(guān)系R 中所有屬性的值域都是單純域,那么關(guān)系模式R是第一范式的
那么符合第一模式的特點就有
1)有主關(guān)鍵字
2)主鍵不能為空,
3)主鍵不能重復(fù),
4)字段不可以再分
例如:
StudyNo | Name | Sex | Contact
20040901 john Male Email:kkkk@ee.net,phone:222456
20040901 mary famale email:kkk@fff.net phone:123455
以上的表就不符合,第一范式:主鍵重復(fù)(實際中數(shù)據(jù)庫不允許重復(fù)的),而且Contact字段可以再分
所以變更為正確的是
StudyNo | Name | Sex | Email | Phone
20040901 john Male kkkk@ee.net 222456
20040902 mary famale kkk@fff.net 123455
第二范式:
定義:如果關(guān)系模式R是第一范式的,而且關(guān)系中每一個非主屬性不部分依賴于主鍵,稱R是第二范式的。
所以第二范式的主要任務(wù)就是
滿足第一范式的前提下,消除部分函數(shù)依賴。
StudyNo | Name | Sex | Email | Phone | ClassNo | ClassAddress
01 john Male kkkk@ee.net 222456 200401 A樓2
02 mary famale kkk@fff.net 123455 200402 A樓3
這個表完全滿足于第一范式,
主鍵由StudyNo和ClassNo組成,這樣才能定位到指定行
但是,ClassAddress部分依賴于關(guān)鍵字(ClassNo-〉ClassAddress),
所以要變?yōu)閮蓚€表
表一
StudyNo | Name | Sex | Email | Phone | ClassNo
01 john Male kkkk@ee.net 222456 200401
02 mary famale kkk@fff.net 123455 200402
表二
ClassNo | ClassAddress
200401 A樓2
200402 A樓3
第三范式:
滿足第二范式的前提下,消除傳遞依賴。
例:
StudyNo | Name | Sex | Email | bounsLevel | bouns
20040901 john Male kkkk@ee.net 優(yōu)秀 $1000
20040902 mary famale kkk@fff.net 良 $600
這個完全滿足了第二范式,但是bounsLevel和bouns存在傳遞依賴
更改為:
StudyNo | Name | Sex | Email | bouunsNo
20040901 john Male kkkk@ee.net 1
20040902 mary famale kkk@fff.net 2
bounsNo | bounsLevel | bouns
1 優(yōu)秀 $1000
2 良 $600
這里我比較喜歡用bounsNo作為主鍵,
基于兩個原因
1)不要用字符作為主鍵。可能有人說:如果我的等級一開始就用數(shù)值就代替呢?
2)但是如果等級名稱更改了,不叫 1,2 ,3或優(yōu)、良,這樣就可以方便更改,所以我一般優(yōu)先使用與業(yè)務(wù)無關(guān)的字段作為關(guān)鍵字。
一般滿足前三個范式就可以避免數(shù)據(jù)冗余。
第四范式:
主要任務(wù):滿足第三范式的前提下,消除多值依賴
product | agent | factory
Car A1 F1
Bus A1 F2
Car A2 F2
在這里,Car的定位,必須由 agent 和 Factory才能得到(所以主鍵由agent和factory組成),可以通過 product依賴了agent和factory兩個屬性
所以正確的是
表1 表2:
product | agent factory | product
Car A1 F1 Car
Bus A1 F2 Car
Car A2 F2 Bus
第五范式:
定義: 如果關(guān)系模式R中的每一個連接依賴, 都是由R的候選鍵所蘊含, 稱R是第五范式的
看到定義,就知道是要消除連接依賴,并且必須保證數(shù)據(jù)完整
例子
A | B | C
a1 b1 c1
a2 b1 c2
a1 b2 c1
a2 b2 c2
如果要定位到特定行,必須三個屬性都為關(guān)鍵字。
所以關(guān)系要變?yōu)?三個關(guān)系,分別是A 和B,B和C ,C和A
如下:
表1 表2 表3
A | B B | C C | A
a1 b1 b1 c1 c1 a1
a1 b2 b1 c2 c1 a2
posted on 2009-10-17 22:45 逍遙晨空 閱讀(826) 評論(0) 編輯 收藏 所屬分類: SQL