數(shù)據(jù)庫系統(tǒng)概論:第7章 關(guān)系數(shù)據(jù)庫設(shè)計_第1頁
數(shù)據(jù)庫系統(tǒng)概論:第7章 關(guān)系數(shù)據(jù)庫設(shè)計_第2頁
數(shù)據(jù)庫系統(tǒng)概論:第7章 關(guān)系數(shù)據(jù)庫設(shè)計_第3頁
數(shù)據(jù)庫系統(tǒng)概論:第7章 關(guān)系數(shù)據(jù)庫設(shè)計_第4頁
數(shù)據(jù)庫系統(tǒng)概論:第7章 關(guān)系數(shù)據(jù)庫設(shè)計_第5頁
已閱讀5頁,還剩87頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第7章章 關(guān)系數(shù)據(jù)庫設(shè)計關(guān)系數(shù)據(jù)庫設(shè)計n好的關(guān)系設(shè)計的特點n原子域與第一范式n函數(shù)依賴分解n函數(shù)依賴理論n分解的算法nBoyce - Codd 范式n第三范式n多值依賴與第四范式n數(shù)據(jù)庫設(shè)計過程第第7章章 關(guān)系數(shù)據(jù)庫設(shè)計關(guān)系數(shù)據(jù)庫設(shè)計n 關(guān)系數(shù)據(jù)庫設(shè)計的目標(biāo)是生成一組關(guān)系關(guān)系數(shù)據(jù)庫設(shè)計的目標(biāo)是生成一組關(guān)系模式,使我們既不必存儲不必要的重復(fù)信模式,使我們既不必存儲不必要的重復(fù)信息,又可以方便地獲取信息。這是通過設(shè)息,又可以方便地獲取信息。這是通過設(shè)計滿足適當(dāng)范式的模式來實現(xiàn)的。計滿足適當(dāng)范式的模式來實現(xiàn)的。n 要確定一個關(guān)系模要確定一個關(guān)系模式是否屬于我們期式是否屬于我們期望的范式,我們還需要

2、有關(guān)作為數(shù)據(jù)庫建望的范式,我們還需要有關(guān)作為數(shù)據(jù)庫建模對象的現(xiàn)實中的企業(yè)的信息模對象的現(xiàn)實中的企業(yè)的信息 7.1 好的關(guān)系設(shè)計的特點好的關(guān)系設(shè)計的特點n設(shè)計選擇-更大的模式n設(shè)計選擇-更小的模式n有損分解和無損分解 7.1.1 設(shè)計選擇:更大的模式設(shè)計選擇:更大的模式 n讓我們探究一下這個關(guān)系數(shù)據(jù)庫設(shè)計的特點,以及一些可選方案。假定用以下這個模式代替borrower模式和loan模式:n bor_loan=(customer_id, loan_nunber,amount)n 這表示對borrower和loan相應(yīng)的關(guān)系進行自然連接的結(jié)果。這似乎是個好主意,因為有些查詢可以用更少的連接來表達n可

3、是,borrower聯(lián)系集是多對多的。這是borrower模式的主碼包含customer_id和loan_number而不僅僅是loan_number的原因了。n在在bor _loan中,我們不得不為借出該貸款的團體中的每中,我們不得不為借出該貸款的團體中的每個客戶個客戶重復(fù)重復(fù)一次貸款數(shù)額。使用一次貸款數(shù)額。使用loan和和borrower,每筆貸,每筆貸款的數(shù)額只需要存儲一次。就說明使用款的數(shù)額只需要存儲一次。就說明使用bor _loan是一個是一個壞主意,它將貨款數(shù)額重復(fù)存儲,因而產(chǎn)生某些用戶可壞主意,它將貨款數(shù)額重復(fù)存儲,因而產(chǎn)生某些用戶可能更新一個元組而不是所有元組中的貸能更新一個元

4、組而不是所有元組中的貸0款數(shù)額的風(fēng)險,款數(shù)額的風(fēng)險,從而從而導(dǎo)致數(shù)據(jù)庫不一致。導(dǎo)致數(shù)據(jù)庫不一致。 7.1.1 設(shè)計選擇:更大的模式設(shè)計選擇:更大的模式 n現(xiàn)在,我們考慮另外一個替代方案:n loan _amt _br=(loan_number,amount,branch_name)n由loan_branch和loan(通過相應(yīng)關(guān)系的連接)產(chǎn)生。 n這里loan _number是loan_branch模式和loan模式的主碼,因此它也是loan _amt_br的主碼。這是由于loan _branch聯(lián)系集是多對一的。對于給定的一筆貸款,只有唯一的一個相關(guān)聯(lián)的支行。因此一個特定的貸款號在loan

5、_branch中僅出現(xiàn)一次。 7.1.1 設(shè)計選擇:更大的模式設(shè)計選擇:更大的模式 n 在我們同意使用loan _arnt _br取代loan和loan_branch之前,還有一個問題需要考慮。若loan在貸款數(shù)額確定之前在數(shù)據(jù)庫中記錄一筆貸款和它的相關(guān)分行。在原來的設(shè)計中,loan_branch模式能夠處理這個問題,但是在使用了loan_amt_br的修改后的設(shè)計中,我們可能要創(chuàng)建一個amount上為空值的元組。在某些情況下空值是容易出問題 。但是,如果我們認為在該情況下這不是一個問題,我們就可以繼續(xù)使用這個修改后的設(shè)計。 7.1.1 設(shè)計選擇:更大的模式設(shè)計選擇:更大的模式 n 我們剛才所

6、考慮的兩個例子表明了我們剛才所考慮的兩個例子表明了主碼主碼特性在決定合并模式是否有意義時的重要特性在決定合并模式是否有意義時的重要性。性。n當(dāng)連接屬性當(dāng)連接屬性 不是被合并的兩個模式的共不是被合并的兩個模式的共同主碼的時候,就會出現(xiàn)問題同主碼的時候,就會出現(xiàn)問題 (尤其是(尤其是信息重復(fù)的問題)。信息重復(fù)的問題)。 7.1.1 設(shè)計選擇:更大的模式設(shè)計選擇:更大的模式 n 在loan _amt _br中沒有重復(fù)的信息,因此它避免了我們在前面的例子中發(fā)現(xiàn)的問題。 7.1.2 設(shè)計選擇:更小的模式設(shè)計選擇:更小的模式 n假定我們一開始得到的是假定我們一開始得到的是bor_loan模式。如何能夠模式

