18.7.24
一空凸、概念
在創(chuàng)建一個數(shù)據(jù)庫的過程中,必須依照一定的準(zhǔn)則寸痢,這些準(zhǔn)則被稱為范式呀洲,從第一到第六共六個范式。
二、背景
數(shù)據(jù)庫的規(guī)范化(上一篇博客有寫到)的程度不同道逗,便有了這么多種范式丛楚。數(shù)據(jù)庫范式是數(shù)據(jù)庫設(shè)計必不可少的知識,沒有對范式的理解憔辫,就無法設(shè)計出高效率趣些、優(yōu)雅的數(shù)據(jù)庫,甚至設(shè)計出錯誤誤的數(shù)據(jù)庫贰您。
三坏平、目標(biāo)
一般數(shù)據(jù)庫設(shè)計只要遵循第一范式,第二范式锦亦,和第三范式就足夠了舶替,滿足這些規(guī)范的數(shù)據(jù)庫是簡潔的、結(jié)構(gòu)明晰的杠园,同時顾瞪,不會發(fā)生插入(insert)、刪除(delete)和更新(update)操作異常抛蚁。
使用正確的數(shù)據(jù)結(jié)構(gòu)陈醒,不僅有助于對數(shù)據(jù)庫進行相應(yīng)的存取操作,還可以極大地簡化應(yīng)用程序中的其他內(nèi)容(查詢瞧甩、窗體钉跷、報表、代碼等)肚逸,按照“數(shù)據(jù)庫規(guī)范化”對表進行設(shè)計爷辙,其目的就是減少數(shù)據(jù)庫中的數(shù)據(jù)冗余,以增加數(shù)據(jù)的一致性朦促。
四膝晾、概念
1、候選鍵:唯一識別該表的屬性或?qū)傩越M务冕。而其任何血当、子集都不能再標(biāo)識,則稱該屬性組為(超級碼)候選碼洒疚。
例如:在學(xué)生實體中歹颓,“學(xué)號”是能唯一的區(qū)分學(xué)生實體的,同時又假設(shè)“姓名”油湖、“班級”的屬性組合足以區(qū)分學(xué)生實體巍扛,那么{學(xué)號}和{姓名,班級}都是(超級碼)候選碼乏德。
2撤奸、所謂依賴出嘹,就是函數(shù)依賴舅列,就是映射炭序《逯辏可以一對一,可以一對多府喳,可以多對多蒲肋。
五、六大范式
第一范式(1NF):屬性不可拆分 或 無重復(fù)的列
一個屬性不允許再分成多個屬性來建立列钝满。事實上兜粘,在目前的DBMS中是不可能拆分屬性的,因為他們不允許這么做弯蚜。
如果出現(xiàn)重復(fù)的屬性孔轴,就可能需要定義一個新的實體,新的實體由重復(fù)的屬性構(gòu)成碎捺,新實體與原實體之間為一對多關(guān)系路鹰。第一范式的模式要求屬性值不可再分裂成更小部分,即屬性項不能是屬性組合或是由一組屬性構(gòu)成收厨。
簡而言之晋柱,第一范式就是無重復(fù)的列。例如帽氓,由“職工號”“姓名”“電話號碼”組成的表(一個人可能有一部辦公電話和一部移動電話)趣斤,這時將其規(guī)范化為1NF可以將電話號碼分為“辦公電話”和“移動電話”兩個屬性俩块,即職工(職工號黎休,姓名,辦公電話玉凯,移動電話)势腮。-
第二范式(2NF):(就是有一個唯一主鍵,并且非主屬性對候選鍵是完全依賴漫仆。)(候選鍵可以是一個捎拯,也可以是兩個,如果是關(guān)系表盲厌,一個候選鍵中一般有兩個主屬性署照,所以非主屬性對候選鍵中的兩個主屬性的依賴,就要看是否是完全依賴吗浩。部分依賴會引起數(shù)據(jù)冗余建芙。)
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)懂扼。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被唯一地區(qū)分禁荸。為實現(xiàn)區(qū)分通常需要為表加上一個列右蒲,以存儲各個實例的唯一標(biāo)識。
完全函數(shù)依賴
先講講什么是部分函數(shù)依賴赶熟。
部分函數(shù)依賴瑰妄,就是多個屬性決定另一個屬性,但事實上映砖,這多個屬性是有冗余的间坐。例如,(學(xué)號邑退,班級)->姓名眶诈,事實上,只需要學(xué)號就能決定姓名瓜饥,因此班級是冗余的逝撬,應(yīng)該去掉。
如果關(guān)系模型R為第一范式乓土,并且R中的每一個非主屬性完全函數(shù)依賴于R的某個候選鍵宪潮,則稱R為第二范式模式(如果A是關(guān)系模式R的候選鍵的一個屬性,則稱A是R的主屬性趣苏,否則稱A是R的非主屬性)狡相。
因此第二范式的目標(biāo)就是消除函數(shù)依賴關(guān)系中左邊存在的冗余屬性。
例如食磕,在選課關(guān)系表(學(xué)號尽棕,課程號,成績彬伦,學(xué)分)滔悉,關(guān)鍵字為組合關(guān)鍵字(學(xué)號,課程號)单绑,但由于非主屬性學(xué)分僅依賴于課程號回官,對關(guān)鍵字(學(xué)號,課程號)只是部分依賴搂橙,而不是完全依賴歉提,因此此種方式會導(dǎo)致數(shù)據(jù)冗余以及更新異常等問題,解決辦法是將其分為兩個關(guān)系模式:學(xué)生表(學(xué)號区转,課程號苔巨,分?jǐn)?shù))和課程表(課程號,學(xué)分)废离,新關(guān)系通過學(xué)生表中的外關(guān)鍵字課程號聯(lián)系侄泽,在需要時進行連接。
3.第三范式(3NF):消除傳遞依賴
滿足第三范式的數(shù)據(jù)庫必須先滿足第二范式厅缺。
也就是蔬顾,數(shù)據(jù)庫中的非主屬性僅能依賴于候選鍵宴偿,不存在與其他非主屬性的關(guān)聯(lián)。
例如诀豁,圖書窄刘,圖書室的關(guān)系。圖書包括編號舷胜、出版商娩践、頁碼等信息,圖書室包括圖書室編號烹骨、所存圖書(外鍵)翻伺。其中,圖書室的表中不應(yīng)該存儲任何圖書的具體信息(例如沮焕,出版商吨岭。。)峦树,而只能通過主鍵圖書編號來獲得對應(yīng)圖書的信息辣辫。(這個例子只說明了不能部分依賴,跟傳遞依賴沒啥關(guān)系魁巩,真是水凹泵稹)
以學(xué)生表(學(xué)號,姓名谷遂,課程號葬馋,成績)為例,其中學(xué)生姓名無重名肾扰,所以該表有兩個候選碼(學(xué)號畴嘶,課程號)和(姓名,課程號)白对,故存在函數(shù)依賴:學(xué)號——>姓名掠廓,(學(xué)號,課程號)——>成績甩恼,唯一的非主屬性成績對碼不存在部分依賴,也不存在傳遞依賴沉颂,所以屬性屬于第三范式条摸。
簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主屬性信息铸屉。例如钉蒲,存在一個部門信息表,其中每個部門有部門編號(dept_id)彻坛、部門名稱顷啼、部門簡介等信息踏枣。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中钙蒙。如果不存在部門信息表茵瀑,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余躬厌。簡而言之马昨,第三范式就是屬性不依賴于其它非主屬性。
總結(jié)一下:兩個表相關(guān)聯(lián)扛施,一個表只能有另一個表的一個依賴鸿捧。
一般系統(tǒng)設(shè)計需要符合第三范式。第三范式簡而言之兩個關(guān)聯(lián)的表疙渣,一個表只能有另一個表的候選鍵匙奴,不能有共同的非主屬性。
即妄荔,兩個關(guān)聯(lián)表饥脑,一個表A有另一個表B的非主屬性c,表A有候選鍵a和b懦冰,b也是表B的候選鍵灶轰,此時的傳遞依賴關(guān)系為:A-B,B-c刷钢。此時不滿足第三范式笋颤。
4.BC范式(BCNF):(候選鍵存在多個屬性時,多個主屬性直接要消除傳遞依賴關(guān)系)
(1)所有非主屬性對每一個碼都是完全函數(shù)依賴内地;
(2)所有的主屬性對于每一個不包含它的碼伴澄,也是完全函數(shù)依賴;
(3)沒有任何屬性完全函數(shù)依賴于非碼的任意一個組合阱缓。
R屬于3NF非凌,不一定屬于BCNF,如果R屬于BCNF荆针,一定屬于3NF敞嗡。就是對于候選碼中包含多個屬性時,里面的關(guān)鍵字段互相沒有依賴航背。 假設(shè)倉庫管理關(guān)系表(倉庫號喉悴,存儲物品號,管理員號玖媚,數(shù)量)箕肃,滿足一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品今魔,則存在如下關(guān)系:
(倉庫號勺像,存儲物品號)——>(管理員號障贸,數(shù)量)
(管理員號,存儲物品號)——>(倉庫號吟宦,數(shù)量)
所以篮洁,(倉庫號,存儲物品號)和(管理員號督函,存儲物品號)都是倉庫管理關(guān)系表的候選碼嘀粱,表中唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的辰狡。但是锋叨,由于存在如下決定關(guān)系:
(倉庫號)——>(管理員號)
(管理員號)——>(倉庫號)
即存在關(guān)鍵字段決定關(guān)鍵字段的情況,因此其不符合BCNF宛篇。把倉庫管理關(guān)系表分解為兩個關(guān)系表倉庫管理表(倉庫號娃磺,管理員號)和倉庫表(倉庫號,存儲物品號叫倍,數(shù)量)偷卧,這樣這個數(shù)據(jù)庫表是符合BCNF的,并消除了刪除異常吆倦、插入異常和更新異常听诸。
5.第四范式(4NF):(一個表的主鍵只對應(yīng)一個多值)
對于每一個X->Y,X都能找到一個候選碼( 若關(guān)系中的某一屬性組的值能唯一地表示一個元組,而其真子集不行,則稱該屬性組為候選碼)蚕泽。
設(shè)R是一個關(guān)系模型晌梨,D是R上的多值依賴集合。如果D中存在凡多值依賴X->Y時须妻,X必是R的超鍵仔蝌,那么稱R是第四范式的模式。
例如荒吏,職工表(職工編號敛惊,職工孩子姓名,職工選修課程)绰更,在這個表中瞧挤,同一個職工可能會有多個職工孩子姓名,同樣动知,同一個職工也可能會有多個職工選修課程皿伺,即這里存在著多值事實,不符合第四范式盒粮。如果要符合第四范式,只需要將上表分為兩個表奠滑,使它們只有一個多值事實丹皱,例如職工表一(職工編號妒穴,職工孩子姓名),職工表二(職工編號摊崭,職工選修課程)讼油,兩個表都只有一個多值事實,所以符合第四范式呢簸。
6矮台、總結(jié):
第一范式、第二范式是對于本表內(nèi)根时。第三范式瘦赫、BC范式和第四范式涉及多表。
1蛤迎、第一范式比較簡單确虱,屬性不可拆分。電話號碼一個字段可以分為手機號碼和座機號碼兩個字段替裆。
2校辩、第二范式不難理解,非主屬性對候選鍵完全依賴辆童,不能存在部分依賴宜咒。候選鍵只有一個主屬性時則一定符合第二范式。
候選鍵包含多個主屬性時把鉴,可能出現(xiàn)不符合第二范式的情況故黑,就是非主屬性對多屬性候選鍵部分函數(shù)依賴。在非主屬性對多屬性候選鍵完全函數(shù)依賴時纸镊,才符合第二范式倍阐。
3、第三范式去除冗余逗威,非主屬性只能存在一個表中峰搪,不應(yīng)該存在多個表中,要去除無意義的數(shù)據(jù)冗余凯旭。
4概耻、BC范式則不應(yīng)存在關(guān)鍵字決定關(guān)鍵字的情況。也就是在關(guān)聯(lián)關(guān)系表中罐呼,一個表有多個屬性構(gòu)成復(fù)合的候選鍵鞠柄,主屬性直接不應(yīng)該有互相依賴。工號和身份證號是相互依賴嫉柴。
5厌杜、第四范式,對于候選鍵只能存在不超過1個多值屬性。要求把同一表內(nèi)的多對多關(guān)系刪除夯尽。
參考:https://blog.csdn.net/yahohi/article/details/7529710
https://blog.csdn.net/hyqsong/article/details/52245195
https://blog.csdn.net/dove_knowledge/article/details/71434960