湯小波
[摘要]本文介紹了在實(shí)際開發(fā)過程中如何應(yīng)用數(shù)據(jù)庫規(guī)范化理論指導(dǎo)數(shù)據(jù)庫設(shè)計(jì),談到了基本概念函數(shù)依賴及三種基本的范式要求,并運(yùn)用其規(guī)劃設(shè)計(jì)數(shù)據(jù)庫,最終達(dá)到一個(gè)合格的數(shù)據(jù)庫模式。
[關(guān)鍵字]函數(shù)依賴 范式 規(guī)范化
1.函數(shù)依賴
數(shù)據(jù)依賴是通過一個(gè)關(guān)系中屬性問值的相等與否體現(xiàn)出來的數(shù)據(jù)間的相互關(guān)系,是現(xiàn)實(shí)世界屬性間聯(lián)系和約束的抽象,是數(shù)據(jù)內(nèi)在的性質(zhì),是語義的體現(xiàn)。函數(shù)依賴則是一種最重要、最基本的數(shù)據(jù)依賴。什么是函數(shù)依賴呢?
函數(shù)依賴:設(shè)R(u)是屬性集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。
2.規(guī)范化
關(guān)系數(shù)據(jù)庫設(shè)計(jì)的為方法之一就是設(shè)計(jì)滿足適當(dāng)范式的模式,通??梢酝ㄟ^判斷分解后的模式達(dá)到幾范式來評(píng)價(jià)模式規(guī)范化的程度。范式有1NF、2NF、3NF、BCNF、4NF和5NF,其中1NF級(jí)別最低,通過分解,可以將一個(gè)低一級(jí)范式的關(guān)系模式轉(zhuǎn)換成若干個(gè)高一級(jí)范式的關(guān)系模式,這種過程叫做規(guī)范化。
(1)1NF(第一范式)。若關(guān)系模式R的每一個(gè)分量是不可再分的數(shù)據(jù)項(xiàng),則關(guān)系模式R屬于第一范式,例如:有這樣一張數(shù)據(jù)表FIRST它表示供應(yīng)者和它所提供的零件信息。
此關(guān)系模式的函數(shù)依賴集F如下:
F={snO-->Sname,Sno-->Status,Status-->City,(snO,Pno)-->Qty},從上表可以看出,每一個(gè)分量都是不可再分的數(shù)據(jù)項(xiàng),所以它是1NF。但是,它存在4個(gè)問題:
其一、冗余度大。例如,每個(gè)供應(yīng)者的Sno、Sname,Status和City要與其供應(yīng)的零件種類一樣多。如S1、S2與S3相關(guān)的多條記錄均具有相同的供應(yīng)者的名字、狀態(tài)和城市,造成了數(shù)據(jù)冗余。
其二、引起修改操作的不一致性。例如,供應(yīng)者s1從“天津”搬到“上?!?,若稍不注意,就會(huì)使一些數(shù)據(jù)被修改,另一些數(shù)據(jù)沒有被修改,導(dǎo)致數(shù)據(jù)修改的不一致。
其三、插入異常。關(guān)系模式First的主碼Sno、Pno,按照關(guān)系模式實(shí)體完整性規(guī)定,主碼不能取空值或部分取空值。這樣,當(dāng)某個(gè)供應(yīng)者的某些信息未提供時(shí)(如Pno),則不能進(jìn)行插入操作,這就是所謂的插入異常。
其四、刪除異常。若供應(yīng)商S4的P2零件銷售完了,并且以后不再銷售P2零件,那么應(yīng)刪除該元組。這樣,在基本關(guān)系First找不到s4,可s4又客觀存在的。
(2)2NF(第二范式)
定義:若關(guān)系模式R屬于1NF,且每一個(gè)非主屬性完全依賴于碼,則關(guān)系模式R屬于2NF。換句話說,當(dāng)1 NF消除了非主屬性對(duì)碼的部分函數(shù)依賴,則稱為2NF。例如,在上述關(guān)系First中的碼是Sno、Pno,而Sno-->Status,因此非主屬性Status部分函數(shù)依賴于碼,故非2NF的。對(duì)于上述關(guān)系可以作如下分解,將其分解為Firstl(sn口,Sname,Status,c時(shí))和First2(Sno,Pno,Qty)。這樣分解后,關(guān)系模式Firstl的碼為Sno,非主屬性Sname、Status、City完全依賴于碼Sno,所以屬于2NF;關(guān)系模式First2的碼為Sno、Pno非主屬性Qty完全依賴于碼,所以也屬于2NF。經(jīng)過這樣分解后,兩數(shù)據(jù)表如下:
通過對(duì)關(guān)系First分解成Firstl和First2兩個(gè)關(guān)系后,可以發(fā)現(xiàn)1NF中出現(xiàn)的數(shù)據(jù)冗余問題解決了,引起修改操作的不一致性的隱患也消除了,刪除異??山鉀Q了,確實(shí)2NF在數(shù)據(jù)庫設(shè)計(jì)中具有很強(qiáng)的現(xiàn)實(shí)意義和可操作性。
(3)3NF(第三范式)。若關(guān)系模式R(U,F(xiàn))中若不存在這樣的碼X,屬性組Y及非主屬性Z(Z不屬性Y)使得X-->Y,Y-->Z成立,則關(guān)系模式R屬于3NF。即當(dāng)2NF消除了非主屬性對(duì)碼的傳遞函數(shù)依賴,則稱為3NF。
在關(guān)系Firstl中,存在這樣的問題,Sno-->Status,而Status-->City,存在著非主屬性City傳遞依賴于碼Sno。若將Firstl繼續(xù)分解如下:
First1(sno,Sname,Status),F(xiàn)irst2(status,City)這樣就消除了City對(duì)Sno的傳遞依賴關(guān)系,此時(shí)就達(dá)到了3NF。按照此思想設(shè)計(jì)改寫上述數(shù)據(jù)庫設(shè)計(jì),將關(guān)系First分解為三個(gè)關(guān)系,每個(gè)關(guān)系滿足3NF。關(guān)系表如下:
關(guān)系Firstl(sn0,Sname,Status)
關(guān)系First2(Status,c時(shí))
關(guān)系First3(sn0,Pno,Qty)同上。
3、總結(jié)
在數(shù)據(jù)庫設(shè)計(jì)過程中,我們要求每張表均達(dá)到3NF,對(duì)于非3NF的1NF、2NF其性能弱,一般不宜作為數(shù)據(jù)庫模式,通常要將它們變換成3NF或更高級(jí)別的范式。將這個(gè)變換過程稱為“關(guān)系模式的規(guī)范化處理”,關(guān)系數(shù)據(jù)庫規(guī)范化理論,它對(duì)于指導(dǎo)我們進(jìn)行數(shù)據(jù)庫設(shè)計(jì)具有現(xiàn)實(shí)的意義,在實(shí)際開發(fā)中將有意識(shí)地應(yīng)用這一理論,設(shè)計(jì)出高質(zhì)量的數(shù)據(jù)庫,它是我們項(xiàng)目開發(fā)成功的先決條件。