7、。如何能夠發(fā)現(xiàn)它需要對信息進行重復(fù)而應(yīng)該把它分成發(fā)現(xiàn)它需要對信息進行重復(fù)而應(yīng)該把它分成borrower和和loan兩個模式呢?兩個模式呢?n通過觀察通過觀察bor_loan模式上的實際關(guān)系的內(nèi)容,我們模式上的實際關(guān)系的內(nèi)容,我們會注意到信息的重復(fù),這是由于一筆貸款所關(guān)聯(lián)的會注意到信息的重復(fù),這是由于一筆貸款所關(guān)聯(lián)的每個借款人都要列出貸款數(shù)額。但是,這是一個不每個借款人都要列出貸款數(shù)額。但是,這是一個不可靠的處理方式?,F(xiàn)實世界中的數(shù)據(jù)庫中有著大量可靠的處理方式。現(xiàn)實世界中的數(shù)據(jù)庫中有著大量的模式以及數(shù)量更龐大的屬性。信息重復(fù)的代價高的模式以及數(shù)量更龐大的屬性。信息重復(fù)的代價高昂。使用這種處理方式

8、時我們無法確定在沒有重復(fù)昂。使用這種處理方式時我們無法確定在沒有重復(fù)信息時,到底只是一個信息時,到底只是一個 特殊情況,還是一條一般規(guī)特殊情況,還是一條一般規(guī)則的表現(xiàn)。則的表現(xiàn)。 7.1.2 設(shè)計選擇:更小的模式設(shè)計選擇:更小的模式 n 我們需要允許數(shù)據(jù)庫設(shè)計者定義像我們需要允許數(shù)據(jù)庫設(shè)計者定義像“每個每個loan_number的特定值最多對應(yīng)于一個貸款數(shù)的特定值最多對應(yīng)于一個貸款數(shù)額額”這樣的規(guī)則。該規(guī)則定義為函數(shù)依賴這樣的規(guī)則。該規(guī)則定義為函數(shù)依賴loan_number amount 。 n 由于由于loan_number不能成為不能成為bor_loan的主碼的主碼(因為一筆貸款可能在(因

9、為一筆貸款可能在bor_loan模式上的關(guān)系模式上的關(guān)系中有多個元組)所以一筆貸款的數(shù)額可能會中有多個元組)所以一筆貸款的數(shù)額可能會重復(fù)。重復(fù)。 7.1.2 設(shè)計選擇:更小的模式設(shè)計選擇:更小的模式 n 對于具有大量屬性和多個函數(shù)依賴的對于具有大量屬性和多個函數(shù)依賴的模式,找到正確的分解就要難得多。模式,找到正確的分解就要難得多。n n 并不是所有的模式分解都是有益的?,F(xiàn)并不是所有的模式分解都是有益的。現(xiàn)在考慮把在考慮把employee模式分解為:模式分解為: 7.1.2 設(shè)計選擇:更小的模式設(shè)計選擇:更小的模式 n employee1=(employee_id, employee_name)

10、n employee2=(employee_name,telephone_number, start_date)n 該分解的缺陷在于企業(yè)中可能存在兩個同名的雇該分解的缺陷在于企業(yè)中可能存在兩個同名的雇員。當(dāng)然,每個人都有一個唯一的雇員號員。當(dāng)然,每個人都有一個唯一的雇員號 。n假定兩個雇員名字都是假定兩個雇員名字都是Kim,他們在該銀行工作并,他們在該銀行工作并且在原來設(shè)計的且在原來設(shè)計的employee模式上的關(guān)系中有以下元模式上的關(guān)系中有以下元組:組:n (123-45-6789, Kim,882-0000,1984-03-29)n (987-65-4321, Kim, 869-9999,

11、1981-01-16)n 7.1.2 設(shè)計選擇:更小的模式設(shè)計選擇:更小的模式 n 圖圖7-4中所示這些元組為分解后的模式上中所示這些元組為分解后的模式上得到的元組,以及用自然連接生成元組所產(chǎn)得到的元組,以及用自然連接生成元組所產(chǎn)生的結(jié)果。生的結(jié)果。n 結(jié)果中出現(xiàn)了兩個原來的元組,并伴隨著結(jié)果中出現(xiàn)了兩個原來的元組,并伴隨著兩個新的元組,這兩個新的元組將日期值與兩個新的元組,這兩個新的元組將日期值與其所屬的這兩個名為其所屬的這兩個名為Kim的職員錯誤地合在了的職員錯誤地合在了一起。顯然,我們希望避免這樣的分解。我一起。顯然,我們希望避免這樣的分解。我們將這樣的分解稱為們將這樣的分解稱為有損分解

12、有損分解,反之則稱為,反之則稱為無損分局無損分局。7.2 原子域與第一范式原子域與第一范式n E-R模型允許實體集和聯(lián)系集的屬性具模型允許實體集和聯(lián)系集的屬性具有某種程度的子結(jié)構(gòu)。有某種程度的子結(jié)構(gòu)。n 例如圖例如圖6-25中的中的dependent _name這樣的這樣的多多值屬性和組合屬性值屬性和組合屬性(諸如具有子屬性(諸如具有子屬性street和和city的屬性的屬性address)。)。 n 當(dāng)我們從包含這種類型的屬性的當(dāng)我們從包含這種類型的屬性的E-R設(shè)計設(shè)計創(chuàng)建表的時候,我們要創(chuàng)建表的時候,我們要消除子結(jié)構(gòu)消除子結(jié)構(gòu)。7.2 原子域與第一范式原子域與第一范式n對于組合屬性,我們將

13、每個子屬性作為對于組合屬性,我們將每個子屬性作為它本身的一個屬性。它本身的一個屬性。n對于多值屬性,我們?yōu)槎嘀导现械拿繉τ诙嘀祵傩?,我們?yōu)槎嘀导现械拿總€項建立一個元組。個項建立一個元組。 7.2 原子域與第一范式原子域與第一范式n如果某個域的元素被認為是不可分的單元如果某個域的元素被認為是不可分的單元,那么這個,那么這個域就是原子域就是原子的。的。n如果一個如果一個關(guān)系模式關(guān)系模式R的所有屬性域都是原子的所有屬性域都是原子的的,我們稱關(guān)系模式,我們稱關(guān)系模式R屬于屬于第一范式第一范式(first normal form,1NF)。7.2 原子域與第一范式原子域與第一范式n 組合屬性也具有非

14、原子的域,比如一個包組合屬性也具有非原子的域,比如一個包含含street和和city兩個子屬性的兩個子屬性的address屬性。屬性。 n n例如一個機構(gòu),例如一個機構(gòu), 雇員標(biāo)識號:頭兩個字母雇員標(biāo)識號:頭兩個字母表明所屬部門,剩下的四位數(shù)字是該雇員表明所屬部門,剩下的四位數(shù)字是該雇員在該部門內(nèi)的唯一號碼。例如在該部門內(nèi)的唯一號碼。例如CS0012和和EE1127這樣的號碼。這樣的標(biāo)識號可以分這樣的號碼。這樣的標(biāo)識號可以分成一些更小的單元,因此是非原子的。成一些更小的單元,因此是非原子的。7.2 原子域與第一范式原子域與第一范式n 當(dāng)采用這種標(biāo)識號時,雇員所屬的部當(dāng)采用這種標(biāo)識號時,雇員所屬

