# 資料庫模式設計如果不好會導致的問題: 1.冗餘 2.導致數據一致性出現問題 3.插入異常 4.更新異常 5.刪除異常 # 函數依賴 函數依賴是指一個或多個屬性的取值可以確定另一個屬性的取值。具體地說,如果一個關係模式R中屬性集合X的取值能唯一地確定屬性集合Y的取值,那麼我們稱屬性集合Y對於屬性集 ...
資料庫模式設計如果不好會導致的問題:
1.冗餘
2.導致數據一致性出現問題
3.插入異常
4.更新異常
5.刪除異常
函數依賴
函數依賴是指一個或多個屬性的取值可以確定另一個屬性的取值。具體地說,如果一個關係模式R中屬性集合X的取值能唯一地確定屬性集合Y的取值,那麼我們稱屬性集合Y對於屬性集合X具有函數依賴。這被表示為X → Y,其中X稱為函數依賴的左部,Y稱為右部。
例如,考慮一個包含學生信息的關係模式R,其中包含屬性集合{學生ID,姓名,年齡,所在班級,班級導師}。假設我們觀察到一個學生ID只對應一個姓名和年齡,那麼我們可以說“學生ID函數依賴於姓名和年齡”,表示為{學生ID} → {姓名,年齡}。
函數依賴在資料庫設計中非常重要,因為它們可以幫助我們識別重覆數據和設計表結構。如果我們正確地理解和應用函數依賴,就可以減少數據冗餘,提高數據完整性和一致性。
資料庫的鍵
在關係型資料庫中,鍵(key)是指一種特殊的屬性或屬性集合,用於唯一標識一個關係中的元組。鍵可以幫助我們在資料庫中快速準確地定位、訪問和修改數據。
關係資料庫中的鍵可以分為以下三種類型:
-
主鍵(Primary Key):主鍵是一個關係中的一個或多個屬性,用於唯一標識關係中的每個元組。主鍵具有以下特點:
- 主鍵的值在關係中必須是唯一的。
- 主鍵的值不能為空值(NULL)。
- 一個關係只能有一個主鍵。
-
外鍵(Foreign Key):外鍵是一個關係中的屬性,它引用了另一個關係的主鍵,用於建立兩個關係之間的關係。外鍵具有以下特點:
- 外鍵的值必須在另一個關係中存在,或者為空值(NULL)。
- 一個關係可以有多個外鍵。
-
候選鍵(Candidate Key):候選鍵是一個關係中的一個或多個屬性,它可以唯一標識關係中的每個元組,但不是主鍵。一個關係可以有多個候選鍵。而且不同候選鍵的元素個數可能不同!
-
超鍵(super key)是指可以唯一標識一個關係中的每個元組的屬性集合。換句話說,一個超鍵的值集合可以唯一確定關係中每個元組的值。超鍵可以包含關係中的所有屬性,也可以只包含部分屬性。超鍵不一定是最小的,也就是說,可能存在多個超鍵可以唯一標識關係中的每個元組。
鍵在資料庫中非常重要,因為它們可以幫助我們維護數據的完整性和一致性。通過使用鍵,我們可以確保每個元組都具有唯一的標識符,從而避免數據冗餘和不一致性。
尋找資料庫的鍵
函數依賴集合的閉包
定義:在關係資料庫中,函數集合的閉包是指一個函數集合中所有可能的函數依賴組合所得到的函數依賴集合。換句話說,函數集合的閉包包含了原函數集合中所有可能的函數依賴和派生函數依賴。通過尋找函數集合的閉包,我們可以瞭解關係模式中所有可能的函數依賴,從而更好地設計和優化關係模式。
以下是尋找函數集合的閉包的方法:
-
初始閉包:將原函數集合中的所有函數依賴加入到閉包中。
-
遞歸添加:對於閉包中的每個函數依賴,找到其右部屬性集合所能推導出的所有函數依賴,並將其添加到閉包中。
-
直到無法添加:重覆步驟2,直到閉包中沒有新的函數依賴可以添加為止。
函數依賴的規則包括以下幾條:
-
自反性規則:如果Y包含於X,則X → Y。
-
擴展性規則:如果X → Y,那麼XZ → YZ,其中Z是關係R中除X、Y之外的任意屬性集合。
-
傳遞性規則:如果X → Y,Y → Z,那麼X → Z。
這些規則可以用來推導出函數依賴的閉包。通過這些規則,我們可以確定關係模式中的主鍵、候選鍵和冗餘屬性,從而優化關係模式的設計和性能。
通過函數依賴的閉包求解鍵的辦法(暴力法):
-
確定關係中的屬性集合:首先,確定關係中的所有屬性集合,包括主屬性和非主屬性。
-
確定函數依賴集合:根據實際情況,確定關係中的所有可能函數依賴。一個函數依賴是指一個屬性集合能夠唯一確定另一個屬性集合。例如,如果屬性集合A能夠唯一確定屬性集合B,則稱為A → B。
-
計算函數依賴的閉包:通過使用函數依賴的自反性、擴展性和傳遞性規則,計算關係中所有可能的函數依賴。這將給出一個包含原函數依賴和派生函數依賴的函數依賴集合,即函數依賴的閉包。
-
確定候選鍵:對於關係中的每個屬性集合,檢查是否可以唯一確定每個元組。如果可以,則該屬性集合是一個候選鍵。如果有多個候選鍵,則需要確定一個主鍵。
-
檢查主鍵是否在函數依賴閉包中:檢查所選的主鍵是否在函數依賴閉包中。如果主鍵不在閉包中,則需要重新選擇一個候選鍵作為主鍵。
啟髮式演算法:
-
不在任何函數依賴右邊出現的屬性必然是鍵的一部分。
-
不在函數依賴左邊出現的屬性一定不是鍵的一部分
關係模式的分解
-
無損分解(Lossless Decomposition)
無損分解是指將一個大的關係模式拆分成多個小的關係模式,同時保持它們之間的函數依賴和信息完整性不變。這種分解方式的優點是可以提高資料庫的性能和可維護性,同時保持數據的完整性和一致性。無損分解的目標是保證原始關係模式中的所有函數依賴都能在新的小的關係模式中得到滿足,因此無損分解的結果仍然可以保持關係模式的完整性和一致性。
-
有損分解(Lossy Decomposition)
有損分解是指將一個大的關係模式拆分成多個小的關係模式,但不能保持它們之間的函數依賴和信息完整性不變。這種分解方式的優點是可以提高資料庫的性能和可維護性,同時減少數據的冗餘和複雜性。有損分解的目標是在滿足一定的性能需求的前提下,儘可能地減少數據冗餘和複雜性。有損分解的結果可能會導致數據的不一致性和丟失一些信息,因此需要謹慎選擇分解方式和對數據進行適當的處理。
需要註意的是,無損分解和有損分解都有其適用的場景和限制,具體的選擇需要根據實際需求和性能要求進行綜合考慮。在分解關係R時,我們希望分解能夠:
-
最小化冗餘
-
避免信息丟失
-
保留依賴關係(即約束條件)
-
確保查詢性能良好
-
如何將一個模式分解為多個模式
當我們要將一個關係模式拆分為符合第一範式的多個關係模式時,需要遵循以下規則:
-
確定主鍵:首先需要確定關係模式的主鍵,以確保每個元組都能唯一標識。主鍵可以由單個屬性或多個屬性組成。
-
消除重覆組:如果關係模式中存在重覆組,即有兩個或多個元組在所有屬性上的取值都相同,就需要將這些元組合併為一個元組。
-
拆分多值依賴:如果關係模式中存在多值依賴,即一個屬性依賴於主鍵的某個子集而不是整個主鍵,就需要將這些屬性拆分成新的關係模式,並與原來的關係模式建立外鍵關係。
-
拆分部分依賴:如果關係模式中存在部分依賴,即一個非主屬性依賴於主鍵的某個子集而不是整個主鍵,就需要將這些非主屬性與主鍵組成一個新的關係模式,併在新的關係模式中建立外鍵關係。
example
例如,假設我們有一個包含以下屬性的關係模式:
學生(學號,姓名,年齡,課程,成績)
在這個關係模式中,學號是主鍵,課程和成績是非主屬性。由於一個學生可以選修多門課程,課程和成績之間存在多值依賴關係。為了消除多值依賴,我們可以將課程和成績拆分成新的關係模式,並與原來的關係模式建立外鍵關係。這樣就可以得到以下兩個關係模式:
學生(學號,姓名,年齡)
選課(學號,課程,成績)
在新的關係模式中,每個關係模式都符合第一範式的要求,因為每個屬性都是單值屬性,不存在重覆組和多值依賴的問題。
關係模式的範式
在關係型資料庫中,範式(Normalization)是一種通過分解關係模式來減少數據冗餘、提高數據一致性和數據可維護性的技術。範式分為不同的級別,從第一範式(1NF)到第五範式(5NF),每個級別都有其特定的規則和限制。以下是各個範式的詳細說明:
-
第一範式(1NF)
第一範式要求一個關係模式中的每個屬性都是原子的,即不能再分解成更小的數據項。例如,如果一個學生的電話號碼是“123-456-7890”,則應將其分解成三個不同的屬性:國家代碼、區號和電話號碼。
-
第二範式(2NF)
第二範式要求一個關係模式中的每個非主屬性都完全依賴於候選碼,而不是部分依賴於候選碼。例如,如果一個關係模式中包含“訂單號”、“商品編號”和“商品數量”這三個屬性,其中“商品數量”只依賴於“訂單號”,而不依賴於“商品編號”,則應將其拆分為兩個關係模式,以確保每個非主屬性完全依賴於主鍵。
-
第三範式(3NF)
第三範式要求一個關係模式中的每個非主屬性都不依賴於其他非主屬性,即不存在傳遞依賴關係。例如,如果一個關係模式中包含“訂單號”、“商品編號”、“商品名稱”和“供應商名稱”這四個屬性,其中“供應商名稱”依賴於“商品編號”,而“商品名稱”和“供應商名稱”存在函數依賴關係,則應將其拆分為兩個關係模式,以確保不存在傳遞依賴關係。
一個模式違反第三範式:是A->B當且僅當A不是超鍵且B不是主屬性
-
巴斯-科德範式(BCNF)
巴斯-科德範式是第三範式的擴展,要求一個關係模式中的每個屬性都完全依賴於主鍵,而不是僅依賴於部分主鍵。這種範式適用於複雜的關係模式,其中存在多個主鍵。
-
第四範式(4NF)
第四範式要求一個關係模式中的每個多值依賴都被分解成獨立的關係模式。例如,如果一個關係模式中包含“學生編號”、“課程編號”和“成績”這三個屬性,其中每個學生可能有多個課程的成績,而每個課程可能由多個學生選修,則應將其拆分為三個關係模式,以確保每個多值依賴都被分解成獨立的關係模式。
-
第五範式(5NF)
第五範式是指一個關係模式中的每個依賴關係都是基於超鍵而不是基於主鍵的。超鍵是指能夠唯一標識一個關係模式中所有元組的一個或多個屬性組合。第五範式適用於多維關係資料庫和數據倉庫,其中存在複雜的多重關係和多個維度。
需要註意的是,雖然範式可以提高資料庫的性能和可維護性,但過度範式化也可能會導致查詢性能下降和數據更新的困難。因此,在實際應用中,需要根據實際需求和性能要求來選擇適當的範式級別,以實現數據的高效管理和使用。
與範式結合的分解
已知關係模式和函數依賴集合保持FD和無損連接3NF模式分解的演算法如下:
-
求極小函數依賴集Sm和關係模式的所有鍵(keys)。
-
在Smin中按函數依賴左部相同原則進行分組,每個組中的所有屬性形成分解後的子關係模式R1, R2, ..., Rn。
-
如果某個關係模式Ri的所有屬性被另一個關係模式Rj所包含,刪除關係模式Ri。
-
判斷是否有某個key出現在其中的一個關係模式中,如果出現則結束;如果沒有出現,將任意一個key也作為子關係模式R加入到分解後的模式中。
最小函數依賴集
如果函數依賴集合F滿足如下條件,則稱F為一個極小函數依賴集,也稱為最小依賴集或最小覆蓋:
-
F中的任意函數依賴的右部僅含有一個屬性。
-
F中不存在這樣的函數依賴X→A使得F與F-X→A等價。
-
F中不存在這樣的函數依賴X→A,X有真子集Z使得(F-X→A)∪(Z→A)與F等價。
如果G+ = F+,就稱F與G等價。G = F的充分必要條件是F ⊆ G+ 且 G+ ⊆ F。
我們在求最小函數依賴集合時,事實上是將所有右邊僅有一個屬性的函數依賴的冗餘消除掉,包括但不限於具有將具有傳遞性的幾個函數依賴消除掉。最本質仍然是消除冗餘。
一個性質:任意一個資料庫的關係模式都可以保持函數依賴和無損鏈接到分解到第三範式!
第四範式
第四範式(4NF)是關係資料庫中的一種規範化形式,它要求關係模式中的每個非平凡多值依賴都要被分解,以達到消除冗餘和保證數據一致性的目的。
具體來說,第四範式的要求如下:
-
關係模式中的每個非主屬性必須與主鍵存在非平凡多值依賴,即非主屬性不能完全依賴於主鍵中的任意一個屬性。
-
關係模式中的每個非主屬性必須是一個數據項的集合,即不能包含重覆值。
滿足第四範式的關係模式可以消除非平凡多值依賴,避免數據冗餘和更新異常,並且可以保證數據一致性。但是,第四範式的實現可能會導致關係模式的分解過於複雜,查詢性能下降等問題,因此在實際應用中需要根據具體情況綜合考慮。
多值依賴
多值依賴(Multivalued Dependency,MVD)是指一個關係模式中的某些屬性集合對另一個屬性集合存在依賴關係,但是這種依賴關係並不是函數依賴。在一個滿足MVD的關係模式中,一個屬性集合的取值可以對應多個其他屬性集合的取值。
例如,假設我們有一個包含以下屬性的關係模式:
學生(學號,姓名,選修課程,成績)
在這個關係模式中,選修課程和成績之間存在MVD,因為每個學生可以選修多門課程,每門課程的成績都可能不同。因此,選修課程的取值可以對應多個成績的取值,而不是像函數依賴那樣只對應一個成績的取值。
MVD是關係資料庫理論中一個重要的概念,可以幫助我們理解資料庫設計和優化的一些問題。在實際應用中,如果一個關係模式中存在MVD,我們可以考慮將其拆分為符合第三範式或BCNF的多個關係模式,以提高資料庫的性能和可維護性。
下麵將對於多值依賴舉一個例子:
假設有一個關係模式R,包含屬性A、B和C,其中屬性A為主鍵。現在,我們發現存在這樣的依賴關係:對於任意的兩個元組r1和r2,如果它們在A屬性上的值相等,那麼在B屬性和C屬性上的值都是多值依賴的。這就是一個MVD,可以表示為A →→ B,C。
舉個例子,假設關係模式R中有如下數據:
A | B | C |
---|---|---|
a1 | b1, c1 | b2, c2 |
a1 | b2, c2 | b1, c1 |
a2 | b3, c3 | b4, c4 |
a2 | b4, c4 | b3, c3 |
我們可以看到,在A屬性上有兩個不同的值a1和a2,對於每個值,B和C屬性上的值都是多值依賴的,即b1和b2、c1和c2,以及b3和b4、c3和c4。這就是一個MVD的例子。
需要註意的是,MVD不同於函數依賴,它是對於關係模式中的一組屬性來說的,並且MVD的右側可以包含多個屬性,表示這些屬性的組合是多值依賴的。MVD的出現可能導致數據冗餘和更新異常,需要進行適當的規範化處理。
函數依賴和多值依賴的關係
結論:每個函數依賴都可以看作是一個多值依賴。具體來說,如果一個屬性集合X決定了另一個屬性集合Y,那麼對於所有在屬性集合X上取值相同的元組,它們在屬性集合Y上的取值也必須相同。換句話說,如果我們交換在屬性集合Y上的兩個值,那麼這些元組仍然是合法的。因此,可以將X和Y看作是一個MVD。
具體來說,它指出,如果一個FD X -> Y成立,那麼對於在屬性集合X上取值相同的任意兩個元組,它們在屬性集合Y上的取值必須相同。因此,交換在屬性集合Y上的兩個值不會改變這些元組的合法性。因此,我們可以將FD X -> Y視為MVD X - Y。
補集原理:如果一個屬性集合X決定了另一個屬性集合Y,那麼對於屬性集合Y的補集(即所有不在Y中的屬性集合Z),X和Z之間必須存在MVD。這個原理是很有用的,因為它可以幫助我們從一個給定的函數依賴集合中推導出所有的MVD。具體來說,對於每個函數依賴X -> Y,我們可以通過補集原理推導出所有的MVD X - Z,其中Z是Y的補集。
important:對於多值依賴,如果AB->->C,那麼我們無法推出A->->C且B->->C!對於A->->BC,也無法推出A->->B和A->->C!