關係模式設計優化(數據庫學習重點,難點)

關係模型潛在的問題
1.添加異常(當在關係中添加數據時可能會導致數據的不一致)
2.修改異常(隨意的修改關係中的一行記錄也可能導致數據的不一致)
3.刪除異常(當刪除一定數量的記錄時可能會導致一些其他信息的丟失)
4.數據冗餘(主要是關係中存在了相互之間的約束依賴,使得某一屬性的值確定後,另一個屬性的值也就確定了)
壞關係
當關系中存在約束,特別是函數依賴,導致冗餘,異常等發生就是一個壞關係,如果存在這些問題就需要對關係模式進行優化,而主要的優化技術就是“模式分解”。

第一範式 第二範式 第三範式 BCNF範式–詳解連接

函數依賴

函數依賴 (FD):可形式化表示爲:X→Y,其中X和Y是屬性集(讀爲:X決定Y或者Y依賴於X)。即關係R中給定兩個元組,如果X屬性值相等,則Y的值也必須相等。

函數依賴的作用:函數依賴起到檢測冗餘是否存在的作用,通過冗餘的檢測,就能很容易判斷出這個關係是不是存在相應的插入,刪除,更新異常。

函數依賴集(F):由關係上一些函數依賴組成的集合叫函數依賴集

函數依賴集的閉包(F+):由函數依賴集F所蘊含的所有函數依賴的集合

函數依賴和關係的鍵給定關係R(A,B,C),A→ABC表示A屬性決定了R的所有屬性,A決定了R,X→R意味着X是一個超鍵。
超碼、候選碼、主碼 與 外碼

不管是判斷關係的好壞還是範式的分解都離不開函數依賴,Armstrong公理能夠幫助我們從一個給定的函數依賴集推導出它所蘊含的所有的函數依賴。

Armstrong公理(X,Y,Z是屬性集)
自反律:若 α爲一屬性集且 β ⊆ α,則 α→β成立。(比如CD→C,CD→D)
增補律:若α→β成立且γ爲一屬性集,則γα→γβ成立。
傳遞律:若α→β和 β→γ成立,則 α→γ成立。
Armstrong公理的重要推論
合併律:若 α→β和 α→γ成立,則α→βγ成立。
分解律:若 α→β成立,則α→β 和α→γ成立。
僞傳遞律:若α→β和 γβ→δ成立,αγ→δ則成立。
使用Armstrong公理計算F+
在這裏插入圖片描述

屬性集閉包

屬性集閉包定義
令α爲一個屬性集。我們將函數依賴集 F 下被α函數確定的所有屬性的集合,稱爲 F 下α的 閉包,記爲α+。
屬性集閉包的求解
求 A+:將 A 置入 A+。對每一 FD,若左部屬於 A+,則將右部置入 A+,一直重複至 A+不能擴大。
在這裏插入圖片描述
屬性集閉包的作用
1.判斷α是否爲超鍵(即α決定R中的所有屬性):計算α+,檢查α+是否包含R 中的所有屬性。
2.判斷函數依賴α→β是否成立:檢查是否有β⊆α+ 。
3.計算函數依賴集的閉包F+:對任意γ⊆ R,找出其屬性閉包γ+,對任意的S⊆γ+,輸出一個函數依賴γ→S。

通過屬性集閉包求函數依賴集F+的例子
已知 F={A→B, B→C },求 F+
第一步:構建一個空的二維表,行和列分別列處所有可能的屬性組合
在這裏插入圖片描述
第二步:計算所有屬性組合的屬性集閉包
已A+爲例:
已知 F={A→B, B→C },求 A+
A+ = A
考慮 A→B,A+ = AB
考慮 B→C,B 在 A+中,A+ = ABC
所以可求:A+= ABC ,同理可求
在這裏插入圖片描述
第三步:將包括在對應屬性閉包裏的屬性都勾選出來
在這裏插入圖片描述
任何一個勾都表示一個函數依賴,比如第一行第六列這個勾表示A→BC(A決定BC)的函數依賴,所有的函數依賴關係組成了函數依賴集的閉包。