15、的部門可以通過編碼解析標(biāo)識號得到。這么做門可以通過編碼解析標(biāo)識號得到。這么做需要需要額外編寫程序額外編寫程序,而且信息通過在應(yīng)用,而且信息通過在應(yīng)用程序中解析得到而不是從數(shù)據(jù)庫中得到。程序中解析得到而不是從數(shù)據(jù)庫中得到。如果標(biāo)識號是主碼,還會產(chǎn)生進一步的問如果標(biāo)識號是主碼,還會產(chǎn)生進一步的問題:當(dāng)雇員換了部門,他的標(biāo)識號所出現(xiàn)題:當(dāng)雇員換了部門,他的標(biāo)識號所出現(xiàn)過的地方都必須過的地方都必須修改修改 。n 7.2 原子域與第一范式原子域與第一范式n 有些非原子的值還是有用的,但使有些非原子的值還是有用的,但使用的時候要小心。用的時候要小心。n 例如,組合值屬性常常很有用,而且例如,組合值屬性常常

16、很有用,而且很多情況下以集合為值的屬性也是有用很多情況下以集合為值的屬性也是有用的,所以的,所以E-R模型里對這兩種值都支持模型里對這兩種值都支持7.2 原子域與第一范式原子域與第一范式n 在許多含有復(fù)雜結(jié)構(gòu)實體的領(lǐng)域中,在許多含有復(fù)雜結(jié)構(gòu)實體的領(lǐng)域中,強制使用第一范式會給程序員造成不必要強制使用第一范式會給程序員造成不必要的負擔(dān),他們必須編寫代碼把數(shù)據(jù)轉(zhuǎn)換成的負擔(dān),他們必須編寫代碼把數(shù)據(jù)轉(zhuǎn)換成原子的狀態(tài)。將數(shù)據(jù)從原子形態(tài)來回轉(zhuǎn)換原子的狀態(tài)。將數(shù)據(jù)從原子形態(tài)來回轉(zhuǎn)換也會有運行時的額外開銷。所以在這樣的也會有運行時的額外開銷。所以在這樣的域里支持非原子的值是很有用的。域里支持非原子的值是很有用的

17、。7.3 使用函數(shù)依賴的使用函數(shù)依賴的分解分解n 我們知道可以用形式化方法來判斷一個關(guān)系模式是否可以被分解。該方法該方法基于基于碼和函數(shù)依賴的概念。碼和函數(shù)依賴的概念。 7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n碼是能夠唯一標(biāo)識整條元組的屬性集,碼是能夠唯一標(biāo)識整條元組的屬性集,而而函數(shù)依函數(shù)依賴則允許我們表達唯一標(biāo)識某些屬性的值的約束賴則允許我們表達唯一標(biāo)識某些屬性的值的約束n 令令R是一個關(guān)系模式。是一個關(guān)系模式。R的子集的子集K是是R的超碼的條的超碼的條件是:如果對任意合法關(guān)系件是:如果對任意合法關(guān)系r(R)及及r中中任意任意兩個元兩個元組組t1和和t2總滿足,若總滿足,若t lt2,則,則

18、t1Kt2K。也就。也就是說,任意合法關(guān)系是說,任意合法關(guān)系r(R) 中不能有兩個元組在屬中不能有兩個元組在屬性集性集K上有相同值。上有相同值。 7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n函數(shù)依賴,是數(shù)據(jù)庫中要求關(guān)系滿足某些函數(shù)依賴,是數(shù)據(jù)庫中要求關(guān)系滿足某些性質(zhì)的約束。性質(zhì)的約束。 n n一個關(guān)系模式一個關(guān)系模式R,令,令aR且且R。模式。模式R上函數(shù)依賴上函數(shù)依賴a成立的條件是:如果對任成立的條件是:如果對任意合法關(guān)系意合法關(guān)系r(R)及及r中任意兩個元組中任意兩個元組t1和和t2,若若t1a=t2a,則,則t1=t2。 7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n如果如果KR,則,則K是是R的超碼

19、的超碼。n 函數(shù)依賴:函數(shù)依賴:不用超碼表示的約束不用超碼表示的約束。 n bor_loan=(customer_id, loan_number, amount)n該模式上函數(shù)依賴該模式上函數(shù)依賴loan_numberamount成立。成立。n屬性對(屬性對(customer_id, loan_number)組成一個超碼:)組成一個超碼:n customer_id,loan_numbercustomer_id,loan_number,amountn或者等價形式或者等價形式n customer_id,loan_numberbor_loan7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n兩種方式來使用函數(shù)依

20、賴:兩種方式來使用函數(shù)依賴:n 1用于用于判定關(guān)系是否在給定函效依賴集上合法判定關(guān)系是否在給定函效依賴集上合法n如果關(guān)系如果關(guān)系r在函數(shù)依賴集在函數(shù)依賴集F上合法,則稱上合法,則稱r滿足滿足Fn n 2用于用于定義合法關(guān)系集上的約束。定義合法關(guān)系集上的約束。n這樣我們就可以只考慮滿足給定函效依賴集的那這樣我們就可以只考慮滿足給定函效依賴集的那些關(guān)系。如果我們希望只考慮模式些關(guān)系。如果我們希望只考慮模式R上的滿足函上的滿足函數(shù)依賴集數(shù)依賴集F的關(guān)系,我們說的關(guān)系,我們說F在在R上成立上成立。 7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n關(guān)系關(guān)系r,看看它滿足什么函數(shù)依,看看它滿足什么函數(shù)依賴賴。nAC

21、是滿足的:有兩個元組在是滿足的:有兩個元組在A上的值為上的值為a1它們它們在在C上的值相等,均為上的值相等,均為c1。 n在在A上值為上值為a2的兩個元組在的兩個元組在c上有相同值上有相同值c2。此外。此外沒有其他不同元組在沒有其他不同元組在A上有相同值。上有相同值。7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n 在所有關(guān)系中都是滿足的在所有關(guān)系中都是滿足的函數(shù)依函數(shù)依賴賴稱為稱為平凡的平凡的( trivial) n n一般地,如果一般地,如果屬于屬于a,則形如,則形如a的函的函數(shù)依賴是平凡的。數(shù)依賴是平凡的。7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n 我們需要認識到一個特定的關(guān)系可能在某個時我們需要認識

