李小蓮
摘要:文章首先介紹了關(guān)系、關(guān)系模式、函數(shù)依賴等相關(guān)概念,然后針對(duì)關(guān)系數(shù)據(jù)庫的第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)以及BCNF范式做了詳細(xì)分析,使用簡明清晰的方法幫助大家理解范式的定義,并且通過實(shí)例來說明各范式需要滿足的函數(shù)依賴關(guān)系。
關(guān)鍵詞:函數(shù)依賴;關(guān)系;數(shù)據(jù)庫;范式
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)08-0007-02
數(shù)據(jù)庫有關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫,現(xiàn)在應(yīng)用廣泛的流行的數(shù)據(jù)庫就是關(guān)系型數(shù)據(jù)庫。關(guān)系型數(shù)據(jù)庫是建立在關(guān)系模型的基礎(chǔ)上的,所以我們首先需要了解關(guān)系、關(guān)系模式以及關(guān)系模式里屬性間的函數(shù)依賴關(guān)系。
關(guān)系用來表示現(xiàn)實(shí)世界的實(shí)體以及實(shí)體間的各種聯(lián)系,它的邏輯結(jié)構(gòu)其實(shí)就是一張二維表。在關(guān)系模式R(U,F(xiàn))中R是關(guān)系名,U為一組屬性,F(xiàn)為屬性組U上的一組數(shù)據(jù)依賴。數(shù)據(jù)依賴是一個(gè)關(guān)系內(nèi)部屬性與屬性之間的一種約束關(guān)系。數(shù)據(jù)依賴主要有兩種類型:函數(shù)依賴(FD)和多值依賴(MVD)。那到底什么是函數(shù)依賴呢?它是這么定義的:設(shè)R(U)是一個(gè)屬性集U上的關(guān)系模式,X和Y是U的子集。若對(duì)于R(U)的任意一個(gè)可能的關(guān)系r,r中不可能存在兩個(gè)元組在X上的屬性值相等,而在Y上的屬性值不等,則稱“X函數(shù)確定Y”或“Y函數(shù)依賴于X”,記作X→Y。舉個(gè)實(shí)際例子:教師信息表(員工編號(hào),姓名,所在系別,教齡),其中X代表屬性集(員工編號(hào)),它只有一個(gè)屬性。Y代表屬性集(姓名,所在系別,教齡)。當(dāng)X的屬性值相等時(shí),Y值也是相等的,即若員工編號(hào)相同,則其他屬性“姓名,所在系別,教齡”也都一定相同。故稱此關(guān)系模式中x函數(shù)確定Y,X→Y,也就是:員工編號(hào)一姓名,所在系別,教齡。
1各范式概念剖析及實(shí)例分析
關(guān)系數(shù)據(jù)庫一共有六種,按屬性間依賴關(guān)系可以分為第一范式、第二范式、第三范式、BCNF范式、第四范式、第五范式。要想設(shè)計(jì)出好的數(shù)據(jù)庫,需要遵循規(guī)范化理論,使數(shù)據(jù)庫一步一步達(dá)到所需規(guī)范化的要求。本文主要剖析前面五種范式的相關(guān)概念,捋清各范式要求的屬性間的依賴關(guān)系并結(jié)合實(shí)際的應(yīng)用例子來說明。
1.1第一范式(1NF)
第一范式要求數(shù)據(jù)庫表中的屬性不可再分,這是關(guān)系數(shù)據(jù)庫必須滿足的條件。在平時(shí)的工作中,常常會(huì)見到如下表(表1)中這樣的數(shù)據(jù)表??蛻粲幸粋€(gè)手機(jī)號(hào),還有一個(gè)辦公電話,但放到數(shù)據(jù)庫設(shè)計(jì)中,這就不滿足第一范式,數(shù)據(jù)項(xiàng)“聯(lián)系方式”這一項(xiàng)有兩個(gè)數(shù)據(jù)項(xiàng)。要使其滿足第一范式則應(yīng)將聯(lián)系方式分解為“手機(jī)”和“公司電話”兩個(gè)數(shù)據(jù)項(xiàng)。
1.2第二范式(2NF)
第二范式的定義:若關(guān)系模式R∈1NF,并且每一個(gè)非主屬性都完全函數(shù)依賴于任何一個(gè)候選碼,則RE2NF。請注意這里的依賴關(guān)系是完全函數(shù)依賴,是不允許部分函數(shù)依賴,但是傳遞函數(shù)依賴是可以存在的。下面分情況討論:
1.2.1關(guān)系模式中不存在組合候選鍵
關(guān)系模式中不存在組合候選鍵,即每個(gè)候選鍵只有一個(gè)屬性,這時(shí)每個(gè)非主屬性都完全函數(shù)依賴任何一個(gè)碼。
例:關(guān)系模式用戶表(用戶號(hào),身份證號(hào),姓名,年齡,家庭住址,家庭成員數(shù))。其中用戶號(hào),身份證號(hào)都能唯一標(biāo)識(shí)用戶,都是此數(shù)據(jù)庫表的候選鍵,故兩個(gè)屬性也都是主屬性,其他非主屬性都完全函數(shù)依賴主屬性用戶號(hào)和身份證號(hào)。即
1)用戶號(hào)→姓名,年齡,家庭住址,家庭成員數(shù);
2)身份證號(hào)→姓名,年齡,家庭住址,家庭成員數(shù)。
故此數(shù)據(jù)庫表滿足第二范式。顯然,只含單關(guān)鍵字的碼的數(shù)據(jù)庫表一定是滿足第二范式的。
1.2.2關(guān)系模式表中有組合鍵作為候選鍵
下面給出兩個(gè)成績關(guān)系模式表來對(duì)照分析:
例:成績表1(學(xué)號(hào),課程號(hào),成績,)。其中(學(xué)號(hào),課程號(hào))為組合候選碼,非主屬性“成績”完全函數(shù)依賴候選碼(學(xué)號(hào),課程號(hào)),即(學(xué)號(hào),課程號(hào))→成績,此數(shù)據(jù)庫表滿足第二范式。
成績表2(學(xué)號(hào),姓名,課程號(hào),成績)。其中(學(xué)號(hào),課程號(hào))為組合候選鍵,存在如下決定關(guān)系:
1)(學(xué)號(hào),課程號(hào))→姓名、成績
2)學(xué)號(hào)→姓名
可以看到非主屬性“姓名”不完全函數(shù)依賴于候選鍵(學(xué)號(hào),課程號(hào)),而是部分函數(shù)依賴候選鍵(學(xué)號(hào),課程號(hào)),故此關(guān)系表不滿足第二范式。如果要使其滿足第二范式,則需要把上表(成績表2)拆分為兩張表:學(xué)生表(學(xué)號(hào),姓名)和成績表(學(xué)號(hào),課程號(hào),成績),從而消除非主屬性“姓名”對(duì)候選鍵的部分函數(shù)依賴。所以,第二范式其實(shí)就是需要消除表中非主屬性對(duì)候選鍵的部分函數(shù)依賴。
1.3第三范式(3NF)
例:關(guān)系模式商戶信息表(商戶編號(hào),姓名,年齡,商戶單位,單位電話,單位地址),存在下列依賴關(guān)系:
1)商戶編號(hào)→商戶單位
2)商戶單位→單位電話,單位地址
3)商戶編號(hào)→單位電話,單位地址
即存在非主屬性“單位電話”、“單位地址”對(duì)候選碼“商戶編號(hào)”的傳遞函數(shù)依賴,所以上面商戶信息表不滿足第三范式。要使其滿足第三范式,必須對(duì)表進(jìn)行拆分。對(duì)原關(guān)系表進(jìn)行規(guī)范化,將上表拆分為商戶信息表(商戶編號(hào),姓名,年齡)和商戶單位信息表(商戶單位,單位電話,單位地址)。拆分后的兩個(gè)表都不存在非主屬性對(duì)碼的傳遞函數(shù)依賴,都滿足第三范式。
1.4 BCNF范式
例:某連鎖超市有多個(gè)商店,一個(gè)商店有多名職工,一名職工只在一個(gè)商店工作,每個(gè)商店有多種商品,每個(gè)員工負(fù)責(zé)銷售幾種商品,同一種商品可以存放在不同的商店。設(shè)有下列關(guān)系模式(商店編號(hào),商品編號(hào),員工號(hào),數(shù)量),則存在以下函數(shù)依賴關(guān)系:
1)(商店編號(hào),商品編號(hào))→員工號(hào),數(shù)量
2)(商品編號(hào),員工號(hào))→商店編號(hào),數(shù)量
3)員工號(hào)→商店編號(hào)
由以上依賴關(guān)系可以看出該關(guān)系模式滿足第三范式。組合鍵(商店編號(hào),商品編號(hào))和(商品編號(hào),員工號(hào))都是它的碼。我們再來仔細(xì)觀察一下它是否滿足BNCF范式。(商店編號(hào),商品編號(hào))→員工號(hào),員工號(hào)→商店編號(hào),這表明主屬性“商店編號(hào)”對(duì)碼(商店編號(hào),商品編號(hào))存在傳遞函數(shù)依賴,所以它不符合BCNF范式。
雖然不滿足BCNF范式,也會(huì)導(dǎo)致一些冗余,但是將關(guān)系模式分解成滿足BCNF范式的關(guān)系模式后可能會(huì)丟掉原來的函數(shù)依賴關(guān)系,所以,我們不會(huì)要求一定要滿足BCNF范式,在實(shí)際應(yīng)用中視具體隋況而論,大多數(shù)情況下滿足第三范式就符合應(yīng)用要求了。
1.5第四范式(4NF)
前面的范式討論都是在函數(shù)依賴的范圍內(nèi)討論,到了第四范式,討論范圍就擴(kuò)大了,涉及的是多值依賴,所以我們先來了解什么是多值依賴。
多值依賴:設(shè)R(U)是屬性集u上的一個(gè)關(guān)系模式。X,Y,Z是U的子集,并且Z=U-X-Y。關(guān)系模式R(U)中多值依賴X→→Y成立,當(dāng)且僅當(dāng)對(duì)R(U)的任一關(guān)系r,給定的一對(duì)(x,z)值,有一組Y的值,這組值僅僅決定于x值而與z值無關(guān)。
在這個(gè)客戶信息表中,客戶有多個(gè)聯(lián)系地址和多個(gè)聯(lián)系電話,這時(shí),此表就違反了第四范式。在這種情況下,此表的設(shè)計(jì)會(huì)帶來很大維護(hù)上的麻煩,解決問題的方法就是設(shè)計(jì)新表——聯(lián)系方式表,這樣就不會(huì)違反第四范式了。下面進(jìn)行規(guī)范化設(shè)計(jì),把此表進(jìn)行分解為客戶信息表(表3)和客戶聯(lián)系方式表(表4),使其滿足第四范式。
2結(jié)語
范式是我們在設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu)時(shí)用到的一種方法,一般情況下,范式級(jí)別越高,數(shù)據(jù)庫結(jié)構(gòu)就會(huì)越清晰合理。在實(shí)際的數(shù)據(jù)庫應(yīng)用中,要去靈活地運(yùn)用數(shù)據(jù)庫的四大范式及BCNF范式,有些數(shù)據(jù)庫只要滿足第三范式就夠用,不必強(qiáng)行去滿足BC-NF范式、第四范式。要對(duì)關(guān)系數(shù)據(jù)庫理解透徹,首先要理解數(shù)學(xué)中的集合、函數(shù)等概念,關(guān)系數(shù)據(jù)庫理論是依托數(shù)學(xué)中的集合論,在分析范式定義時(shí),必須先數(shù)學(xué)中的相關(guān)概念熟悉。其次,要熟悉完全函數(shù)依賴、部分函數(shù)依賴、傳遞函數(shù)依賴、范式定義這些數(shù)據(jù)庫概念。最后要結(jié)合實(shí)例來理解概念,讓概念與實(shí)例對(duì)應(yīng)聯(lián)系起來,一切的分析還是為實(shí)際應(yīng)用做準(zhǔn)備的。
注解:
1.候選碼:即候選鍵,簡稱碼或鍵。