第一範式(1NF):
在關系模式R中的每一個(gè)具體(tǐ)關系r中,如果每個(gè)屬性值 都是不可(kě)再分的最小(xiǎo)數(shù)據單位,則稱R是第一範式的關系。
例:如職工号,姓名,電(diàn)話(huà)号碼組成一個(gè)表(一個(gè)人(rén)可(kě)能有(yǒu)一個(gè)辦公室電(diàn)話(huà) 和(hé)一個(gè)家(jiā)裏電(diàn)話(huà)号碼)
規範成為(wèi)1NF有(yǒu)三種方法:
一是重複存儲職工号和(hé)姓名。這樣,關鍵字隻能是電(diàn)話(huà)号碼。
二是職工号為(wèi)關鍵字,電(diàn)話(huà)号碼分為(wèi)單位電(diàn)話(huà)和(hé)住宅電(diàn)話(huà)兩個(gè)屬性
三是職工号為(wèi)關鍵字,但(dàn)強制(zhì)每條記錄隻能有(yǒu)一個(gè)電(diàn)話(huà)号碼。
以上(shàng)三個(gè)方法,第一種方法最不可(kě)取,按實際情況選取後兩種情況。
第二範式(2NF):
如果關系模式R(U,F)中的所有(yǒu)非主屬性都完全依賴于任意一個(gè)候選關鍵字,則稱關系R 是屬于第二範式的。
例:選課關系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO為(wèi)學号, CNO為(wèi)課程号,GRADEGE 為(wèi)成績,CREDIT 為(wèi)學分。
由以上(shàng)條件,關鍵字為(wèi)組合關鍵字(SNO,CNO)
在應用中使用以上(shàng)關系模式有(yǒu)以下問題:
a.數(shù)據冗餘,假設同一門(mén)課由40個(gè)學生(shēng)選修,學分就 重複40次。
b.更新異常,若調整了某課程的學分,相應的元組CREDIT值都要更新,有(yǒu)可(kě)能會(huì)出現同一門(mén)課學分不同。
c.插入異常,如計(jì)劃開(kāi)新課,由于沒人(rén)選修,沒有(yǒu)學号關鍵字,隻能等有(yǒu)人(rén)選修才能把課程和(hé)學分存入。
d.删除異常,若學生(shēng)已經結業,從當前數(shù)據庫删除選修記錄。某些(xiē)門(mén)課程新生(shēng)尚未選修,則此門(mén)課程及學分記錄無法保存。
原因:非關鍵字屬性CREDIT僅函數(shù)依賴于CNO,也就是CREDIT部分依賴組合關鍵字(SNO,CNO)而不是完全依賴。
解決方法:分成兩個(gè)關系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新關系包括兩個(gè)關系模式,它們之間(jiān)通(tōng)過SC1中的外關鍵字CNO相聯系,需要時(shí)再進行(xíng)自然聯接,恢複了原來(lái)的關系
第三範式(3NF):
如果關系模式R(U,F)中的所有(yǒu)非主屬性對任何候選關鍵字都不存在傳遞信賴,則稱關系R是屬于第三範式的。
例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各屬性分别代表學号,姓名,所在系,系名稱,系地址。
關鍵字SNO決定各個(gè)屬性。由于是單個(gè)關鍵字,沒有(yǒu)部分依賴的問題,肯定是2NF。但(dàn)這關系肯定有(yǒu)大(dà)量的冗餘,有(yǒu)關學生(shēng)所在的幾個(gè)屬性DNO,DNAME,LOCATION将重複存儲,插入,删除和(hé)修改時(shí)也将産生(shēng)類似以上(shàng)例的情況。
原因:關系中存在傳遞依賴造成的。即SNO -> DNO。 而DNO -> SNO卻不存在,DNO -> LOCATION, 因此關鍵遼 SNO 對 LOCATION 函數(shù)決定是通(tōng)過傳遞依賴 SNO -> LOCATION 實現的。也就是說,SNO不直接決定非主屬性LOCATION。
解決目地:每個(gè)關系模式中不能留有(yǒu)傳遞依賴。
解決方法:分為(wèi)兩個(gè)關系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:關系S中不能沒有(yǒu)外關鍵字DNO。否則兩個(gè)關系之間(jiān)失去聯系。
BCNF:如果關系模式R(U,F)的所有(yǒu)屬性(包括主屬性和(hé)非主屬性)都不傳遞依賴于R的任何候選關鍵字,那(nà)麽稱關系R是屬于BCNF的。或是關系模式R,如果每個(gè)決定因素都包含關鍵字(而不是被關鍵字所包含),則RCNF的關系模式。
例:配件管理(lǐ)關系模式 WPE(WNO,PNO,ENO,QNT)分别表倉庫号,配件号,職工号,數(shù)量。有(yǒu)以下條件
a.一個(gè)倉庫有(yǒu)多(duō)個(gè)職工。
b.一個(gè)職工僅在一個(gè)倉庫工作(zuò)。
c.每個(gè)倉庫裏一種型号的配件由專人(rén)負責,但(dàn)一個(gè)人(rén)可(kě)以管理(lǐ)幾種配件。
d.同一種型号的配件可(kě)以分放在幾個(gè)倉庫中。
分析:由以上(shàng)得(de) PNO 不能确定QNT,由組合屬性(WNO,PNO)來(lái)決定,存在函數(shù)依賴(WNO,PNO) -> ENO。由于每個(gè)倉庫裏的一種配件由專人(rén)負責,而一個(gè)人(rén)可(kě)以管理(lǐ)幾種配件,所以有(yǒu)組合屬性(WNO,PNO)才能确定負責人(rén),有(yǒu)(WNO,PNO)-> ENO。因為(wèi) 一個(gè)職工僅在一個(gè)倉庫工作(zuò),有(yǒu)ENO -> WNO。由于每個(gè)倉庫裏的一種配件由專人(rén)負責,而一個(gè)職工僅在一個(gè)倉庫工作(zuò),有(yǒu) (ENO,PNO)-> QNT。
找一下候選關鍵字,因為(wèi)(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此 (WNO,PNO)可(kě)以決定整個(gè)元組,是一個(gè)候選關鍵字。根據ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能決定整個(gè)元組,為(wèi)另一個(gè)候選關鍵字。屬性ENO,WNO,PNO 均為(wèi)主屬性,隻有(yǒu)一個(gè)非主屬性QNT。它對任何一個(gè)候選關鍵字都是完全函數(shù)依賴的,并且是直接依賴,所以該關系模式是3NF。
分析一下主屬性。因為(wèi)ENO->WNO,主屬性ENO是WNO的決定因素,但(dàn)是它本身不是關鍵字,隻是組合關鍵字的一部分。這就造成主屬性WNO對另外一個(gè)候選關鍵字(ENO,PNO)的部 分依賴,因為(wèi)(ENO,PNO)-> ENO但(dàn)反過來(lái)不成立,而P->WNO,故(ENO,PNO)-> WNO 也是傳遞依賴。
雖然沒有(yǒu)非主屬性對候選關鍵遼的傳遞依賴,但(dàn)存在主屬性對候選關鍵字的傳遞依賴,同樣也會(huì)帶來(lái)麻煩。如一個(gè)新職工分配到倉庫工作(zuò),但(dàn)暫時(shí)處于實習階段,沒有(yǒu)獨立負責對某些(xiē)配件的管理(lǐ)任務。由于缺少(shǎo)關鍵字的一部分PNO而無法插入到該關系中去。又如某個(gè)人(rén)改成不管配件了去負責安全,則在删除配件的同時(shí)該職工也會(huì)被删除。
解決辦法:分成管理(lǐ)EP(ENO,PNO,QNT),關鍵字是(ENO,PNO)工作(zuò)EW(ENO,WNO)其關鍵字是ENO
缺點:分解後函數(shù)依賴的保持性較差。如此例中,由于分解,函數(shù)依賴(WNO,PNO)-> ENO 丢失了, 因而對原來(lái)的語義有(yǒu)所破壞。沒有(yǒu)體(tǐ)現出每個(gè)倉庫裏一種部件由專人(rén)負責。有(yǒu)可(kě)能出現 一部件由兩個(gè)人(rén)或兩個(gè)以上(shàng)的人(rén)來(lái)同時(shí)管理(lǐ)。因此,分解之後的關系模式降低(dī)了部分完整性約束。
一個(gè)關系分解成多(duō)個(gè)關系,要使得(de)分解有(yǒu)意義,起碼的要求是分解後不丢失原來(lái)的信息。這些(xiē)信息不僅包括數(shù)據本身,而且包括由函數(shù)依賴所表示的數(shù)據之間(jiān)的相互制(zhì)約。進行(xíng)分解的目标是達到更高(gāo)一級的規範化程度,但(dàn)是分解的同時(shí)必須考慮兩個(gè)問題:無損聯接性和(hé)保持函數(shù)依賴。有(yǒu)時(shí)往往不可(kě)能做(zuò)到既有(yǒu)無損聯接性,又完全保持函數(shù)依賴。需要根據需要進行(xíng)權衡。
1NF直到BCNF的四種範式之間(jiān)有(yǒu)如下關系:
BCNF包含了3NF包含2NF包含1NF
小(xiǎo)結:
目地:規範化目的是使結構更合理(lǐ),消除存儲異常,使數(shù)據冗餘盡量小(xiǎo),便于插入、删除和(hé)更新
原則:遵從概念單一化 "一事一地"原則,即一個(gè)關系模式描述一個(gè)實體(tǐ)或實體(tǐ)間(jiān)的一種聯系。規範的實質就是概念的單一化。
方法:将關系模式投影(yǐng)分解成兩個(gè)或兩個(gè)以上(shàng)的關系模式。
要求:分解後的關系模式集合應當與原關系模式"等價",即經過自然聯接可(kě)以恢複原關系而不丢失信息,并保持屬性間(jiān)合理(lǐ)的聯系。
注意:一個(gè)關系模式結這分解可(kě)以得(de)到不同關系模式集合,也就是說分解方法不是唯一的。最小(xiǎo)冗餘的要求必須以分解後的數(shù)據庫能夠表達原來(lái)數(shù)據庫所有(yǒu)信息為(wèi)前提來(lái)實現。其根本目标是節省存儲空(kōng)間(jiān),避免數(shù)據不一緻性,提高(gāo)對關系的操作(zuò)效率,同時(shí)滿足應用需求。實際上(shàng),并不一定要求全部模式都達到BCNF不可(kě)。有(yǒu)時(shí)故意保留部分冗餘可(kě)能更方便數(shù)據查詢。尤其對于那(nà)些(xiē)更新頻度不高(gāo),查詢頻度極高(gāo)的數(shù)據庫系統更是如此。
在關系數(shù)據庫中,除了函數(shù)依賴之外還(hái)有(yǒu)多(duō)值依賴,聯接依賴的問題,從而提出了第四範式,第五範式等更高(gāo)一級的規範化要求。在此,以後再談。
各位朋友(yǒu),你(nǐ)看過後有(yǒu)何感想,其實,任何一本數(shù)據庫基礎理(lǐ)論的書(shū)都會(huì)講這些(xiē)東西,考慮到很(hěn)多(duō)網友(yǒu)是半途出家(jiā),來(lái)做(zuò)數(shù)據庫。特找一本書(shū)大(dà)抄特抄一把,各位有(yǒu)什麽問題,也别問我了,自已去找一本關系數(shù)據庫理(lǐ)論的書(shū)去看吧(ba),說不定,對各位大(dà)有(yǒu)幫助。說是說以上(shàng)是基礎理(lǐ)論的東西,請(qǐng)大(dà)家(jiā)想想,你(nǐ)在做(zuò)數(shù)據庫設計(jì)的時(shí)候有(yǒu)沒有(yǒu)考慮過遵過以上(shàng)幾個(gè)範式呢,有(yǒu)沒有(yǒu)在數(shù)據庫設計(jì)做(zuò)得(de)不好之時(shí),想一想,對比以上(shàng)所講,到底是違反了第幾個(gè)範式呢?
我見過的數(shù)據庫設計(jì),很(hěn)少(shǎo)有(yǒu)人(rén)做(zuò)到很(hěn)符合以上(shàng)幾個(gè)範式的,一般說來(lái),第一範式大(dà)家(jiā)都可(kě)以遵守,完全遵守第二第三範式的人(rén)很(hěn)少(shǎo)了,遵守的人(rén)一定就是設計(jì)數(shù)據庫的高(gāo)手了,BCNF的範式出現機會(huì)較少(shǎo),而且會(huì)破壞完整性,你(nǐ)可(kě)以在做(zuò)設計(jì)之時(shí)不考慮它,當然在ORACLE中可(kě)通(tōng)過觸發器(qì)解決其缺點。以後我們共同做(zuò)設計(jì)之時(shí),也希望大(dà)家(jiā)遵守以上(shàng)幾個(gè)範式。
那(nà)些(xiē)數(shù)據庫的書(shū)介紹的數(shù)據庫範式,實在是晦澀難懂,我在這裏給出一個(gè)通(tōng)俗的描述:
1NF:一個(gè)table中的列是不可(kě)再分的(即列的原子性)
2NF:一個(gè)table中的行(xíng)是可(kě)以唯一标示的,(即table中的行(xíng)是不可(kě)以有(yǒu)重複的)
3NF:一個(gè)table中列不依賴以另一個(gè)table中的非主鍵的列,還(hái)是不通(tōng)俗!巨寒!! 舉個(gè)例子吧(ba):有(yǒu)一個(gè)部門(mén)的table,我們叫它tbl_department, 它有(yǒu)這麽幾列(dept_id(pk),dept_name,dept_memo...) 有(yǒu)一個(gè)員工table,我們叫它tbl_employee,在這個(gè)table中有(yǒu)一列dept_id(fk)描述關于部門(mén)的信息,若tbl_employee要滿足3NF,則在tbl_employee中就不得(de)再有(yǒu)除dept_id列的其它有(yǒu)關部門(mén)信息的列!
一般數(shù)據庫的設計(jì)滿足3NF即可(kě)!(個(gè)人(rén)覺得(de)應該盡可(kě)能的滿足3NF,一家(jiā)之言^_^)
BCNF:通(tōng)常認為(wèi)BCNF是修正的第三範式,它比3NF又進一步!
4NF:
5NF:将一個(gè)table盡可(kě)能的分割成小(xiǎo)的塊,以排除在table中所有(yǒu)冗餘的數(shù)據。
如沒特殊注明(míng),文章均為(wèi)中技(jì)互聯原創,轉載請(qǐng)注明(míng)來(lái)自www.zjcoo.com