第一范式(1NF)
強調(diào)的是列的原子性,即列不能夠再分成其他幾列。
考慮這樣一個表:【聯(lián)系人】(姓名玷禽,性別,電話)
如果在實際場景中呀打,一個聯(lián)系人有家庭電話和公司電話矢赁,那么這種表結(jié)構(gòu)設(shè)計就沒有達(dá)到 1NF。要符合 1NF 我們只需把列(電話)拆分贬丛,即:【聯(lián)系人】(姓名撩银,性別,家庭電話豺憔,公司電話)额获。
第二范式(2NF)
所謂第二范式够庙,是指所有的非主屬性都完全依賴于關(guān)鍵字。從這個定義可以看出抄邀,第二范式不存在非主屬性對于部分候選關(guān)鍵字的部分依賴耘眨,不過允許非主屬性之間存在著傳遞依賴。
下面是第二范式的優(yōu)化實例:
假定選課關(guān)系表為SelectCourse(學(xué)號境肾,姓名剔难,年齡,課程名稱,成績奥喻,學(xué)分)偶宫,關(guān)鍵字為組合關(guān)鍵字(學(xué)號,課程名稱)环鲤,因為存在如下決定關(guān)系:
(學(xué)號纯趋,課程名稱) → (姓名,年齡楔绞,成績结闸,學(xué)分)
這個數(shù)據(jù)庫表不滿足第二范式,因為存在如下決定關(guān)系:
(課程名稱) → (學(xué)分)
(學(xué)號) → (姓名酒朵,年齡)
即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況桦锄。
由于不符合2NF,這個選課關(guān)系表會存在如下問題:
(1) 數(shù)據(jù)冗余:
同一門課程由n個學(xué)生選修蔫耽,"學(xué)分"就重復(fù)n-1次结耀;同一個學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次匙铡。
(2) 更新異常:
若調(diào)整了某門課程的學(xué)分图甜,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會出現(xiàn)同一門課程學(xué)分不同的情況鳖眼。
(3) 插入異常:
假設(shè)要開設(shè)一門新的課程黑毅,暫時還沒有人選修。這樣钦讳,由于還沒有"學(xué)號"關(guān)鍵字矿瘦,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。
(4) 刪除異常:
假設(shè)一批學(xué)生已經(jīng)完成課程的選修愿卒,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除缚去。
但是,與此同時琼开,課程名稱和學(xué)分信息也被刪除了易结。很顯然,這也會導(dǎo)致插入異常。
把選課關(guān)系表SelectCourse改為如下三個表:
學(xué)生:Student(學(xué)號,姓名搞动,年齡)躏精;
課程:Course(課程名稱,學(xué)分)滋尉;
選課關(guān)系:SelectCourse(學(xué)號玉控,課程名稱飞主,成績)狮惜。
這樣的數(shù)據(jù)庫表是符合第二范式的, 消除了數(shù)據(jù)冗余碌识、更新異常碾篡、插入異常和刪除異常。
另外筏餐,所有單關(guān)鍵字的數(shù)據(jù)庫表都符合第二范式开泽,因為不可能存在組合關(guān)鍵字。
第三范式(3NF)
所謂第三范式魁瞪,是指每一個非主屬性既不部分依賴于也不傳遞依賴于關(guān)鍵字穆律,也就是在第二范式的基礎(chǔ)上消除傳遞依賴(A -> B -> C)。
假定學(xué)生關(guān)系表為Student(學(xué)號导俘,姓名峦耘,年齡,所在學(xué)院,學(xué)院地點旅薄,學(xué)院電話)辅髓,關(guān)鍵字為單一關(guān)鍵字"學(xué)號",因為存在如下決定關(guān)系:
(學(xué)號) → (姓名少梁,年齡洛口,所在學(xué)院,學(xué)院地點凯沪,學(xué)院電話)
這個數(shù)據(jù)庫是符合2NF的第焰,但是不符合3NF,因為存在如下決定關(guān)系:
(學(xué)號) → (所在學(xué)院) → (學(xué)院地點妨马,學(xué)院電話)
即存在非關(guān)鍵字段"學(xué)院地點"挺举、"學(xué)院電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。
它也會存在數(shù)據(jù)冗余身笤、更新異常豹悬、插入異常和刪除異常的情況,讀者可自行分析得知液荸。
把學(xué)生關(guān)系表分為如下兩個表:
學(xué)生:(學(xué)號瞻佛,姓名,年齡,所在學(xué)院);
學(xué)院:(學(xué)院伤柄,地點绊困,電話)。
這樣的數(shù)據(jù)庫表是符合第三范式的适刀,消除了數(shù)據(jù)冗余秤朗、更新異常、插入異常和刪除異常笔喉。
BC范式(BCNF)
三范式和BC范式總結(jié):
第一取视,二,三范式解決的是非主屬性的關(guān)系常挚。
BC 范式解決的是主屬性的關(guān)系作谭;
第一范式:就是原子性,字段不可再分割奄毡;【這個肯定不用在解釋了吧】
第二范式:就是完全依賴折欠,沒有部分依賴;【非主屬性不能依賴于主鍵的一部分吼过,要完全依賴于主鍵】
第三范式:沒有傳遞依賴锐秦。【非主屬性之間的依賴】
BC范式: 解決部分主鍵依賴于非主鍵部分盗忱。