第一范式
存在非主屬性對碼的部分依賴關系 R(A,B,C) AB是碼 C是非主屬性 B-->C B決定C C部分依賴於B
第一范式
定義:如果關系R 中所有屬性的值域都是單純域,那么關系模式R是第一范式的
那么符合第一模式的特點就有
1)有主關鍵字
2)主鍵不能為空,
3)主鍵不能重復,
4)字段不可以再分
例如:
StudyNo | Name | Sex | Contact
20040901 john Male Email:kkkk@ee.net,phone:222456
20040901 mary famale email:kkk@fff.net phone:123455
以上的表就不符合,第一范式:主鍵重復(實際中數據庫不允許重復的),而且Contact字段可以再分
所以變更為正確的是
StudyNo | Name | Sex | Email | Phone
20040901 john Male kkkk@ee.net 222456
20040902 mary famale kkk@fff.net 123455
第二范式
存在非主屬性對碼的傳遞性依賴 R(A,B,C) A是碼 A -->B ,B-->C
定義:如果關系模式R是第一范式的,而且關系中每一個非主屬性不部分依賴於主鍵,稱R是第二范式的。
所以第二范式的主要任務就是
滿足第一范式的前提下,消除部分函數依賴。
StudyNo | Name | Sex | Email | Phone | ClassNo | ClassAddress
01 john Male kkkk@ee.net 222456 200401 A樓2
01 mary famale kkk@fff.net 123455 200402 A樓3
這個表完全滿足於第一范式,
主鍵由StudyNo和ClassNo組成,這樣才能定位到指定行
但是,ClassAddress部分依賴於關鍵字(ClassNo-〉ClassAddress),
所以要變為兩個表
表一
StudyNo | Name | Sex | Email | Phone | ClassNo
01 john Male kkkk@ee.net 222456 200401
01 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 優秀 $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 優秀 $1000
2 良 $600
這里我比較喜歡用bounsNo作為主鍵,
基於兩個原因
1)不要用字符作為主鍵。可能有人說:如果我的等級一開始就用數值就代替呢?
2)但是如果等級名稱更改了,不叫 1,2 ,3或優、良,這樣就可以方便更改,所以我一般優先使用與業務無關的字段作為關鍵字。
一般滿足前三個范式就可以避免數據冗余。
