再論關系與關系模式 |
回顧關系與關系模式這兩個概念的聯系和區別。
關系:元組的集合,笛卡爾積的一個子集,其實質是一張二維表,表的每一行為一個元組。
關系模式:對元組中數據組織方式的結構性描述,其實質是刪去所有元組后的空表格。
關系與關系模式的聯系:關系模式是相對穩定的、靜態的,而關系卻是動態變化的,不穩定的,且關系的每一次變化結果,都是關系模式對應的一個新的具體關系。 這是因為:關系模式是對元組中數據組織方式的結構性描述,關系是關系模式的一個取值實例。一個具體關系不管增加或減少一個元組,都變成一個新的關系。一個關系都對應一個關系模式,而一個關系模式可以定義多個關系。
注意:在以后的討論中,關系模式R(U)對應的具體關系通常用小寫字母r來表示。
|
二.函數依賴的一般概念 |
定義4.1 設R(U)是屬性集U={A1, A2, …, An}上的關系模式,X和Y是U的子集。若對R(U)的任一具體關系r中的任意兩個元組t1和t2,只要t1[X]=t2[X]就有t1[Y]=t2[Y]。則稱“X函數確定Y”或“Y函數依賴於X”(Founctional Dependence),記作X->Y。 在以上定義中,t1[X]和t1[Y]分別表示元組t1在屬性X和Y上的取值。“X函數確定Y”的含義是:對關系r中的任意一個元組,如果它在屬性集X上的值已經確定,則它在屬性集Y上的值也隨之確定。因此,定義4.1即是說,在關系模式R(U)的任意一個具體關系r中,不可能存在這樣的兩個元組,它們在X上的屬性值相等,而在Y上的屬性值不等。
注意:函數依賴不是指關系模式R(U)的某個或某些具體關系滿足的約束條件,而是指R(U)的一切具體關系r都要滿足的約束條件。
|
例4.3 設有一個描述學生信息的關系模式: R(Sname, Sex, Birthday, Phone),其屬性名分別代表學生的姓名、性別、出生日期和電話號碼屬性。它的一個具體關系r如表所示。 |
 關系r
|
如果僅從關系模式R(U)的一個具體關系r出發,由於r沒有相同姓名的元組(學生),所以我們就會得出:對於關系模式R有Sname->Sex,Same->Birthday,Sname->Phone的結論。但這個結論是不正確的。比如,對關系模式R的另外一個具體關系r1,這時,從關系r得出的函數依賴就不成立了。所以,關系模式中的函數依賴是對這個關系模式的任何可能的具體關系都成立的函數依賴。 |
 關系r1