22、到一個特定的關(guān)系可能在某個時候滿足某些函數(shù)依賴,但是該關(guān)系的模式并不要候滿足某些函數(shù)依賴,但是該關(guān)系的模式并不要求這些函數(shù)依賴成立。求這些函數(shù)依賴成立。 n例如我們發(fā)現(xiàn)例如我們發(fā)現(xiàn)“customer_streetcustomer_city是滿足的。但是,在現(xiàn)實世界中,我們相信兩個是滿足的。但是,在現(xiàn)實世界中,我們相信兩個城市可以有具有相同名字的街道。因此,有時有城市可以有具有相同名字的街道。因此,有時有可能存在一個可能存在一個customer關(guān)系的實例,在其上不滿關(guān)系的實例,在其上不滿足足customer_streetcustomer_city。所似,我們。所似,我們不能將不能將ccustom

23、er_streetcustomer_city包含于包含于在在customer關(guān)系的模式上成立的函數(shù)依賴集中。關(guān)系的模式上成立的函數(shù)依賴集中。7.3.1 碼和函數(shù)依賴碼和函數(shù)依賴n給定在關(guān)系給定在關(guān)系r上成立的函數(shù)依賴集上成立的函數(shù)依賴集F,可能可以推,可能可以推導(dǎo)出某些其他的函數(shù)依賴也一定在該關(guān)系上成立導(dǎo)出某些其他的函數(shù)依賴也一定在該關(guān)系上成立。n例如,給定模式例如,給定模式r=(A,B,C),n如果函數(shù)依賴如果函數(shù)依賴A B和和B C在在r上成立,我們可上成立,我們可以推出函數(shù)依賴以推出函數(shù)依賴A C也一定在也一定在r上成立。上成立。n 使用使用F+符號來表示符號來表示F集合的閉包集合的閉包