模式分解

模式分解的基本標準
1.無損連接分解(如果將R分解爲R1和R2,應該滿足分解後的兩個關係實例能夠通過連接組合爲原來的關係,使信息不發生改變)
在這裏插入圖片描述
滿足條件:
若R分解爲R1和R2是無損分解,則下面至少一個成立的話,那麼分解就是無損分解:
R1∩R2→R1(函數依賴)
R1∩R2→R2(函數依賴)
實際上將R分解爲(UV)和(R-V),如果U→V在R上成立,那麼分解時無損連接分解。
2.保持函數依賴
保持函數依賴的分解(直觀上)就是R分解爲X,Y,Z,函數依賴集(FDs)F在X,Y,Z上成立,那麼FDs也會在R上成立。直觀上無法在分解後的單一關係上驗證原關係上的函數依賴,就表示無法保持函數依賴。

BCNF範式和第三範式

BCNF範式

對於R有函數依賴集F,如果R符合BCNF當且僅當每一個非平凡的FD滿足:
1.對於每一個非平凡函數依賴X→Y中,X是R的超鍵(即X能決定R中的所有屬性,所有非平凡函數依賴集F中的箭頭左邊是鍵)
2.函數依賴是平凡的(X→Y且Y是X的子集就是平凡函數依賴)

性質
如果R(A,B)只有兩個屬性,那麼它符合BCNF(因爲A,B的關係:1.AB之間沒有相互一個依賴的關係2.A決定B3.B決定A,第一種情況是平凡函數依賴,第二種A是主鍵,第三種B是主鍵,箭頭的左邊都是我們的鍵,所以只要關係是兩個屬性的必然滿足BCNF範式)

BCNF範式分解
當一個關係不符合BCNF:那麼分解它時考慮到關係R和函數依賴集F,如果F中的函數依賴X→A違背BCNF,那麼分解R爲R-A和XA,重複這個操作就可以得到一個符合BCNF的關係集合。
BCNF分解一定是保持無損連接分解,通常情況下有多個函數違背BCNF,那麼我們處理它們的順序不同會導致分解的結果不同,得到不同的都符合BCNF的關係集。BCNF範式分解是符合函數依賴的,但是可能不滿足保持函數依賴,有的也可能滿足保持函數依賴。
例題:
關係模式 R,有U={A,B,C,D,E,G},F={B→G,CE→B,C→A,CE→G,B→D,C→D}
1.候選鍵
因爲 B+ =(B,D,G);C+=(A,C,D);CE+=(A,B,C,D,E,G) 所以可知其候選碼爲 CE
2. 違反 BCNF 的函數依賴:C→A,B→G,B→D,C→D
3. 分解
1)R1={AC};F1={C→A}
R1’={BCDEG};F1’={B→G,CE→B,CE→G,B→D,C→D};不滿足 BCNF
2)R2={BG};F2={B→G} R2’={BCDE};F2’={CE→B,B→D,C→D};不滿足 BCNF
3)R3={BD};F3={B→D}R3’={BCE};F3’={CE→B};

滿足 BCNF 最終答案:R1={AC};R2={BG};R3={BD};R4={BCE};

3NF(三範式)

BCNF範式在有些情況是不能保持函數依賴的,而在更新上有效的檢查函數依賴是否違背是很重要的,在BCNF範式的基礎上將限制放鬆一點,從而讓分解後的關係保持函數依賴,定義一個弱的關係—3NF。

R符合BCNF,那麼R符合3NF,如果R符合3NF,可能存在一定的冗餘,它是分解和性能的一種折中。3NF中函數依賴是否保持可以在單獨的關係上檢查,而不需要進行連接計算,3NF一般是保持無損連接分解和保持函數依賴的。

