參考來(lái)源:知乎
按照教材中的定義碗硬,范式是“符合某一種級(jí)別的關(guān)系模式的集合,表示一個(gè)關(guān)系內(nèi)部各屬性之間的聯(lián)系的合理化程度”绵咱。
數(shù)據(jù)庫(kù)范式分為1NF碘饼,2NF,3NF悲伶,BCNF艾恼,4NF,5NF麸锉。一般在我們?cè)O(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候钠绍,最多考慮到BCNF就夠。符合高一級(jí)范式的設(shè)計(jì)花沉,必定符合低一級(jí)范式柳爽,例如符合2NF的關(guān)系模式,必定符合1NF碱屁。
第一范式(1NF):
1NF體現(xiàn)了列的原子性磷脯,即列不可再分為其它幾列。
例如:下表就不符合第一范式娩脾。
實(shí)際上赵誓,1NF是所有關(guān)系型數(shù)據(jù)庫(kù)的最基本要求,你在關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),例如SQL Server俩功,Oracle幻枉,MySQL中創(chuàng)建數(shù)據(jù)表的時(shí)候,如果數(shù)據(jù)表的設(shè)計(jì)不符合這個(gè)最基本的要求诡蜓,那么操作一定是不能成功的熬甫。也就是說(shuō),只要在RDBMS中已經(jīng)存在的數(shù)據(jù)表万牺,一定是符合1NF的罗珍。
然而1NF存在著一些問(wèn)題:
1.每個(gè)數(shù)據(jù)可能重復(fù)多次——數(shù)據(jù)冗余
2.由于一行的每一個(gè)數(shù)據(jù)都不能為空洽腺,無(wú)法將某些屬性單獨(dú)地加入到數(shù)據(jù)庫(kù)中——插入異常
3.將數(shù)據(jù)庫(kù)中的某一屬性全部刪除脚粟,則其它數(shù)據(jù)也可能無(wú)法保留——刪除異常
4.某一個(gè)數(shù)據(jù)的該動(dòng)需要修改多條記錄——修改異常
正因?yàn)閮H符合1NF的數(shù)據(jù)庫(kù)設(shè)計(jì)存在著這樣那樣的問(wèn)題,我們需要提高設(shè)計(jì)標(biāo)準(zhǔn)蘸朋,去掉導(dǎo)致上述四種問(wèn)題的因素核无,使其符合更高一級(jí)的范式(2NF),這就是所謂的“規(guī)范化”
第二范式(2NF):
第二范式首先是滿足第一范式的藕坯,其改進(jìn)是团南,2NF在1NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的部分函數(shù)依賴炼彪。接下來(lái)對(duì)這句話中涉及到的四個(gè)概念——“函數(shù)依賴”吐根、“碼”、“非主屬性”辐马、與“部分函數(shù)依賴”進(jìn)行一下解釋拷橘。
函數(shù)依賴
我們可以這么理解(但并不是特別嚴(yán)格的定義):若在一張表中冗疮,在屬性(或?qū)傩越M)X的值確定的情況下术幔,必定能確定屬性Y的值,那么就可以說(shuō)Y函數(shù)依賴于X拔妥,寫(xiě)作 X → Y俩由。也就是說(shuō),在數(shù)據(jù)表中,不存在任意兩條記錄努释,它們?cè)赬屬性(或?qū)傩越M)上的值相同咬摇,而在Y屬性上的值不同
完全函數(shù)依賴
在一張表中逸邦,若 X → Y缕减,且對(duì)于 X 的任何一個(gè)真子集(假如屬性組 X 包含超過(guò)一個(gè)屬性的話),X ' → Y 不成立皱卓,那么我們稱 Y 對(duì)于 X完全函數(shù)依賴裹芝,記作 X F→ Y。
例如:
學(xué)號(hào) F→ 姓名
(學(xué)號(hào),課名) F→ 分?jǐn)?shù)? (注:因?yàn)橥粋€(gè)的學(xué)號(hào)對(duì)應(yīng)的分?jǐn)?shù)不確定享完,同一個(gè)課名對(duì)應(yīng)的分?jǐn)?shù)也不確定)
部分函數(shù)依賴
假如 Y 函數(shù)依賴于 X彼绷,但同時(shí) Y 并不完全函數(shù)依賴于 X,那么我們就稱 Y 部分函數(shù)依賴于 X,記作 X? P→ Y椿争,
例如:
(學(xué)號(hào)熟嫩,課名) P→ 姓名
傳遞函數(shù)依賴
假如 Z 函數(shù)依賴于 Y椅邓,且 Y 函數(shù)依賴于 X裁僧,那么我們就稱 Z 傳遞函數(shù)依賴于 X 沪悲,記作 X T→ Z阱表。
碼
設(shè) K 為某表中的一個(gè)屬性或?qū)傩越M殿如,若除 K 之外的所有屬性都完全函數(shù)依賴于 K,那么我們稱 K 為候選碼最爬,簡(jiǎn)稱為碼涉馁。在實(shí)際中我們通常可以理解為:假如當(dāng) K 確定的情況下爱致,該表除 K 之外的所有屬性的值也就隨之確定烤送,那么 K 就是碼。一張表中可以有超過(guò)一個(gè)碼糠悯。(實(shí)際應(yīng)用中為了方便帮坚,通常選擇其中的一個(gè)碼作為主碼)
主屬性
包含在任何一個(gè)碼中的屬性成為主屬性。
為了讓表符合2NF的要求互艾,我們必須消除這些部分函數(shù)依賴试和,只有一個(gè)辦法,就是將大數(shù)據(jù)表拆分成兩個(gè)或者更多個(gè)更小的數(shù)據(jù)表纫普,在拆分的過(guò)程中阅悍,要達(dá)到更高一級(jí)范式的要求,這個(gè)過(guò)程叫做”模式分解“。模式分解的方法不是唯一的节视。
2NF仍存在刪除異常和插入異常的情況晦墙。
第三范式(3NF):
3NF在2NF的基礎(chǔ)之上,消除了非主屬性對(duì)于碼的傳遞函數(shù)依賴肴茄。也就是說(shuō)晌畅, 如果存在非主屬性對(duì)于碼的傳遞函數(shù)依賴,則不符合3NF的要求寡痰。
符合3NF要求的數(shù)據(jù)庫(kù)設(shè)計(jì)抗楔,基本上解決了數(shù)據(jù)冗余過(guò)大,插入異常拦坠,修改異常连躏,刪除異常的問(wèn)題。當(dāng)然贞滨,在實(shí)際中入热,往往為了性能上或者應(yīng)對(duì)擴(kuò)展的需要,經(jīng)常 做到2NF或者1NF晓铆,但是作為數(shù)據(jù)庫(kù)設(shè)計(jì)人員勺良,至少應(yīng)該知道,3NF的要求是怎樣的骄噪。