24、(closure)。也就。也就是是從給定從給定F集合能夠推導(dǎo)出的所有函數(shù)依賴的集集合能夠推導(dǎo)出的所有函數(shù)依賴的集合合。顯然,。顯然,F(xiàn) +是是F的超集。的超集。7.3.2 BOYCE-CODD范式范式 n 我們能達到的較滿意的范式之一是我們能達到的較滿意的范式之一是Boyce-Codd范式范式(BCNF)n它消除了所有基于函數(shù)依賴方面的冗余。它消除了所有基于函數(shù)依賴方面的冗余。n具有函數(shù)依賴集具有函數(shù)依賴集F的關(guān)系模式的關(guān)系模式R屬于屬于BCNF的條件是,對所有的條件是,對所有F+中形如中形如a的函數(shù)依賴(的函數(shù)依賴(a屬于屬于R且且屬于屬于R)n下面至少有一個成立:下面至少有一個成立:n a

25、是是平凡的函數(shù)依賴平凡的函數(shù)依賴(即(即包含于包含于a)。)。n a是模式是模式R的一個的一個超碼超碼。n 如果構(gòu)成數(shù)據(jù)庫設(shè)計的關(guān)系模式集中的每個模式都屬于如果構(gòu)成數(shù)據(jù)庫設(shè)計的關(guān)系模式集中的每個模式都屬于BCNF,則該設(shè)計屬于,則該設(shè)計屬于BCNF。n 不屬于不屬于BCNF的例子:的例子:n模式模式bor_loan=(customer_id, loan_number, amount)n函數(shù)依賴函數(shù)依賴loan_number amount在在bor_loan上成立,但上成立,但是是loan_number并不是超碼并不是超碼 。n把把bor_loan分解為分解為borrower和和loan是一個更

26、好的設(shè)計。是一個更好的設(shè)計。模式模式borrower屬于屬于BCNF,因為其上沒有非平凡的函數(shù),因為其上沒有非平凡的函數(shù)依賴成立。依賴成立。n模式模式loan上有一個非平凡的函數(shù)依賴成立,上有一個非平凡的函數(shù)依賴成立,loan_number amount,但是,但是loan _number是是loan的超的超碼(主碼)。因此,碼(主碼)。因此,loan也屬于也屬于BCNF。 n分解不屬于分解不屬于BCNF的模式的一般規(guī)則:的模式的一般規(guī)則:n設(shè)設(shè)R為不屬于為不屬于BCNF的一個模式。的一個模式。則至少有一個非平則至少有一個非平凡的函數(shù)依賴凡的函數(shù)依賴a,且且a不是不是R的超碼的超碼。我們在設(shè)計

27、。我們在設(shè)計中用以下兩個模式取代中用以下兩個模式取代R:n在這個例子中有在這個例子中有-a= 。n 當(dāng)我們分解不屬于當(dāng)我們分解不屬于BCNF的模式時,可能會產(chǎn)生一的模式時,可能會產(chǎn)生一個或多個不屬于個或多個不屬于BCNF的結(jié)果模式。此時進一步的分的結(jié)果模式。此時進一步的分解,直至最后產(chǎn)生的結(jié)果是一個解,直至最后產(chǎn)生的結(jié)果是一個BCNF模式的集合。模式的集合。 7.3.3 BCNF和保持依賴和保持依賴 n 我們已經(jīng)看到多種表達數(shù)據(jù)庫一致性約束我們已經(jīng)看到多種表達數(shù)據(jù)庫一致性約束的方式:的方式:主碼約束,函數(shù)依賴,主碼約束,函數(shù)依賴,check約束,約束,斷言和斷言和 觸發(fā)器觸發(fā)器n 在每次數(shù)據(jù)庫

28、更新的時候在每次數(shù)據(jù)庫更新的時候檢驗這些約束的檢驗這些約束的開銷很大開銷很大,因此,將數(shù)據(jù)庫設(shè)計得能夠高效,因此,將數(shù)據(jù)庫設(shè)計得能夠高效檢測約束是很有用的。特別地,如果在檢驗檢測約束是很有用的。特別地,如果在檢驗函數(shù)依賴的時候僅僅需要考慮一個關(guān)系,那函數(shù)依賴的時候僅僅需要考慮一個關(guān)系,那么檢測這種約束的開銷就很低。么檢測這種約束的開銷就很低。n 假定對銀行企業(yè)的操作做相當(dāng)小的改動。在圖假定對銀行企業(yè)的操作做相當(dāng)小的改動。在圖6-25的設(shè)計中,一位客戶只能有一個雇員作為他的的設(shè)計中,一位客戶只能有一個雇員作為他的“私私人助理人助理”.它對應(yīng)于從它對應(yīng)于從customer到到employee的多對

29、一的多對一的聯(lián)系集的聯(lián)系集cust_banker。我們要做的。我們要做的“小小”改動是一改動是一個客戶可以有多于一個的私人助理,但是在每個分個客戶可以有多于一個的私人助理,但是在每個分行中最多只有一個。行中最多只有一個。n 為了實現(xiàn)這個改動,我們可以在為了實現(xiàn)這個改動,我們可以在E-R設(shè)計中把聯(lián)系設(shè)計中把聯(lián)系集集cust_banker改為多對多的,并且添加一個新的聯(lián)改為多對多的,并且添加一個新的聯(lián)系集系集works _in,它在,它在employee和和branch之間,是表之間,是表明雇員在分行工作中的(雇員明雇員在分行工作中的(雇員分行)對。我們使分行)對。我們使works_in是多對一的

30、,一個分行可以有多個雇員,是多對一的,一個分行可以有多個雇員,而一名雇員只能工作于一家分行。而一名雇員只能工作于一家分行。n該設(shè)計中有一個缺陷。它允許一位客戶有兩個(或該設(shè)計中有一個缺陷。它允許一位客戶有兩個(或更多)在同一家分行工作的私人助理,這是銀行所更多)在同一家分行工作的私人助理,這是銀行所不允許的。不允許的。n理想的情況是,我們參照單個聯(lián)系集就能執(zhí)行該約理想的情況是,我們參照單個聯(lián)系集就能執(zhí)行該約束。束。n我們用另一種方式來改變我們用另一種方式來改變E-R設(shè)計。我們不添加聯(lián)設(shè)計。我們不添加聯(lián)系集系集works_in,而是把聯(lián)系集,而是把聯(lián)系集cust_banker用一個三用一個三元聯(lián)

31、系元聯(lián)系cust _banker _branch取代,該三元聯(lián)系集涉取代,該三元聯(lián)系集涉及實體集及實體集customer, employee和和branch,并且從,并且從customer、employee對到對到branch是多對一的,如圖是多對一的,如圖7-7所示。由于該設(shè)計允許單個聯(lián)系集來表達約束,所示。由于該設(shè)計允許單個聯(lián)系集來表達約束,所以它比我們先前考慮的第一個方法有顯著的優(yōu)勢所以它比我們先前考慮的第一個方法有顯著的優(yōu)勢。 但是,比較這兩種方法的優(yōu)劣并不那么清楚。但是,比較這兩種方法的優(yōu)劣并不那么清楚。ncust_banker _branch導(dǎo)出的模式為導(dǎo)出的模式為cust_ban

32、ker_branch=(customer_id,employee_id,branch_name,type) n由于一位雇員只能在一個支行工作,我們知道在由于一位雇員只能在一個支行工作,我們知道在cust_banker _branch模式上的關(guān)系中每個模式上的關(guān)系中每個employee_id只能有一個只能有一個branch _name的值與之關(guān)聯(lián);即:的值與之關(guān)聯(lián);即:employee_idbranch_namen但是,每次一名雇員參與一個但是,每次一名雇員參與一個cust _banker_branch聯(lián)系聯(lián)系的時候,我們都不得不重復(fù)一次分行的時候,我們都不得不重復(fù)一次分行 的名稱。我們看的名稱

33、。我們看到到cust_banker_branrh不屬于不屬于BCNF因為因為employee_id不是超碼。根據(jù)我們的不是超碼。根據(jù)我們的 BCNF分解規(guī)則,我們得到分解規(guī)則,我們得到n(customer_id, employee_id, type)n(employee_id, branch_name) n 該設(shè)計與我們使用聯(lián)系集該設(shè)計與我們使用聯(lián)系集works_in的第一的第一種方法完全一樣,同樣也使得執(zhí)行一位客戶種方法完全一樣,同樣也使得執(zhí)行一位客戶在一家分行最多只能有一個私人助理的約束在一家分行最多只能有一個私人助理的約束很困難。我們可以用函數(shù)依賴的方式表達該很困難。我們可以用函數(shù)依賴的

34、方式表達該約束:約束:ncustomer_id, branch_name employee_idn 在我們的在我們的BCNF設(shè)計中,沒有一個設(shè)計中,沒有一個模式包含了該函數(shù)依賴中出現(xiàn)的所有屬模式包含了該函數(shù)依賴中出現(xiàn)的所有屬性。由于我們的設(shè)計使得實現(xiàn)該函數(shù)依性。由于我們的設(shè)計使得實現(xiàn)該函數(shù)依賴的計算困難,所以我們稱該設(shè)計不是賴的計算困難,所以我們稱該設(shè)計不是保持依賴的。保持依賴的。n 由于保持依賴常常被認為是希望得由于保持依賴常常被認為是希望得到的,我們考慮另外一種范式,它比到的,我們考慮另外一種范式,它比BCNF寬松,允許我們保持依賴。該范寬松,允許我們保持依賴。該范式稱為第三范式式稱為第三

35、范式. 7.3.4 第三范式第三范式 n BCNF要求所有要求所有非平凡函數(shù)依賴是非平凡函數(shù)依賴是a的形式,其中的的形式,其中的a為超碼為超碼。n第三范式第三范式( third normal form,3NF)稍微放松了這個約束稍微放松了這個約束,允許非平凡函數(shù)依賴的左邊不是超碼。,允許非平凡函數(shù)依賴的左邊不是超碼。 n 具有函數(shù)依賴集具有函數(shù)依賴集F的關(guān)系模式的關(guān)系模式R屬于第三范式的條件是屬于第三范式的條件是 F+中形如中形如a的函數(shù)依賴(的函數(shù)依賴(a屬于屬于R且且屬于屬于R) ,至,至少有以下之一成立:少有以下之一成立:n a是一個平凡的函數(shù)依賴。是一個平凡的函數(shù)依賴。n a是是R的一

36、個超碼。的一個超碼。n -a中的每個屬性中的每個屬性A都包含在都包含在R的一個候選碼中的一個候選碼中na中的每個屬性中的每個屬性A也許包含在不同的候選也許包含在不同的候選碼中碼中n 注意到滿足注意到滿足BCNF的關(guān)系模式也一定滿足的關(guān)系模式也一定滿足3NF,所以,所以BCNF是比是比3NF更嚴格的范式。更嚴格的范式。n現(xiàn)在我們再次考慮現(xiàn)在我們再次考慮cust _banker _branch以及導(dǎo)致以及導(dǎo)致該模式不屬于該模式不屬于BCNF的函數(shù)依賴的函數(shù)依賴n employee_idbranch_namen注意到這里注意到這里a=employee_id,= branch _name,而且而且-a

37、=branch _name.由于由于branch _name包含包含在候選碼中,因此在候選碼中,因此cust_banker _branch屬于屬于3NF.n除了下列函數(shù)依賴成立之外,除了下列函數(shù)依賴成立之外,n employee_idbranch_namen customer_id,branch_nameemployee_idn由于(由于(customer_id,employee_id)是主碼,函數(shù)依賴)是主碼,函數(shù)依賴 customer_id,employee_idcust_banker_branch成立成立.n這說明(這說明(customer_id,branch_name )是一個超碼)是

38、一個超碼n屬性集(屬性集(customer_id,branch_name)是一個候選碼)是一個候選碼n由于該候選碼包含由于該候選碼包含branch_name,函數(shù)依賴,函數(shù)依賴employee_idbranch_name并沒有違反并沒有違反3NF的規(guī)則。的規(guī)則。 7.3.5 更高的范式更高的范式 n在某些情況下,使用在某些情況下,使用函數(shù)依賴分解模式函數(shù)依賴分解模式可能不足以避免可能不足以避免不必要的信息重復(fù)??紤]在實體集不必要的信息重復(fù)??紤]在實體集employee定義上的小定義上的小變化,其中我們允許雇員有多個電話號碼,某些電話號變化,其中我們允許雇員有多個電話號碼,某些電話號碼可以被多個