函數依賴集F符合3NF,當且僅當F中每一個函數依賴X→A(X⊆R and A⊆R)
符合下列描述中的一個:
1.A⊆X(平凡的FD)
2.X是超鍵
3.A是R的鍵的一部分

3NF分解

首先第一步是要計算正則覆蓋Fc,然後將Fc中每一個函數依賴左右兩邊屬性組合爲一個新的關係Ri,再然後判斷Ri是否包括R的某個候選鍵,如果沒有包括,則將R的一個候選鍵屬性集單獨作爲一個新的關係,最後判斷一下所有的新關係是否有包含關係,如果有則合併。
例題1:
設有關係模式:R={A,B,C,G,H,I}
函數依賴集F={A→B A→C CG→H CG→I B→H},R如何“雙保持”分解爲一組3NF?(雙保持:無損分解,函數依賴)
第一步:求F的正則覆蓋(用合併律)
Fc={A→BC CG→HI B→H}
由於去掉任何屬性都和原來的F不等價,所以沒有多餘的屬性。
第二步:求R的3NF分解
A→BC R1=(A,B,C) F1={A→BC}
CG→HI R2=(CGHI) F2={CG→HI}
B→H R3={BH} F3={B→H}
第三步:確定是否添加R候選鍵做成的子模式
僅一個候選鍵AG
因爲:(AG)+=AGBCHI
而:A+=ABCH G+=G
因該候選鍵未包含在R1,R2,R3中,需要產生子模式R4=(AG) F4=Ø

例題2
關係cust_bancker_branch(customer_id,employee_id,branch_name,type)
函數依賴集爲
F={customer_id,employee_id->branch_name,type
employee_id->branch_name
customer_id,branch_name->employee_id}
首先計算函數依賴集的正則覆蓋Fc,branch_name是多餘的屬性
Fc={customer_id,employee_id->type
employee_id->branch_name
customer_id,branch_name->employee_id}
然後根據Fc生成3個子模式
R1={customer_id,employee_id,type}
R2={employee_id,branch_name}
R3={customer_id,branch_name,employee_id}
候選鍵customer_id,employee_id是候選鍵,並且包括在R1中,因此不需要添加新的關係模式
又因爲R3包括R2,因此刪除R2得到最終的關係分解結果:
R1={customer_id,employee_id,type}
R3={customer_id,branch_name,employee_id}
例題3
關係模式 R,有 U={A,B,C,D,E,G},F={B→G,CE→B,C→A,CE→G,B→D,C→D},求3NF分解
0.候選碼
因爲 B+=(B,D,G);C+=(A,C,D);CE+=(A,B,C,D,E,G)
所以可知其候選碼爲 CE
1.正則覆蓋
1)運用算法和定義,可以合併 B→G,B→D 爲 B→DG;合併
C→A,C→D 爲 C→AD;合併 CE→B,CE→G 爲 CE→BG。 得到函數依賴集 FC={B→DG,C→AD,CE→BG}
2) 消除無關屬性
驗證 G 是 CE→BG 的右方無關屬性
FC’={B→DG,C→AD,CE→B}, (CE)FC’+=(CEBDG),所以 FC’蘊含 FC 的 CE→BG,G 是 CE→BG 的右方無關屬性,可以消除 正則覆蓋 FC={B→DG,C→AD,CE→B}
2. 由FC={B→DG,C→AD,CE→B}可以分解 R1={BDG},F1={B→DG}
R2={ACD},F2={C→AD} R3={BCE},F3={CE→B}
3.檢查 候選鍵 CE 包含在 R3 中,不需要添加子模式,每個子模式之間無包含關係 最後答案:R1={BDG} ,R2={ACD},R3={BCE};

正則覆蓋

