注:
表在定義中被稱爲關係,記作R
字段在定義中被稱作屬性
模式:數據庫中有三種模式,外模式,內模式,模式
粗體是關鍵字的意思
斜體爲外鍵
以前寫下來的,但是用了多年的帳號已經忘了,唯有把文章轉到這裏來了~,真暈哦~ http://blog.csdn.net/fantasylu/archive/2004/07/20/45794.aspx
第一範式
定義:如果關係R 中所有屬性的值域都是單純域,那麼關係模式R是第一範式的
那麼符合第一模式的特點就有
1)有主關鍵字
2)主鍵不能爲空,
3)主鍵不能重複,
4)字段不可以再分
例如:
StudyNo | Name | Sex | Contact
20040901 john Male Email:[email protected],phone:222456
20040901 mary famale email:[email protected] phone:123455
以上的表就不符合,第一範式:主鍵重複(實際中數據庫不允許重複的),而且Contact字段可以再分
所以變更爲正確的是
StudyNo | Name | Sex | Email | Phone
20040901 john Male [email protected] 222456
20040902 mary famale [email protected] 123455
第二範式:
定義:如果關係模式R是第一範式的,而且關係中每一個非主屬性不部分依賴於主鍵,稱R是第二範式的。
所以第二範式的主要任務就是
滿足第一範式的前提下,消除部分函數依賴。
StudyNo | Name | Sex | Email | Phone | ClassNo | ClassAddress
01 john Male [email protected] 222456 200401 A樓2
01 mary famale [email protected] 123455 200402 A樓3
這個表完全滿足於第一範式,
主鍵由StudyNo和ClassNo組成,這樣才能定位到指定行
但是,ClassAddress部分依賴於關鍵字(ClassNo-〉ClassAddress),
所以要變爲兩個表
表一
StudyNo | Name | Sex | Email | Phone | ClassNo
01 john Male [email protected] 222456 200401
01 mary famale [email protected] 123455 200402
表二
ClassNo | ClassAddress
200401 A樓2
200402 A樓3
第三範式:
滿足第二範式的前提下,消除傳遞依賴。
例:
StudyNo | Name | Sex | Email | bounsLevel | bouns
20040901 john Male [email protected] 優秀 $1000
20040902 mary famale [email protected] 良 $600
這個完全滿足了第二範式,但是bounsLevel和bouns存在傳遞依賴
更改爲:
StudyNo | Name | Sex | Email | bouunsNo
20040901 john Male [email protected] 1
20040902 mary famale [email protected] 2
bounsNo | bounsLevel | bouns
1 優秀 $1000
2 良 $600
這裏我比較喜歡用bounsNo作爲主鍵,
基於兩個原因
1)不要用字符作爲主鍵。可能有人說:如果我的等級一開始就用數值就代替呢?
2)但是如果等級名稱更改了,不叫 1,2 ,3或優、良,這樣就可以方便更改,所以我一般優先使用與業務無關的字段作爲關鍵字。
一般滿足前三個範式就可以避免數據冗餘。
第四範式:
主要任務:滿足第三範式的前提下,消除多值依賴
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
第五範式:
定義: 如果關係模式R中的每一個連接依賴, 都是由R的候選鍵所蘊含, 稱R是第五範式的
看到定義,就知道是要消除連接依賴,並且必須保證數據完整
例子
A | B | C
a1 b1 c1
a2 b1 c2
a1 b2 c1
a2 b2 c2
如果要定位到特定行,必須三個屬性都爲關鍵字。
所以關係要變爲 三個關係,分別是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
範式可以避免數據冗餘,減少數據庫的空間,減輕維護數據完整性的麻煩,但是操作難,因爲需要聯繫多個表才能得到所需要數據,而且越高範式性能就會越差。要權衡是否使用更高範式是比較麻煩。
一般我在做項目中都,用得最多的也就是第三範式,我認爲使用到第三範式也就足夠了,性能好
而且方便管理數據