39、雇員共享。則碼可以被多個雇員共享。則telephone_number可以是一可以是一個多值屬性,并且根據(jù)我們從個多值屬性,并且根據(jù)我們從E-R設(shè)計生成模式的規(guī)則設(shè)計生成模式的規(guī)則,我們會有兩個模式,每個模式代表一個多值屬性,我們會有兩個模式,每個模式代表一個多值屬性telephone_number和和dnamen(employee_id,dname)n(employee_id, telephone_number)n如果我們合并這兩個模式,得到如果我們合并這兩個模式,得到n (employee_id, dname, telephone_number)n結(jié)果模式屬于結(jié)果模式屬于BCNF 7.3.5

40、 更高的范式更高的范式 n結(jié)果模式屬于結(jié)果模式屬于BCNF,因此我捫可能認為這樣的合并是個好主意,因此我捫可能認為這樣的合并是個好主意。但是,當(dāng)我們考慮一個有兩個親屬和兩個電話號碼的雇員的例。但是,當(dāng)我們考慮一個有兩個親屬和兩個電話號碼的雇員的例子時,我們會發(fā)現(xiàn)這樣的合并是一個壞主意。子時,我們會發(fā)現(xiàn)這樣的合并是一個壞主意。n例如,設(shè)例如,設(shè)employee_id為為999-99-9999的雇員有兩個分別名為的雇員有兩個分別名為“David”和和“William的親屬,以及有兩個電話號碼的親屬,以及有兩個電話號碼512-555-1234和和512-55543210在合并的模式中,我們必須為每個

41、親屬重復(fù)一次在合并的模式中,我們必須為每個親屬重復(fù)一次電話號碼:電話號碼:n(999-99-9999, David, 512-555-1234)n(999-99-9999, David, 512-555-4321)n(999-99-9999, William, 512-555-1234)n(999-99-9999, William 512-555-4321)n 如果我們沒有重復(fù)電話號碼,只存儲第一個和最后一個元組,如果我們沒有重復(fù)電話號碼,只存儲第一個和最后一個元組,我們確實記錄了親屬名字和電話號碼。我們確實記錄了親屬名字和電話號碼。 這是不正確的。這是不正確的。n 由于基于函數(shù)依賴的范式并不

42、足以處理這樣的情況,人們定義由于基于函數(shù)依賴的范式并不足以處理這樣的情況,人們定義了其他依賴和范式。我們將在了其他依賴和范式。我們將在7.6節(jié)和節(jié)和7.7節(jié)講述。節(jié)講述。7.4 函數(shù)依賴理論函數(shù)依賴理論n 在例子中我們已經(jīng)看到,作為檢查在例子中我們已經(jīng)看到,作為檢查模式是否屬于模式是否屬于BCNF或或3NF這一處理過這一處理過程的一部分,能夠?qū)瘮?shù)依賴進行系統(tǒng)程的一部分,能夠?qū)瘮?shù)依賴進行系統(tǒng)地推理是很有用的。地推理是很有用的。 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n只考慮給定的函數(shù)依賴集是不夠的,我們需要考只考慮給定的函數(shù)依賴集是不夠的,我們需要考慮慮模式上成立的所有函數(shù)依賴模式上

43、成立的所有函數(shù)依賴。 n給定函數(shù)依賴集給定函數(shù)依賴集F,可以證明其他的某些函數(shù)依賴,可以證明其他的某些函數(shù)依賴也成立。我們稱這些函數(shù)依賴被也成立。我們稱這些函數(shù)依賴被F“邏輯蘊涵邏輯蘊涵”。n從一些已知的函數(shù)依賴去判斷另外一些函數(shù)依賴從一些已知的函數(shù)依賴去判斷另外一些函數(shù)依賴是否成立。例如,如果是否成立。例如,如果AB和和BC在某個關(guān)系中在某個關(guān)系中成立,記成立,記F= AB,BC,那么,那么AC在該關(guān)系在該關(guān)系中是否成立的問題稱為邏輯蘊涵問題,若中是否成立的問題稱為邏輯蘊涵問題,若AC成成立,則說立,則說F邏輯蘊涵邏輯蘊涵AC 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n假設(shè)給定關(guān)系模式

44、尺假設(shè)給定關(guān)系模式尺=(ABC,G,H,J)及函數(shù)依及函數(shù)依賴集賴集n AB, AC, GGH, CGJ,BHn則函數(shù)依賴則函數(shù)依賴 AH被邏輯蘊涵。被邏輯蘊涵。 n假設(shè)有元組假設(shè)有元組t l及及t2,滿足,滿足t1A=t2An由于已知由于已知AB,由函數(shù)依賴的定義可以推出,由函數(shù)依賴的定義可以推出n t1B=t2Bn又由于已知又由于已知B H,由函數(shù)依賴的定義可以推出,由函數(shù)依賴的定義可以推出n t1H=t2Hn因此,我們已證明,對任意兩個元組因此,我們已證明,對任意兩個元組tl及及t2,只要,只要t1A=t2A,均有,均有t1H=t2H.而這正是而這正是AH的定義。的定義。 7.4.1 函

