設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)時(shí),遵循不同的規(guī)范要求咖刃,設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫(kù)泳炉,這些不同的范式要求被稱為不同的范式,各種范式呈遞次規(guī)范嚎杨,越高的范式數(shù)據(jù)庫(kù)冗余越小花鹅。
目前關(guān)系數(shù)據(jù)庫(kù)有六種范式:第一范式(1NF)、第二范式(2NF)枫浙、第三范式(3NF)刨肃、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF箩帚,又稱完美范式)之景。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎(chǔ)上進(jìn)一步滿足更多規(guī)范要求的稱為第二范式(2NF)膏潮,其余范式以此類推锻狗,一般來(lái)說(shuō),數(shù)據(jù)庫(kù)只需要滿足第三范式(3NF)就可以了焕参。
1.第一范式
所謂的第一范式(1NF)是指在關(guān)系模型中轻纪,對(duì)字段添加一個(gè)規(guī)范要求,所有的字段都應(yīng)該是原子性的叠纷,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng)刻帚,而不是集合、數(shù)組涩嚣、記錄等非原子數(shù)據(jù)項(xiàng)崇众。如果實(shí)體中的某個(gè)屬性有多個(gè)值時(shí),必須拆分為不同的屬性航厚。在符合第一范式(1NF)表中的每個(gè)字段值只能是實(shí)體的一個(gè)屬性或一個(gè)屬性的一部分顷歌。在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式(1NF)是對(duì)關(guān)系模式設(shè)計(jì)的基本要求幔睬,一般設(shè)計(jì)中都必須滿足第一范式(1NF)眯漩。只有這樣,設(shè)計(jì)出來(lái)的表才是標(biāo)準(zhǔn)的二維表結(jié)構(gòu)。
例如:如下的數(shù)據(jù)庫(kù)表是符合第一范式的:
字段1 | 字段2 | 字段3 | 字段4 |
---|---|---|---|
而這樣的數(shù)據(jù)庫(kù)表是不符合第一范式的:
字段1 | 字段2 | 字段3 | 字段4 |
---|---|---|---|
字段3.1|字段3.2 |
很顯然赦抖,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中舱卡,都不可能做出不符合第一范式的數(shù)據(jù)庫(kù),因?yàn)檫@些 DBMS 不允許把數(shù)據(jù)庫(kù)表的一列再分成二列或者多列队萤。因此轮锥,想在現(xiàn)有的 DBMS 中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫(kù)都是不可能的。
2.第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來(lái)的要尔,即滿足第二范式(2NF)必須先滿足第一范式(1NF)舍杜。第二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或記錄必須可以被唯一的區(qū)分(標(biāo)識(shí))。選取一個(gè)能夠區(qū)分每個(gè)實(shí)體的屬性或?qū)傩越M盈电,作為實(shí)體的唯一標(biāo)識(shí)蝴簇,例如杯活,在員工表中的身份證號(hào)碼即可實(shí)現(xiàn)每個(gè)一員工的區(qū)分匆帚,該身份證號(hào)碼即為候選鍵,任何一個(gè)候選鍵都可以被選作主鍵作為記錄的唯一標(biāo)識(shí)旁钧。在找不到候選鍵時(shí)吸重,可額外增加屬性以實(shí)現(xiàn)區(qū)分。例如歪今,在員工表中如果沒(méi)有對(duì)其身份證號(hào)碼進(jìn)行存儲(chǔ)嚎幸,而姓名可能會(huì)在數(shù)據(jù)庫(kù)運(yùn)行的某個(gè)時(shí)間重復(fù),無(wú)法區(qū)分出實(shí)體時(shí)寄猩,這時(shí)就需要額外增加一個(gè)譬如 ID 等不重復(fù)的編號(hào)以實(shí)現(xiàn)區(qū)分嫉晶,被添加的編號(hào)或 ID 選作主鍵。(該主鍵的添加是在 ER 設(shè)計(jì)時(shí)添加田篇,不是建庫(kù)時(shí)隨意添加)替废。
第二范式(2NF)要求實(shí)體的屬性要完全依賴于主關(guān)鍵字。所謂的完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性泊柬,如果存在椎镣,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一張新表,并且在新表中再增加原表中主鍵字段作為自己的外鍵兽赁,那么新表與原表之間就形成了一對(duì)多的關(guān)系状答。
總之,第二范式就是在第一范式的基礎(chǔ)上非主屬性(非主鍵字段)完全依賴于主屬性(主鍵)刀崖。
例如:選課關(guān)系表為 SelectCourse(學(xué)號(hào)惊科、姓名、年齡亮钦、課程名稱译断、成績(jī)、學(xué)分)或悲,主鍵為組合主鍵(學(xué)號(hào)孙咪、課程名稱)堪唐,因?yàn)榇嬖谌缦聸Q定關(guān)系:
(學(xué)號(hào),課程名稱)-> (姓名翎蹈、年齡淮菠、成績(jī)、學(xué)分)
在這個(gè)數(shù)據(jù)庫(kù)表中荤堪,有某些依賴不滿足第二范式的要求合陵,因?yàn)榇嬖谥缦碌臎Q定:
(課程名稱)-> (學(xué)分) 部分依賴主鍵
(學(xué)號(hào)) -> (姓名,年齡) 部分依賴主鍵
(學(xué)號(hào)澄阳、課程名稱) -> (成績(jī)) 完全依賴主鍵
由于不符合2NF拥知,這個(gè)選課關(guān)系表會(huì)存在如下問(wèn)題:
(1)數(shù)據(jù)冗余:
同一門課程由 n 個(gè)學(xué)生選修時(shí),“學(xué)分” 就重復(fù) n-1 次碎赢;
同一個(gè)學(xué)生選修了 m 門課程低剔,姓名和年齡就重復(fù)了 m-1 /次;
(2)數(shù)據(jù)異常:
若調(diào)整了某門課程的學(xué)分肮塞,數(shù)據(jù)表中所有行的“學(xué)分”值都要更新襟齿,否則會(huì)出現(xiàn)同一門課程學(xué)分不同的情況。
(3)插入異常:
假設(shè)要開設(shè)一門新的課程枕赵,暫時(shí)沒(méi)有人選修猜欺。這樣,由于還沒(méi)有“學(xué)號(hào)”關(guān)鍵字拷窜,課程名稱和學(xué)分也無(wú)法記錄入數(shù)據(jù)庫(kù)开皿。
(4)刪除異常:
假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修紀(jì)錄就應(yīng)該從數(shù)據(jù)表中刪除篮昧。但是赋荆,與此同時(shí),課程名稱和學(xué)分信息也被刪除了恋谭。很顯然糠睡,這樣也會(huì)導(dǎo)致插入異常。
解決方法:將部分依賴的屬性和這個(gè)被部分依賴的主屬性從原表中分離疚颊,形成一個(gè)新表狈孔。
上例的選課關(guān)系表應(yīng)該拆分為 3張表,拆分后的表就可以滿足第二范式的要求材义,從而徹底消除了前面列出的問(wèn)題均抽,它們分別是:
學(xué)生表:Student (學(xué)號(hào),姓名其掂,年齡)
課程表:Course (課程名稱油挥,學(xué)分)
選課關(guān)系表:SelectCourse (學(xué)號(hào),課程名稱,成績(jī))
另外深寥,所有單關(guān)鍵字的數(shù)據(jù)庫(kù)表都符合第二范式攘乒,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字,就不會(huì)存在部分依賴惋鹅。
3.第三范式
在1NF 基礎(chǔ)上则酝,任何非主屬性不依賴于其它非主屬性,即 3NF 就是在 2NF 基礎(chǔ)上消除傳遞依賴闰集,使得表中所有字段都直接依賴于主鍵字段沽讹。
第三范式(3NF)是第二范式(2NF)的一個(gè)子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)武鲁。第三范式(3NF)要求一個(gè)關(guān)系表中不包含已在其它關(guān)系表已包含的非主鍵字段爽雄。例如,存在一個(gè)部門信息表沐鼠,其中每個(gè)部門都有部門編號(hào)(dept_id)挚瘟、部門名稱,部門簡(jiǎn)介等信息迟杂。那么在員工信息表中列出部門編號(hào)后就不能再將部門名稱刽沾,部門簡(jiǎn)介等與部門有關(guān)的信息再加入員工信息表中本慕。如果不存在部門信息表排拷,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余锅尘。簡(jiǎn)而言之监氢,第三范式就是屬性不依賴于其他非主屬性,也就是在滿足 2NF 的基礎(chǔ)上藤违,任何非主屬性不得傳遞依賴于與屬性浪腐。
所謂傳遞函數(shù)依賴,指的是如果存在 “ A->《倨埂B∫榻帧-> C” 的決定關(guān)系璧榄,則C傳遞函數(shù)依賴于A特漩。因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴關(guān)系:
關(guān)鍵字段」窃印->非關(guān)鍵字段x->非關(guān)鍵字段y
假設(shè)學(xué)生表為Student(學(xué)號(hào)涂身、姓名、所在學(xué)院搓蚪、學(xué)院地點(diǎn)蛤售、學(xué)院電話),關(guān)鍵字為單一關(guān)鍵字“學(xué)號(hào)”,因此存在如下決定關(guān)系:
(學(xué)號(hào))->(姓名悴能,年齡揣钦,所在學(xué)院,學(xué)院地點(diǎn)漠酿,學(xué)院電話)
這個(gè)數(shù)據(jù)庫(kù)是符合2NF的拂盯,但是不符合3NF,因?yàn)榇嬖谌缦聸Q定關(guān)系:
(學(xué)號(hào))- >(所在學(xué)院)- >(學(xué)院地點(diǎn)记靡,學(xué)院電話)