|
從例子可知,函數依賴和其它數據依賴一樣,是一個語義范疇的概念。我們只能根據屬性的語義來確定一個函數依賴。例如Sname(姓名)->Birthday(出生日期)這個函數依賴,只有在沒有同姓名學生的條件下才成立。如果允許出現相同姓名的學生,則出生日期就不再函數依賴於姓名了。 數據庫設計者應在定義數據庫模式時,指明屬性之間的函數依賴,使數據庫管理系統根據設計者的意圖來維護數據庫的完整性。因此,設計者可以對現實世界中的一些數據依賴作強制性規定. 例如,為了使Sname->Birthday這個函數依賴成立,用戶可以強制規定關系中不允許同名同姓的人出現。這樣當輸入某個元組時,這個元組在Sname上的屬性值必須滿足規定的函數依賴,若發現新輸入元組在Sname上的值與關系中已有元組在Sname上的值相同,則數據庫管理系統就拒絕接受該元組。解決的辦法是通過人工方式是同名者為不同名者。比如有兩個張華,可改為“張華a”,“張華b”等。
|
在定義4.1的基礎上補充以下常用術語和記號: ⑴ 若X->Y,則稱X為這個函數依賴的決定(Determinant)因素,簡稱X是決定因素。 ⑵ 若X->Y且Y->X,則記作X->Y。X->Y 若Y不函數依賴於X,則記作非X->Y 。 ⑷ 若X->Y,但Y->X,則稱X->Y是平凡函數依賴。 ⑸ 若X->Y,但Y屬於X,則稱X->Y是非平凡函數依賴。 對於任一關系模式,平凡函數依賴都是必然成立的,但它不反映新的語義。 在下面的討論中,若沒有特別聲明,“X?Y”都表示非平凡函數依賴。
定義4.2設R(U)是屬性集U={A1, A2, …, An}上的關系模式。X和Y是U的子集。 ⑴ 如果X->Y,且對於 X的任何一個真子集X?,都有 ,則稱Y對X完全函數依賴(Full Founctional Dependence)或者X完全決定Y,記作:X完全函數決定Y。 ⑵ 如果X->Y,但Y不是完全函數依賴於X,則稱Y對X部分函數依賴(Partial Founctional Dependence),記作:X部分函數決定Y。
定義4.3 對於關系模式R(U),設X、Y和Z都是U的子集。如果X->Y,Y->Z,且Y?X,Z?Y , 則稱Z對X傳遞函數依賴(Transitive Founctional Dependence),記作: X傳遞函數決定Z 。 在傳遞函數依賴的定義中加上條件 是必要的,因為如果Y?X,則X?Y,即說明X與Y之間是一一對應的,這樣導致Z對X的函數依賴是直接依賴,而不是傳遞函數依賴。定義4.3中的條件 主要是強調X?Y和Y?Z都不是平凡函數依賴,否則同樣Z對X是直接函數依賴,而不是傳遞函數依賴。當然,若 X?Z ,則必有X?Z。
|
例4.4 對於例4.1的關系模式StudyInfo(Sno, Sname, DeptName, DeptHead, Cname, Grade)有如下的一些函數依賴:Sno->Sname, {Sno, Cname}->Grade,Sno->DeptName, DeptName->DeptHead。由最后兩個函數依賴還可得出DeptHead傳遞函數依賴Sno,即 Sno->DeptHead 。如果沒有同姓名的學生,還有Sno->Sname等。但顯然有Grade->Sname ,{Sno, Cname}->Sname。其實,對關系模式StudyInfo還有Sno->Sname ,{Sno, Cname}->Grade 等。 因此,Sno是 Sno->Sname的決定因素,{Sno,Cname}是 的決定因素。 |
三.候選鍵與主鍵 |
定義4.4 對關系模式R(U),設K?U。如果 ,則稱K為R(U)的候選鍵或候選關鍵字(Candidate Key)。通常在R(U)的所有候選鍵中選定一個作為主鍵(Primary Key)。主鍵也稱為主碼或主關鍵字。
候選鍵是能夠唯一確定關系中任何一個元組(實體)的最少屬性集合,主鍵也是候選鍵,它是候選鍵中任意選定的一個。在最簡單的情況,單個屬性是候選鍵。最極端的情況是,關系模式的整個屬性集全體是候選鍵,也是主鍵,這時稱為全鍵或全碼(All-key)
|
例4.5 設有關系模式R(Teacher,Course,Sname),其屬性Teacher,Course,Sname 分別表示教師,課程和學生。由於一個教師可以講授多門課程,某一課程可由多個教師講授。學生也可以選修不同教師講授的不同課程,因此,這個關系模式的候選鍵只有一個,就是關系模式的全部屬性(Teacher,Course,Sname),即全鍵(All-key),它也是該關系模式的主鍵。 為了便於區別候選鍵中的屬性與其它屬性,我們可以得到如下定義。 |
定義4.5對關系模式R(U),包含在任何一個候選鍵中的屬性稱為主屬性(Primary Attribute),不包含在任何候選鍵中的屬性稱為非主屬性(Nonprimary Attribute)或非碼屬性(Non-key Attribtute)。
|
例4.6 在關系模式StudyInfo(Sno,Sname,DeptName、DeptHead、Cname,Grade)中,{Sno, Cname}是其唯一候選鍵,因此,Sno和Cname都是主屬性,而Sname,DeptName、DeptHead,Grade都是非主屬性。 |
定義4.6 對關系模式R(U),設X屬於U。若X不是R(U)的主鍵,但X是另一個關系模式的主鍵,則稱X是R(U)的外鍵或外部關鍵字(Foreign key)。
|
例4.7 在Reports(Sno, Cname, Grade)中,Sno不是關系模式Reports的主鍵,但Sno是關系模式Students (Sno, Sname, DeptName)中的主鍵。因此,Sno是關系模式Reports(Sno, Cname,Grade)的外鍵。主鍵與外鍵提供了一個表示兩個關系中元組(實體)之間聯系的手段。在數據設計中,經常人為地增加外鍵來表示兩個關系中元組之間的聯系。當兩個關系進行連接操作時就是因為又外鍵在起作用。比如,我們需要查看每個學生的姓名、選課名稱和成績時,就涉及到Students(Sno, Sname, DeptName)和Reports(Sno, Cname,Grade)對應關系的連接操作,這時,只要使用第3章介紹的如下SQL命令即可。 SELECT Sname, Cname, Grade FROM Students, Reports WHERE Students.Sno=Reports.Sno。 |
四.函數依賴的推理規則 |
在討論函數依賴時會遇到這樣的問題:以知關系模式R(U,F)的函數依賴集F={A->B,B->C}。問A->C是否成立? ,其中屬性集U={A, B, C}。這是本節后面將討論的有關問題,其內容安排如下:
函數依賴的邏輯蘊涵
Armstrong公理系統
函數依賴推理規則的完備性
閉包的計算
函數依賴集的等價和覆蓋
|
1.函數依賴的邏輯蘊涵 |
在介紹函數依賴的推理規則之前,先介紹兩個函數依賴的邏輯蘊涵和閉包概念。 |
定義4.7 對於滿足函數依賴集F的關系模式R(U,F)的任意一個具體關系r,若函數依賴X?Y都成立(即對於r中的任意兩個元組t,s,若t[X]=s[X],則有t[Y]=s[Y]),則稱F邏輯蘊涵X->Y,記為F=>X->Y。 注意,在定義4.7中沒有假定函數依賴(X->Y)屬於F,X,Y都是屬性集U的子集合。
定義4.8 被函數依賴集F邏輯蘊涵的函數依賴所構成的集合,稱為F的閉包(Closure),記作F+。即 F+={X->Y | F=>X->Y}。
|
通常,F包含於F+。若F=F+,稱F是函數依賴完備集。然而,對於給定的函數依賴集F和屬性集X,Y,僅有定義4.7和定義4.8還難於回答F是否邏輯蘊涵X?Y的問題。當然,我們可以先計算F+,然后檢查X->Y是否屬於F+即可。但現在也沒有計算一個函數依賴集F的閉包F+的方法。這些問題需要學習了Armstrong公理系統和函數依賴的推理規則等知識以后才能夠解決。 |
2.Armstrong公理系統 |
通俗說,Armstrong公理系統是函數依賴基本推理規則的集合,又稱Armstrong推理規則系統。 Armstrong公理系統 設有關系模式R(U, F),F是只涉及到U中屬性的函數依賴集。若X,Y,Z,W均是U的子集,則有以下推理規則: ⑴ 自反律 (Reflexivity Rule):如果Y?X?U,則X?Y成立,即F?X?Y。 ⑵ 增廣律(Augmentation Rule):如果X?Y成立, 則XZ?YZ 成立(其中XZ是X?Z的簡單記法,其它類同),即若F?X?Y,則F?XZ?YZ。 ⑶ 傳遞律(Transitivity rule):如果X?Y,Y?Z成立,則X? Z成立,即若F?X?Y,F?Y?Z,則F若F? X?Z。 |
定理4.1 Armstrong公理系統中的推理規則⑴,⑵,⑶是正確的,即若X?Y由Armstrong公理導出,則X?Y屬於F+。
定理4.2 函數依賴的如下三個推理規則是正確的。 ⑴ 合並律(Union Rule):如果X?Y和X?Z成立,那么X?YZ成立,即若F?X?Y,F?X?Z,則F? X?YZ。 ⑵ 偽傳遞律(Pseudotransivity Rule):如果X?Y和WY?Z成立,那么WX?Z成立,即若F?X?Y,F?WY?Z,則F?WX?Z。。 ⑶ 分解律(Decomposition Rule):如果X?Y和Z?Y成立,那么X?Z成立,即若F?X?Y,Z?Y,則F? X?Z。
定義4.9 設F是屬性集合U上的一個函數依賴集,X?U,稱為屬性集X關於F的閉包。 在以后的討論中,如果只涉及一個函數依賴集F,則屬性集X關於F的閉包常簡記為X+。值得注意的是,定義4.9中的A是U中的單個屬性,因此X?X+?U。
定理4.3 設F是屬性集U上的函數依賴集,X,Y是U的子集,則X?Y能由F根據Armstrong公理導出的充分必要條件是Y? X+。
|
例4.8 設關系模式R(U,F),其中U={A, B, C},函數依賴集F={A?B, B?C}。則有: A+={A, B, C} B+={B, C} C+={C} |
3.閉包的計算 |
前面我們曾經提到,為了判斷函數依賴X?Y是否在F+中,只要計算出F+即可。因為F+是由F根據Armstrong公理導出的函數依賴的集合。因此,原則上說,只要按照Armstrong公理系統中的推理規則就可以計算出F+。但是,閉包F+的計算是一件很麻煩的事情,因為計算F+的問題是一個NP完全問題,即若F={X?A1, X?A2, …, X?An,},則需要計算F+的O(2n)個函數依賴,因此,當 n比較大時,實際計算F+是不可行的。即使F的元素不多時, F+中的元素也可能很多。此外,閉包F+中也存在許多冗余信息。其實,判斷一個函數依賴X?Y是否在F+中,完全不必計算閉包F+,因為,由定理4.3可知,只要判斷X?Y能否從F根據Armstrong公理導出,即判斷Y?X+是否成立即可。這樣就把一個需要計算F+才能解決的問題簡化為計算X+就能解決得問題。而計算X+並不太難,它所花費的時間與F中的全部函數依賴的長度成正比。下面介紹一個計算X+的算法。
算法4.1 求屬性集X?U關於函數依賴集F的閉包X+。 輸入:有限的屬性集合U、它上面的函數依賴集合F和U的一個子集X。 輸出:X關於F的閉包X+。 計算方法和計算步驟: ⑴設置初始值:令X(0)=空集,X(1)=X,F'=空集; ⑵如果X(0)≠X(1),令X(0)=X(1),否則轉⑷; ⑶構造函數依賴集F'={Y->Z | (Y->Z)屬於F且Y?X(1)},令 F=F-F' 對F'中的每一個函數依賴Y->Z,令X(1)= X(1)∪Z,轉⑵ ⑷ 輸出X(1),它就是X+。 例4.10 設有關系模式R(A,B,C,D,E),其屬性集上函數依賴:F={AB->C, B->D, C->E, EC->B, AC->B},這里的AB->C是{A, B}->{C}的簡寫。 令X={A, B},求X+。 解: 計算過程是根據循環次數介紹的。由算法4.1 第一次:⑴ X(0)=空集,X(1)={A, B},F'=空集; ⑵ 由於X(0)≠X(1),令X(0)=X(1)={A, B}; ⑶ 函數依賴集F'={ AB->C, B->D},令F=F-F'={C->E, EC->B, AC->B}, 將F'中的每一個函數依賴的右端屬性C,D並入X(1)中, 即令X(1)={A, B}∪{C, D}={A, B, C, D}; 第二次:⑵ 由於X(0)?X(1),令X(0)=X(1)= {A, B, C, D}; ⑶ 函數依賴集F'={C->E, AC->B},令F=F- F'={EC->B}, 將F'中的每一個函數依賴的右端屬性E, B並入X(1)中, 即令X(1)={A, B, C, D }∪{E, B}={A, B, C, D, E} ; 第三次:⑵ 由於X(0)≠X(1),令X(0)=X(1)= {A, B, C, D, E } ; ⑶ 函數依賴集F'={EC->B},令F=F-F'=空集, 將F'中的每一個函數依賴的右端屬性B並入X(1)中, 即令X(1)={A, B, C, D, E }∪{B}={A, B, C, D, E}; 第四次:⑵ 由於X(0)=X(1),轉⑷ ⑷輸出X(1)={A, B, C, D, E}=X+。
|