45、數(shù)依賴集的閉包函數(shù)依賴集的閉包 n令令F為一個函數(shù)依賴集。為一個函數(shù)依賴集。nF的閉包的閉包是指是指F邏輯蘊涵的所有函數(shù)依邏輯蘊涵的所有函數(shù)依賴的集合,記作賴的集合,記作F+n我們可以由函數(shù)依賴的形式化定義直接我們可以由函數(shù)依賴的形式化定義直接計算計算F+。如果。如果F很大,則這個過程將會很大,則這個過程將會很長而且很難。很長而且很難。 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n 公理公理( axiom)或稱推理規(guī)則,提供了一種用于推理函數(shù)或稱推理規(guī)則,提供了一種用于推理函數(shù)依賴的更為簡單的技術(shù)。依賴的更為簡單的技術(shù)。n下面的規(guī)則中,我們用希臘字母(下面的規(guī)則中,我們用希臘字母(a, ,

46、)表示屬性)表示屬性集,用字母表中從開頭起的大寫羅馬字母表示單個屬性集,用字母表中從開頭起的大寫羅馬字母表示單個屬性。我們用。我們用a表示表示aU 。n 我們可以使用以下三條規(guī)則去尋找那些邏輯蘊涵的函我們可以使用以下三條規(guī)則去尋找那些邏輯蘊涵的函數(shù)依賴。通過反復(fù)應(yīng)用這些規(guī)則,我們可以找出給定數(shù)依賴。通過反復(fù)應(yīng)用這些規(guī)則,我們可以找出給定F的的F+。這組規(guī)則稱為。這組規(guī)則稱為Armstrong公理,以紀念首次提出公理,以紀念首次提出這一公理的人。這一公理的人。 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n Armstrong公理是正確有效的,因為它們不會產(chǎn)生錯誤公理是正確有效的,因為它們不會

47、產(chǎn)生錯誤的函數(shù)依賴。這些規(guī)則是完備的的函數(shù)依賴。這些規(guī)則是完備的(complete)對一個給對一個給定函數(shù)依賴集定函數(shù)依賴集F,它們能產(chǎn)生整個,它們能產(chǎn)生整個F+n 盡管盡管Armstrong公理是完備的,直接用它們計算公理是完備的,直接用它們計算F+會會很麻煩。很麻煩。n為為 簡化,我們列出其他規(guī)則??梢杂煤喕?,我們列出其他規(guī)則??梢杂肁rmstrong公理證公理證明這些規(guī)則是正確的明這些規(guī)則是正確的 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n 對模式對模式R=(A,B,C,G,H,I)的例子及的例子及F函數(shù)依較集函數(shù)依較集AB,AC,CGHCGIB H使用這些規(guī)則。這里我們列出使用這

48、些規(guī)則。這里我們列出F+中的幾個依賴:中的幾個依賴:n AH.由于有由于有AB且且BH我們使用我們使用傳遞律傳遞律。 n CGHI。由于有。由于有CGH且且CGI,由,由合并律合并律可推出可推出CG HI。n AGI。由于有。由于有AC且且CGI由由偽傳遞律偽傳遞律可推出可推出AGIn AGI的另一種推理:在的另一種推理:在AC上使用上使用增補律增補律可以推出可以推出AGCG。又由于又由于CGI,由,由傳遞率傳遞率可推出可推出AGI 7.4.1 函數(shù)依賴集的閉包函數(shù)依賴集的閉包 n 圖7-8給出了一個形式化地示范如何使用Annstrong公理計算F+的過程。在這個過程中,當(dāng)往F+里加入一個函數(shù)

49、依賴時,它可能已經(jīng)在F+里了,這時F+沒有變化。n我們將在7.4.2節(jié)看到另一種計算F+的算法。 7.4.2 屬性集的閉包屬性集的閉包 n如果有aB,我們稱屬性B被a函數(shù)確定(functional determined)。n要判定一個集合a是否為超碼,我們必須設(shè)計一個計算由a函數(shù)確定的屬性集的算法。n一種方法是計算F+找出所有左半部是a的函數(shù)依賴,并且合并這些函數(shù)依賴的右半部。但是,這么開銷很大,因為F+可能很大。 7.4.2 屬性集的閉包屬性集的閉包 n 令a為一屬性集。我們稱在函數(shù)依賴集F下由a函數(shù)確定的所有屬性的集合為F下a的閉包,記為a+.n圖7-9是以偽碼書寫的計算a+的算法。該算法

50、的輸入是函數(shù)依賴集F和屬性集a,輸出存儲在變量result中.n 7.4.2 屬性集的閉包屬性集的閉包 n為解釋該算法如何進行,我們將使用它計算7.4.1節(jié)中定義的函數(shù)依賴集下的(AG)+.開始時result=AG.在第一次執(zhí)行while循環(huán)測試各個函數(shù)依賴時,我們發(fā)現(xiàn)n 由AB于是B加入resultn這是因為,AB屬于F,A屬于result(即AG),于是 result:=result U Bn 由ACresult變?yōu)锳BCGn 由CGHresult變?yōu)锳BCGHn 由CGI,result變?yōu)锳BCGHIn 在第二次執(zhí)行while循環(huán)時,result中未如入新屬性,算法終止。 7.4.2 屬

51、性集的閉包屬性集的閉包 n屬性集閉包的算法有多種用途:n 判定a是否為超碼,計算a+,看a+是否包含了R中的所有屬性。n 通過檢驗是否屬于a+,我們可以驗證函數(shù)依賴a是否成立(是否在F+里)也就是說,我們用屬性閉包計算a+,看它是否包含。n 該算法給了我們另一種計算F+的方法:對任意的屬于R,我們找出閉包 +;對任意的S屬于+,我們輸出一個函數(shù)依賴S 7.4.3 正則覆蓋正則覆蓋n 假設(shè)我們在一個關(guān)系模式上有一個函數(shù)依賴集F,無論何時用戶在該關(guān)系上執(zhí)行更新,數(shù)據(jù)庫系統(tǒng)都要保證此操作不會破壞任何一個函數(shù)依賴,也就是說,F(xiàn)中所有函數(shù)依賴在新數(shù)據(jù)庫狀態(tài)下仍然滿足。n 如果更新操作破壞了F上的任一個函

52、數(shù)依賴,系統(tǒng)必須回滾該更新操作。 7.4.3 正則覆蓋正則覆蓋n 我們可以通過測試與給定函數(shù)依賴集有相同閉包的簡化集的方式來降低檢測的開銷n由于這兩個集合的閉包相同,所以滿足簡化后的函數(shù)依賴集的數(shù)據(jù)庫也一定滿足原依賴集。 7.4.3 正則覆蓋正則覆蓋n如果去除一個函數(shù)依賴中的屬性不會改變該函數(shù)依賴集的閉包,則稱該屬性是無關(guān)的。n無關(guān)屬性(extraneous attribute)的形式定義如下:考慮函數(shù)依賴集F及F中函數(shù)依賴abn 如果Aa并且F邏輯蘊涵(F-ab)U(a-A) b,則屬性A在a中是無關(guān)的。n 如果Ab并且函數(shù)依賴集(F-ab)Ua(b-A) 邏輯蘊涵F,則屬性A在b中是無關(guān)的