正則覆蓋的定義
函數依賴集F 的正則覆蓋 Fc,是 F 的最小函數依賴集,使得 F 與 Fc 相互蘊含。
正則覆蓋必須滿足的性質
1.Fc中任何函數依賴都不包含無關屬性
2.Fc 中函數依賴的左半邊都是唯一的
無關屬性的定義
如果去除函數依賴中的一個屬性,不改變該函數依賴集的閉包,則稱該屬性是無關的
無關屬性的形式化定義
設函數依賴集 F 中有α→β 
1.如果 A∈α並且 F 邏輯蘊含(F – {α→β})∪{(α- A) →β},則屬性 A 在α中是無關的。 
2.如果 A∈β並且函數依賴集( F - { α→β} )∪{ α→( β- A ) }邏輯蘊含 F,則屬性 A 在β中是無關的。(A邏輯蘊含B我感覺就是A能夠推導出B)

正則覆蓋計算過程
在這裏插入圖片描述
在這裏插入圖片描述
例題:
求 F={A→B,B→A,B→C,A→C,C→A},最小函數依賴集合Fc
1利用分解規則,將所有的函數依賴變成右邊都是單個屬性的函數依賴
從題目來看,F中的任何一個函數依賴的右部僅含有一個屬性{A→B,B→A,B→C,A→C,C→A}
2去掉F 中多餘的函數依賴
(即假設某個依賴冗餘,刪除該依賴後的函數依賴集中,在刪除的依賴關係箭頭左邊的屬性的閉包能夠包含箭頭右邊的屬性,說明冗餘則刪除,否則進行還原,最終得到的最小函數依賴集使用合併律進行合併得到正則覆蓋)
(1)設A→B冗餘
從F 中去掉A→B,則F1={B→A,B→C,A→C,C→A}。
根據F1 計算A+ =AC,但AC 不包含B,故A->B 不能從F中去掉。
(2)設B→A冗餘從F 中去掉B→A,則F2={A→B,B→C,A→C,C→A}。
根據F2 計算B+ =ABC,包含所有屬性,故B→A可從F中去掉。
(3)設B→C冗餘
從F 中去掉B→C,則F3={A→B,A→C,C→A}。
根據F3 計算B+= B,不包含C,故B→C不是冗餘的函數依賴,不能從F 中去掉。
(4)設A→C冗餘
從F 中去掉A→C,則F4={A→B,B→C,C→A}。
根據F4 計算A+ =ABC,包含所有屬性,故A→C可從F中去掉。
(5)設C→A冗餘
從F 中去掉C→A,則F5={A→B,B→C}。
根據F5 計算C+= C 不包含A,故C→A不是冗餘的函數依賴,不能從F 中去掉。
(6)至此
所有依賴均以驗算完畢,故
F 最小函數依賴集合爲:{A→B,B→C,C→A}

BCNF和3NF的比較
將一個關係分解爲符合3NF的關係集合:
1.分解是無損的
2.分解是保持函數依賴的
將一個關係分解爲符合BCNF的關係集合
1.分解是無損的
2.可能不保持函數依賴

總結

1.若分解無損分解爲BCNF,可能不能保存函數依賴,若爲保持函數依賴而不分解,可能存在數據冗餘現象,各有利弊,需因應用需求而定。數據庫優化的過程,一般是首先分解爲BCNF
,如果分解成BCNF,發現丟失了重要的函數依賴,則返回到3NF,如果某些多表連接查詢也非常重要,則返回到2NF甚至是1NF。
2.範式分解的方法
BCNF分解:
首先需要做的事情是分析關係的函數依賴集F中的函數依賴,找出不符合BCNF的函數依賴,將其箭頭左右兩端的屬性取出,組合成一個新的關係,而從關係R中除掉箭頭右端的屬性後剩餘的屬性組成另外一個關係,之後再分析這兩個關係是否符合BCNF,如果不符合需要進一步分解。
在這裏插入圖片描述
3NF分解
首先需要做的事情是找出關係的正則覆蓋Fc,然後將正則覆蓋的每一個函數依賴箭頭兩端的 屬性組合成新的關係,之後檢測關係R的候選鍵是否已經存在於新的關係中,如果沒有則將候選鍵作爲新的關係,最後審查一下所有關係,看是否有包含關係,有則合併。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章