53、. 7.4.3 正則覆蓋正則覆蓋n例,假定在F上有函數(shù)依賴ABC和AC,那么B在ABC是無關(guān)的n假定在F上有函數(shù)依賴ABCD和AC那么C在ABCD的右半部是無關(guān)的。n 使用無關(guān)屬性的定義時注意蘊涵的方向:如果將左部與右部交換,蘊涵關(guān)系將總是成立的。n也就是說,(F-ab)U(a-A) b總是邏輯蘊涵F,同時F也總是邏輯蘊涵(F-ab)Ua(b-A) 7.4.3 正則覆蓋正則覆蓋n下面是如何有效檢驗一個屬性是否無關(guān)。n令R為一關(guān)系模式F是在R上成立的給定函數(shù)依賴集。考慮依賴ab上的屬性A.n 如果A b ,為了檢驗A是否是無關(guān)的,考慮下面的集合F=(F- ab)Ua (b-A)n并檢驗aA是否能

54、夠由F推出。為此,應(yīng)該計算F下的a+(a的閉包);如果a+包含A,則A在b中是無關(guān)的;n 如果Aa,為了檢驗A是否是無關(guān)的,令r=a-A,并且檢查rb是否可以由F推出.為此,計算在F下r+(r的閉包);如果r+包含b的所有屬性,則A在a上是無關(guān)的。 7.4.3 正則覆蓋正則覆蓋n例如,假定F包含ABCD,AE和EC。為檢驗C在ABCD上是否是無關(guān)的, 我們計算F= ABD,AE, EC下AB的屬性閉包:閉包為ABCDE,包含CD,所以我們推斷出C是無關(guān)的。n F的正則覆蓋(canonical cover) Fc是一個依賴集,使得F邏輯蘊涵Fc中的所有依賴,并且Fc邏輯蘊涵F中的所有依賴。 7.

55、4.3 正則覆蓋正則覆蓋n此外此外Fc必須具有如下性質(zhì)必須具有如下性質(zhì):n Fc中任何函數(shù)依賴都不含無關(guān)屬性:n Fc中函數(shù)依賴的左半部都是唯一的.即F c中不存在兩個依賴a1b1和a2b2,滿足a1=a2。n當(dāng)檢驗一個屬性是否是無關(guān)的時需要重視的一點是,我們在檢驗時用的是Fc當(dāng)前值中的函數(shù)依賴,而不是F中的函數(shù)依賴。n如果一個函數(shù)依賴的右半部只包含一個屬性,側(cè)如AC,并且這個屬性是無關(guān)的,那么我們將得到一個右半部為空的函數(shù)依賴,這樣的函數(shù)依賴應(yīng)該刪除。 7.4.3 正則覆蓋正則覆蓋n F的正則覆蓋的正則覆蓋Fc具有與具有與F相同的閉包相同的閉包;因;因此,驗證是否滿足此,驗證是否滿足Fc等價

56、于驗證是否滿足等價于驗證是否滿足F。n從某種意義上說,從某種意義上說,F(xiàn)c是是最小最小的的它不含無關(guān)它不含無關(guān)屬性,并且具有屬性,并且具有相同左半部的函數(shù)依賴相同左半部的函數(shù)依賴都已都已被合并。所以驗證被合并。所以驗證Fc比驗證比驗證F本身更容易。本身更容易。n考慮模式(A,B,C)上的如下函數(shù)依賴集F:計算F的正則覆蓋n ABC, BC, AB, ABCn 有兩個函數(shù)依賴的箭頭左邊有相同的屬性集:n ABC, AB, 我們將它們合并成A BCn A在ABC中是無關(guān)的,因為F邏輯蘊涵(F-ABC)U lBC這個斷言為真n C在A BC中是無關(guān)的,因為ABC被AB和BC邏輯蘊涵。n于是,正則覆蓋

57、為n AB, BC 7.4.4 無損分解無損分解n令R為一關(guān)系模式,F(xiàn)為R上函數(shù)依賴集。令R1和R2為R的分解。令r(R)是模式R上的一個關(guān)系,如果對于所有的合法數(shù)據(jù)庫實例(即滿足指定的函數(shù)依賴和其他約束的數(shù)據(jù)庫實例)都有n我們稱該分解是無損分解分解是無損分解(lossless decomposition)。n換句話說,如果我們把r投影至R1和R2上,然后計算投影結(jié)果的自然連接,我們?nèi)匀坏玫揭荒R粯拥膔n不是無損分解的分解稱為有損分解(lossy decomposition) 7.4.4 無損分解無損分解n我們可以用函數(shù)依賴來說明什么情況下分解是無損的。n令R,R1,R2和F如上所述。如果以下

58、函數(shù)依賴中至少有一個屬于F+, 則R1和R2是R的無損分解。n R1R2R1n R1 R2R2 n 換句話說,如果Rl R2是R1或R2的超碼,R上的分解就是無損分解。n我們可以用屬性閉包的方法來有效地檢驗超碼。 7.4.4 無損分解無損分解n為舉例說明,考慮模式n bor_loan =(customer_id, loan_number, amount)n我們在7.1.2節(jié)中將其分解為n borrower =(customer_id,loan_number)n loan=(loan_number, amount)n這里有borrowerloan=loan _number以及l(fā)oan_numbe

59、ramount,滿足無損分解條件。 7.4.4 無損分解無損分解n通常情況下,一個模式一次性被分解成多個模式,判定無損分解就更復(fù)雜了。n n雖然對二元分解的測試顯然是無損連接的一個充分條件,但只有當(dāng)所有約束都是函數(shù)依賴時它才是必要條件。后面我們將看到幾種其他類型的約束(特別是在7.61節(jié)中討論的稱為多值依賴的一種約束類型),它們在即使不存在函數(shù)依賴的情況下仍可保證一個分解是無損連接的。 7.4.5 保持依賴保持依賴n 令F為模式R上的函數(shù)依賴集,Rl,R2,Rn為R的分解。F在Ri上的限定是F+中所有只包含Ri中屬性的函數(shù)依賴的集合Fi。n由于一個限定中的所有函數(shù)依賴只涉及一個關(guān)系模式的屬性,

60、判定這種依賴是否滿足可以只檢查一個關(guān)系。 7.4.5 保持依賴保持依賴n 限定F1,F(xiàn)2,Fn的集合是能被有效檢查的依賴集。n 令F= F1U F2U-U Fn. nF是模式R上的函數(shù)依賴集,不過通常FF.如果F+=F+,則F中的所有依賴都被F邏輯蘊涵,并且如果我們證明F是被滿足的,則F也被滿足。我們稱具有性質(zhì)F+=F+的分解為保持保持依賴的分解依賴的分解(dependency preserving decomposition) 7.4.5 保持依賴保持依賴n 圖7-11給出判定保持依賴性的算法。輸入是分解了的關(guān)系模式集D=R1,R2,Rn和函數(shù)依賴集F。因為要計算F+,所以這個算法的開銷很大

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論