20321关系数据库理论基础
第2章? 關系數據庫理論基礎
??? ?2.1 關系模型
??? ?2.2 關系代數
??? ?2.3 關系數據庫
??? ?2.4 函數依賴
??? ?2.5 關系模式的范式
??? ?2.6 關系模式的分解和規范化
?
2.1 關系模型
????????? 關系模型的基本要素:關系模型的數據結構、關系操作和關系的完整性約束三部分。
????????? 2.1.1 關系模型的數據結構——關系
定義2.1?? 令D = D1×D2×…×Dn = {(d1, d2,…, dn) | di ∈Dn ,? i = 1,2,…,n},即D為D1, D2, …, Dn的笛卡兒積,則D的任何非空子集R都稱為D1, D2, …, Dn上的n元關系,其中Di為有限的屬性值域,i = 1,2,…,n。
?
? 一個n元關系R通常記為R(D1, D2, …, Dn),R中的任一元素(d1, d2,…, dn)稱為n元組,簡稱元組(Tuple)。元組中的每個值di稱為分量。n稱為關系的度或元。當n = 1時,R稱為單元關系;當n = 2時,R稱為二元關系。
? 注意,一個關系實際上就是若干元組的集合。一個關系必須是有限元組的集合,無限集合對數據庫技術來說是無意義的。
?
????????? 笛卡兒積可以用二維表直觀地表示。
【例子】? 假設笛卡兒積D = D1×D2×D3,D1為學號的集合, D1={201301, 201302},D2為姓名的集合, D2={李思思, 劉洋},D3為英語成績(簡稱“英語”)的集合, D3={90, 85, 70}。
D = {201301, 201302}×{李思思, 劉洋}×{90, 85, 70}
??? = {(201301, 李思思, 90), (201301, 李思思, 85), (201301, 李思思, 70),?????????????????????????????????????????????????????? (201301, 劉洋, 90), (201301, 劉洋, 85), (201301, 劉洋, 70),
? (201302, 李思思, 90), (201302, 李思思, 85), (201302, 李思思, 70),
? (201302, 劉洋, 90), (201302, 劉洋, 85), (201302, 劉洋, 70)}。
?
????????? 由定義2.1,D為一個笛卡兒積,D的任意子集都是三元關系。
【例子】令R = {(201301, 劉洋, 70), (201302, 李思思, 90)},R 為D的一個子集,所以R 為3元關系。
????????? 這個關系記作R(D1, D2, D3),其對應二維表示如表2.2所示。
?
?
?
?
?
????????? 笛卡兒積D本身也是一種關系,但這種關系由于過于泛化而可能會導致語義上的矛盾,從而失去實際意義。一般來說,只有部分關系有意義,而不是全部。
【例子】? 元組(201301, 劉洋, 90)和元組(201301, 劉洋, 85)就是一對矛盾的元組,因為學號“201301”、姓名為“劉洋”的學生的英語成績不可能同時取90分和85分這兩個值。
?
????????? 數據庫理論中的一些概念;
? 關系:一個關系等同于一張二維表,是有限元組的集合;一個數據庫可以視為若干關系的集合
? 元組:二維表中的一行對應一個元組,也稱為記錄。
? 由表2.2所示,“201301”,““劉洋”和“70”構成的行就是元組(201301,劉洋, 70)。
? 屬性:二維表中的每一列都稱為屬性或字段。
? 域:即屬性的值域,也就是屬性的取值范圍。
? 由表2.2所示,“學號”這個屬性的值域為{201301, 201302}。
?
?
? 分量:一個元組中的一個屬性值,也常稱為數據項。
? 由表2.2所示,“劉洋”、“70”等都是數據項。數據項不能再分了,它是關系數據庫中最小的數據單位。
? 候選碼和主碼:如果二維表中存在一個屬性或若干屬性組合的值能夠唯一標識表中的每一個元組,則該屬性或屬性組合就稱為候選碼,簡稱碼;如果一個表存在候選碼,且從中選擇一個候選碼用于唯一標識每一個元組,則該候選碼稱為主碼(Primary key)。主碼也常稱為主健(主關鍵字段)。
? 主屬性和非主屬性:包含在任何候選碼中的屬性都稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性。
?
?
????????? 關系的性質:
? 列是同質的,即每一列中的分量是同一類型的數據,它們都是來自同一個域。
? 每一列為一個屬性,不允許存在相同屬性名的情況。
? 列(行)的順序是任意的,列(行)的次序可以任意交換。
? 不允許存在兩個相同的元組。
? 每一個分量都是不可再分的,即不允許表中套表。
?
?
?定義2.2?? 假設一個n元關系R的屬性分別為A1, A2, …, An,令R(A1, A2, …, An)表示關系R的描述,稱為關系模式。
?? 關系模式是由屬性構成,與屬性值無關。為了體現關系模式中的主碼,對構成主碼的屬性添加下劃線。
【例子】在關系模式R(A, B, C, D, E)中,屬性A和B的組合是該關系模式的主碼。
?? 關系模式是描述關系的“型”,即凡是具有相同屬性的關系都屬于相同的“型”,即它們都屬于同一個關系模式。
?? 一個關系模式可以視為一類具有相同類型的關系集合,屬于同一個關系模式的關系都擁有相同的屬性(但屬性值卻不一定相同)。
?? 一個特定的關系是其對應關系模式的“值”,或者說關系是關系模式這個集合中在某一時刻的一個“元素”。
?
?
?? 關系和關系模式的區別和聯系:
???????????? 關系和關系模式之間的聯系就好像是數據類型和數據之間的聯系。
???????????? 關系模式和關系是有區別的,即前者是后者的抽象,后者是前者的特定實例
???????????? 關系模式是相對穩定的,數據在更新,關系是隨時間變化的。但在運用中常常將它們統稱為關系,讀者可根據上下文來區分。
?
?
????????? 2.1.2 關系操作
????????? ?關系操作的分類:查詢操作、更新操作
????????? 查詢操作是最常用和最主要的操作,其包括:
? 選擇:從關系中檢索出滿足既定條件的所有元組的集合,這種操作就稱為選擇。其中,選擇的條件是以邏輯表達式給出的,使表示式的值為真的元組被選取。從二維表的結構上看,選擇是一種對行的操作。(最常用)
? 投影:從關系中選出若干個指定的屬性來組成新的關系,這種操作就稱為投影。從二維表的結構上看,選擇是一種對列的抽取操作。
? 連接:從兩個關系中抽出滿足既定條件的元組,并將它們“首尾相接”地拼接在一起,從而形成一個新的關系,這種操作稱為連接。
? 除:一種行列同時參加的運算。
?
?
????????? 以下三個選擇操作的共同特點是,參加運算的兩個關系必須有相同的屬性個數,且相應屬性的取值分別來自同一個域(屬性名可以不同):
? 并:將兩個關系中的元組合并到一起(縱向),從而形成一個新的關系,這種操作稱為并。
? 交:將兩個關系中的共同元組組成一個新的關系,這種操作稱為交。
? 差:將第一個關系中的元組減去第二個關系中的元組,從而也產生了新的關系,這種操作稱為差。
?
?
????????? 更新操作種類:(最常用)
? 插入:把一個關系(元組的集合)插入到已有的關系中,形成新的關系。
? 刪除:從一個關系中刪除滿足既定條件的所有元組,剩下的元組構成新的關系。
? 修改:利用給定的值更改關系中滿足既定條件的所有元組的對應分量值,更改后得到新的關系。
????????? 關系操作的特點:
????????????????? 針對集合進行,即操作的對象是元組的集合,操作后所得到的結果也是元組的集合。
????????????????? 非關系模型(網狀模型和層次模型)的操作對象是一個元組。
?
?
????????? 2.1.3 關系的完整性約束
?? 關系是關系模型的數據結構。關系需要滿足一些基本要求——關系的完整性約束。
?? 完整性約束包括:實體完整性約束、參照完整性約束、用戶定義的完整性約束。
?
?
1.實體完整性
? 每一個關系中的主碼屬性的值不能為空(NULL),能夠唯一標識對應的元組。
??? 原因:主碼設置的目的是用于區分關系中的元組,以將各個元組區別開來。如果主碼中的屬性值可以為空,那么在關系中將存在一些不確定的元組,這些元組將不知道是否能夠與別的元組有區別(因為空值被系統理解為“不知道”或“無意義”的值),這在關系模型中是不允許的。各個元組在主碼上的取值不允許相等,否則就不滿足實體完整性約束。
? 實體完整性是關系模型必須滿足的完整性約束條件。
?
?
【例2.1】考慮如表2.3所示的學生關系student(學號, 姓名, 性別, 專業號)和表2.4所示的課程關系course(課程號, 課程名, 學分)。假設學生關系的主碼為“學號”,課程關系的主碼為“課程號”,那么學生關系的“學號”以及課程關系的“課程號”的取值就不能為空,而且取值不能重復(能唯一標識每一行),否則就不滿足實體完整性。
?
?
2. 參照完整性
? 參照完整性與外碼密切相關,這里先介紹外碼的概念。
? 對于關系R和S,假設F是關系R的一個屬性或一組屬性,但F不是R的碼,K是關系S的主碼,且F與K相對應(或相同),則F稱為R的外碼(Foreign key),R和S分別稱為參照關系(Referencing relation)和被參照關系(Referenced relation),如圖2.1所示。
?
?
?
?
????????? F與K是相同的屬性或屬性集,它們的取值范圍相同。
????????? 關系模型的參照完整性約束:外碼F中的每個屬性值等于主碼K的某一個屬性值或F的每個屬性值均為空值。
????????? 如果要在關系R中插入一個元組,則該元組在屬性F上的取值等于關系S中某一個元組在主碼K上的取值或全置為空值,否則不能插入該元組。當關系S為空時,不能向關系R中插入元組;當要刪除關系S中的一些元組時,必須先刪除關系R中與這些元組相關聯的元組。
????????? 參照完整性也是關系模式必須滿足的完整性約束條件。
?
?
【例子】選課關系SC(學生編號, 課程編號, 成績),如表2.5所示。可見屬性組{學生編號,課程編號}為該關系的主碼。
?
?
? 屬性“學生編號”是選課關系的外碼,它與關系“student(學號, 姓名, 性別, 專業號)”的主碼“學號”相對應,選課關系為參照關系,學生關系為被參照關系,“課程編號”同理。
????????? 外碼“學生編號”和“課程編號”共同組成了該關系的主碼,這兩個屬性的取值不能為空,只能為相應被參照關系中相應列中的取值。
【例子】表2.5中“學生編號”列的屬性值“201301”必須等于表2.3中“學號”列中的某一個屬性值;表2.5中的“課程編號”列的屬性值“13989”必須等于表2.4中“課程號”列中的某一個屬性值。
?
?
????????? 表2.6所示的專業關系major(專業編號, 專業名),該關系的主碼是“專業編號”,且表2.3所示關系“學生”中的“專業號”與該關系中的“專業編號”相對應,即“專業號”是學生關系student的外碼。在這種情況下,由于學生關系student中的“專業號”不是該關系的主碼,因而“專業號”列的屬性值可以取空值。
【例子】表2.3中學生“李鑫”所對應的“專業號”為空值,這表明尚未給該學?????? 生分配專業。
?
?
3.用戶定義的完整性
l 用戶定義的完整性是指由用戶定義的、針對某一具體應用需求制定的約束條件,多用于滿足數據的一些語義要求。
【例子】在表2.5所示的關系SC中,經常定義這樣的約束:成績的取值必須在0~100之間;又如,某些屬性值不能為空或取值必須唯一等。
l 用戶定義完整性約束可以有效減少應用程序的負擔,關系數據庫管理系統都提供定義和檢驗這類完整性的機制和方法。
?
?
2.2 關系代數
l? 2.2.1 基本集合運算
??? 基本集合運算是指集合的并、交、差和笛卡兒積運算,這些運算都是二元運算。我們約定:本節中R和S都默認是n元關系,且對應屬性取自同一個值域。以下介紹基于關系的基本集合運算。
1. 并∪
? n元關系R和S的并是一種新的n元關系,這個新的關系是由R的元組或S的元組組成,記為R∪S,即R∪S = {x |? x∈?R∨x ∈?S}
2. 交∩
? n元關系R和S的交是一種新的n元關系,這個新的關系是由R和S的共同元組組成,也就是說,由既屬于R的元組又屬于S的元組組成,記為R∩S,
???? 即R∩S = {x | x?∈ R ∧ x ∈S }
?
?
3. 差-
? n元關系R和S的差是一種新的n元關系,這個新的關系是由屬于R的元組但不屬于S的元組組成,記為R-S,即R-S = {x | x?∈ R∧x ∈S}
?
4. 笛卡兒積
? 設R和S分別是n元關系和m元關系,則R和S的笛卡兒積是一種(n + m)元關系,該關系是由R的每一個元組分別與S每一個元組進行“首尾并接”所得到的元組的集合,記為R×S,即R×S = {xr? xs| xr?∈ R∧ xs?∈ S}
? xrxs是表示由元組xr和元組xs并接而得到的新元組。
【例子】如果xr =(1班,李好,78)且xs =(03987,陳永江,01,3班),
則xrxs =(1班,李好,78,03987,陳永江,01,3班)。
?? 關系R和S的元組個數分別為kr和ks,則R×S的元組個數為kr×ks。
?
?
????????? 2.2.2 關系運算
?關系一些特殊的運算,主要包括選擇(σ)、投影(π)、連接(? )、除(/)等。
?? 先約定一種表示方法:設x為某一個關系R的一個元組,L為R的關系模式的一個子集(即屬性子集),則令x(L)表示由元組x在屬性子集L上的所有分量構成的新元組。
【例子】對于關系R(A,B,C,D),令x = (a , b ,c , d),則x({A,B,C}) = (a , b , c),x({C,D}) = (c , d),x({B}) = (b),等。
?
?
????????????????? 選擇σ
? 從關系中篩選出滿足既定條件的元組,這些元組組成了一個新的關系,這個操作過程稱為選擇。
?? 選擇的操作符用σ表示,選擇條件則用邏輯公式來表示,用R表示邏輯公式。對關系R的選擇運算就可以表示為σt(R),即
σt(R) = {x | x∈R∧t(x) = true}
“t(x) = true”表示元組x滿足條件公式t。對于選擇運算,關鍵是設置選擇條件t。
在數據查詢中,條件公式t通常是由<、>、≤、≥、=、between、∧、∨等連接符號構成的條件表達式或邏輯表達式。
?
?
【例子】表2.3所示的學生關系student。令選擇條件t = (性別=‘男’∧專業號=‘z3’),則選擇運算st(student)表示查找那些專業號為“z3”的男同學,結果如表2.7所示。
?
?
?
2. 投影π
l? 投影是指從關系中選出若干個指定的屬性來組成新的關系。令投影的操作符為π,L為指定的屬性子集,則關系R在屬性子集L上的投影就可以表示為πL(R),即 πL(R) = {x(L) | x?∈ R}
?????????????????????????? x(L)表示由元組x在屬性集L上的取值構成的新元組。
l? 投影還有一種表示方法就是在投影運算表達式πL(R)中用指定的屬性在關系R中的序號來代替L中的屬性名。
?【例子】對于上述的投影π{姓名,性別} (student)也可以表示為π{2,3}(student)。
l? 投影就是從關系表中按指定的屬性抽取相應的列,這些列組成一個新的關系。
l? 注意,投影運算是對列進行篩選,而選擇運算則對行進行篩選。
?
?
【例子】對于表2.3所示的學生關系student,令L = {姓名,性別},則學生關系在L上的投影:
???????? πL(student)? = {x(L) | x∈? R}
????? = {x({姓名,性別}) | x∈? R}
????? = {(劉洋,男), (李思思,女), (陳永江,男), (王大河,男), (呂文星,男), (李鑫,女)}
?
結果如表2.8所示。
?
?
?
3. 連接? ?
?? 連接運算是二元運算,即涉及到兩個關系的運算。假設參與運算的兩個關系是R和S,則連接運算的結果是R和S笛卡兒積中滿足屬性間既定條件的元組的集合,即它是R和S笛卡兒積的一個子集。連接運算常用的主要有兩種:等值連接和自然連接。
1)等值連接
???? 對于關系R和S,假設F和M分別是關系模式R和S的屬性子集,如果按照F和M進行連接,則R和S的等值連接表示為:
?
xrxs表示由元組xr和xs連接起來而構成的新元組。等值連接R??? S是R和S笛卡兒積的一個子集,子集中的元組在F和M上的取值相等。
?
?
2)自然連接
?? 自然連接是一種特殊的等值連接,它是在等值連接的基礎上加上兩個條件:
(1)參與比較的屬性子集F?和M?必須是相同的,即F=M;
(2)形成的新關系中不允許存在重復的屬性,如果有則去掉。R和S的自然連接可以表示為:
F是關系R和S都包含的屬性(組)。
?
?
?
?表2.9和表2.10所示的兩個關系,分別表示學生的基本信息和學生的考試成績。
?
等值連接stu_info? 年齡=高數grade和stu_info? 姓名=姓名grade以及
自然連接stu_info ? 姓名grade的結果分別見表2.11、表2.12和表2.13所示。
從這三個結果的對比中讀者不難比較這幾種連接的區別。
?
?
?
4. 除/??
?
對于關系模式R(LR)和S(LS),約定:
???? LR --- R的屬性集
???? LS --- S的屬性集
???? L = LR?∩LS??? (即L表示關系R和關系S的公共屬性)
???? Lx= {t(L) | t∈R∧t(LR-L)=x}?????? (其中,x∈πLR -L(R) ,Lx稱為x在R中關于L的像集)
?
??? R和S的除運算產生一個新關系R/S:
???????? 該新關系由投影 x∈πLR -L(R)中的某些元組組成,這些元組在R中關于L的像集包含S在L上的投影πL(S)。即:
相同部分所在行
?
?
?
?
?
2.3 關系數據庫??
l? 2.3.1 關系數據庫的概念
????? 關系數據庫(Relation database)是以關系模型為基礎的數據庫,它是利用關系來描述實體及實體之間的聯系。簡單地說,一個關系數據庫是若干個關系的集合。一個關系可表示為一張二維表(也稱數據表),一個關系數據庫也可以理解為若干張二維表的集合。
?? ?一張數據表是由一系列的記錄(行)組成,每一條記錄由若干個數據項組成。數據項也是前面講到的字段值、屬性值,是關系數據庫中最小的數據單位,不能再分解。
?? 每一張數據表都有自己的表名。在同一個數據庫中,表名唯一。當要訪問數據庫中的某一個數據項時,先通過表名找到相應的數據表,然后檢索到該數據項所在的記錄,最后通過記錄訪問到該數據項。
?? “元組”、“分量”等概念多用于描述關系模型,可理解為理論范疇中的概念;而“記錄”、“數據項”則分別是“元組”、“分量”在關系數據庫中的映象,理解為它們的實例化對象。它們基本上是對應的。這種對應關系說明如表2.15所示(但這種對應關系不是嚴格的,在使用中要視上下文而定)。
?
?
?
?
????????? 2.3.2 關系數據庫的特點
???? 關系數據庫的主要特點和優點包括:
? 具有較小的數據冗余度,支持創建數據表間的關聯,支持較為復雜的數據結構。
? 應用程序脫離了數據的邏輯結構和物理存儲結構,數據和程序之間的獨立性高。
? 實現了數據的高度共享,為多用戶的數據訪問提供了可能。
? 提供了各種相應的控制功能,有效保證數據存儲的安全性、完整性和并發性等,為多用戶的數據訪問提供了保證。
?
?
?
2.4 函數依賴
l? 2.4.1 函數依賴的概念??
???? 定義2.3? 設R(U)是屬性集U上的一個關系模式,A, B?? U,對于R(U)的任意一個可能的關系r,若關系r的兩個元組x1, x2滿足x1(A) = x2(A),則必有x1(B) = x2(B),那么A函數決定B,或稱B函數依賴于A,記為A→B,A中的每個屬性都稱為決定因素(Determinant),其中x1(A)表示元組x1在屬性集A上的取值。如果A→B且B→A,則記為A?B;如果A→B不成立,則記為? AB。
?? 函數依賴不是指關系模式R(U)的某一個或某一些關系滿足的約束條件,而是指關系模式R(U)的所有關系均需要滿足的約束條件。
? 【例2.2】表2.3所示的學生關系模式student(學號, 姓名, 性別, 專業號)。學號是不允許重復的,如果學號相同的兩個學生元組在其他屬性上的取值肯定相同,可以推出{學號} →{姓名}, {學號} → {性別}, {學號} → {專業號}。
l? 屬性間的這種函數依賴關系跟語義有關,它屬于語義范疇的概念。
?【例子】?如果不允許出現重名的學生元組,則可以有{姓名} →{學號},進而{學號}?? {姓名}。
l? 如果屬性集是由單個屬性構成,標志集合的大括號“{”和“}”可以省略,如“{學號} →{姓名}”可以寫成“學號→ 姓名”。
l? 注意,在實際數據庫開發中,可以從用戶提供的需求說明中或是從基本常識中獲取函數依賴關系,例如上述“學號→ 姓名”就是一個基本常識。
?
?
?
???? 定義2.4?? 設R(U)是屬性集U上的一個關系模式,A,B ??U。若A→B是一個函數依賴,如果B→A,則稱A→B為一個平凡函數依賴;如果B?A,則稱A→B為一個非平凡函數依賴。
?
? 對于任意B?A,顯然有A→B,它是一種平凡函數依賴。
【例子】“{學號, 姓名} → 姓名”是一種平凡函數依賴。由于平凡函數依賴沒有實際意義,一般不予以討論,在默認情況下提到的函數依賴均指非平凡函數依賴。
?
?
?
???? 定義2.5?? 設R(U)是屬性集U上的一個關系模式,A, B ??U。若A→B是一個函數依賴,并且對于任意C ??A且C非空,均有C?B,則稱A→B是一個完全函數依賴(Full functional dependency),即B完全函數依賴于A,記為AB;否則稱A→B是一個部分函數依賴(Partial functional dependency),即B部分函數依賴于A,記為AB。
【例2.3】表2.5所示的選課關系模式SC(學生編號,課程編號,成績),{學生編號, 課程編號}???? 成績,因為學生編號??? 成績且課程編號??? 成績。又如,表2.3所示學生關系模式student(學號, 姓名, 性別, 專業號),{學號, 姓名}???? 性別,確實有{學號, 姓名} → 性別,但學號→性別。
? 對于函數依賴A→B,如果A只包含一個屬性,則必有A B中,因為這時的A不存在非空真子集。
?
?
?
???? 定義2.6?? 設R(U)是屬性集U上的一個關系模式,A, B, C í U。若A→B (B?A, B??A),且B→C成立,則稱C傳遞函數依賴于A,記為A?C。
? 注意,此處加上條件B? ? A,是因為如果B→A,則實際上變為A?B,即A→C,而不是A??C。
【例2.4】?對于關系模式—分班(學號, 班級號, 班長),容易知道學號→ 班級號,班級號→ 班長,又因為班級號
學號,于是學號?班長。
?
????????? 2.4.2 候選碼和主碼
??? 定義2.7?? 在關系模式R(U)中,假設A ??U,如果A?U,則A稱為關系模式R(U)的一個候選碼;候選碼可能有多個,從候選碼中選擇一個用于唯一標識關系中的每一個元組,則該候選碼稱為主碼(Primary key)。
? 含在任何候選碼中的屬性稱為主屬性(Prime attribute),不包含在任何碼中的屬性稱為非主屬性(Nonprime attribute)。通常將主碼和候選碼都簡稱為碼。最簡單的情況,單個屬性構成碼;最極端的情況,一個關系模式的所有屬性構成碼,稱為全碼(All key)。
? 對于候選碼和主碼,需要說明幾點:
?????????? 為正確理解候選碼A,應該緊緊抓住其以下兩個特性:
????????????????? A可以函數決定U,即A→U。?
? ? ? ? ? ? ? ? ? A具有極小性,即A的任何真子集都不可能函數決定U。
?????????? 候選碼可能有多個。如果有多個候選碼,則它們的地位是平等的,任何一個都可以被設置為主碼。在應用當中,一般是根據實際需要來將某一個候選碼設置為主碼。
?
?
?
???? 定理2.1??? 在關系模式R(U)中,對任意A, B ?U且A ∪ B = U,如果A ????B,則有A? U,從而A是關系模式R(U)的一個候選碼。
? 【例2.5】?考慮如表2.16所示的學生成績關系模式,其中U = {學號, 姓名,系別,成績}。對于屬性“學號”,容易驗證:學號? ?{姓名,系別,成績},而{學號}∪{姓名,系別,成績} = U。根據定理2.1,“學號”是學生成績關系模式的一個候選碼。
?
?
?????????? 2.4.3 函數依賴的性質(Armstrong公理系統)
? 1974年Armstrong首次提出了這樣的一套推理規則,由此構成的系統就是著名的Armstrong公理系統。
? 在關系模式R(U)中,假設A, B, C, D為U的任意子集。在Armstrong公理系統中,基于函數依賴集F的推理規則可以歸結為以下3條:
ü 自反律:若C ??B,則B→C為F所蘊含(平凡函數依賴)。
ü 增廣律:若B → C為F所蘊含,則B∪D→C∪D為F所蘊含。
ü 傳遞律:若B→C且C→D為F所蘊含,則B→D為F所蘊含。
?
?
? 基于上述的推理規則,進一步得到下列的推理規則:
ü 自合規則:B→B。
ü 合并規則:若B→C且B→D,則B→C∪D。
ü 分解規則:若B→C∪D,則B→C且B→D。
ü 符合規則:若A→B且C→D,則A∪C→B∪D。
ü 偽傳遞規則:由B→C,A∪C→D,有A∪B→D。
?
?定理2.2?? 在關系模式R(U)中,B及B1, B2,…, Bn是U的子集,則B→B1∪B2∪…∪Bn成立的充分必要條件是B→Bi成立,其中i = 1,2,…,n。
?
?
?
2.5 關系模式的范式
? ?范式一共分為六個等級,從低到高依次是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BC范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
?? 高等級范式是在低等級范式的基礎上增加一些約束條件而形成的,等級越高,范式的約束條件就越多,要求就越嚴格。各種范式之間的包含關系可以描述如下:
?????????????????????????????? 5NF ??4NF ??BCNF ??3NF ??2NF ??1NF
?? 通過模式分解,可以將一個低級別的范式轉化為若干個高一級的范式,而這種轉化過程稱為規范化。
?
????????? 2.5.1 第一范式(1NF)
??? 定義2.8? 設R(U)是一個關系模式,U是關系R的屬性集,若U中的每一個屬性a的值域只包含原子項,即不可分割的數據項,則稱R(U)屬于第一范式,記為R(U)∈1NF。
? 【例子】表2.17所示。該數據表所對應的關系模式不屬于第一范式,因為其中每個元組在“學生人數”屬性上的屬性值都不是原子項,它們都可以再分,實際上它們都是由兩個原子項復合而成。為將其轉化為第一范式,需要將復合項(非原子項)分解為原子項即可,結果如表2.18所示。
?
?
?
?
? 【例2.6】假設有一個研究生信息管理系統,該系統涉及的信息主要包括導師信息、研究生信息以及所選課程信息(supervisor, student, course)等。設計了如下的一個關系模式:? SSC(學號, 姓名, 系別, 導師工號, 導師姓名, 導師職稱, 課程名稱, 課程成績) 。
???? 根據常識可以知道:
????????????? 一位研究生只有一位導師(不含副導師),但一位導師可以指導多位研究生;
????????????? 一位研究生可以選修多門課程,一門課程也可以被多位研究生選修;
????????????? 一位研究生選修一門課程后有且僅有一個成績;
????????????? 不同的課程,課程名是不相同的,即課程名是唯一。
??
基于以上語義信息可以知道:
??? 學號→{姓名, 系別}
??? 學號→導師工號
??? 導師工號→{導師姓名, 導師職稱}
??? {學號, 課程名稱}→課程成績
?根據Armstrong公理及定理2.2可以推知:
? {學號, 課程名稱}→{學號, 姓名, 系別, 導師工號, 導師姓名, 導師職稱, 課程名稱, 課程成績}
?且可以進一步推知:
? {學號, 課程名稱}???? {學號, 姓名, 系別, 導師工號, 導師姓名, 導師職稱, 課程名稱, 課程成績}
?根據定義2.7,{學號, 課程名稱}是關系模式SSC的候選碼,實際上是唯一的候選碼,所以故只能選擇它為模式的主碼。
?
?
?
關系模式SSC存在的缺點:
?????? 數據冗余
??? 關系中每個元組既包含研究生信息,也包含導師信息以及所選課程的信息。一位導師可指導多名研究生,每個研究生對應的元組都包含同一個導師的相同信息。一位導師帶有多少名研究生就有多少條重復的導師信息。造成了數據冗余,如果數據量很大,就會浪費大量的存儲空間,為這些數據的維護付出巨大的代價。
?????? 插入異常
??? 假設某個老師剛剛被聘為研究生導師,但還沒有招收學生(這種情況經常出現),這時也就沒有他的研究生信息和研究生選修課程的信息,意味著“學號”和“課程名稱”等屬性的屬性值為空(null)。如果這時在關系SSC中插入該導師的信息,則會產生異常。因為屬性“學號”和“課程名稱”是主碼,其取值不能為空。這種異常就是插入異常。插入異常的存在使得添加導師信息的操作無法完成。
?
?
????????????? 刪除異常
??? 假設某個導師剛招收了兩名研究生,但過了一個學期以后,這兩個研究生都因出國而注銷學籍了。注銷時,將這兩個研究生對應的元組從關系SSC中刪除(全部刪除)。由于刪除操作是以元組為單位進行的,所以導師信息也將全部被刪除,以后就無法使用該導師的信息了,稱為刪除異常。
??? 關系模式SSC還容易產生數據不一致等其他的一些問題。僅滿足第一范式的關系模式確實還存在許多問題。人們在第一范式的基礎上增加一些約束條件,從而得到第二范式。
?
?
2.5.2 第二范式(2NF)
??? 定義2.9?? 設R(U)是一個關系模式,如果R(U)∈1NF且每個非主屬性都完全函數依賴于任一候選碼,則稱R(U)屬于第二范式,記為R(U)∈2NF。
l? 第二范式是在第一范式的基礎上,增加了條件“每個非主屬性都完全函數依賴于任一候選碼”,它比第一范式具有更高的要求。
l? 如果一個關系模式的候選碼都是由一個屬性構成,該關系模式肯定屬于第二范式,此時每個非主屬性都顯然完全函數依賴于任一候選碼。
l? 如果一個關系模式的屬性全是主屬性,則該關系模式也肯定屬于第二范式,此時不存在非主屬性。
?
?
?
? 【例2.7】例2.6中的關系模式SSC(學號, 姓名, 系別, 導師工號, 導師姓名, 導師職稱, 課程名稱, 課程成績)。該關系的唯一候選碼為{學號, 課程名稱},因此“姓名”, “系別”, “導師工號”, “導師姓名”, “導師職稱”, “課程成績”等6個屬性為其非主屬性。不存在“學號”相同而“姓名”不同的研究生元組,“姓名”函數依賴于“學號”,即“學號→ 姓名”。非主屬性“姓名”并非完全函數依賴于碼{學號, 課程名稱},此關系模式不屬于第二范式。
? 因為關系模式SSC僅屬于第一范式而不屬于第二范式,這決定了它還存在數據冗余、插入異常和刪除異常等問題。我們通過模式的投影分解,將之分解為若干個子模式,使得每個子模式都屬于第二范式,從而解決上述問題。
? 先考察關系模式SSC中的函數依賴:
ü 學號→姓名
ü 學號→系別
ü 學號→導師工號
ü 導師工號→導師姓名
ü 導師工號→導師職稱
ü {學號, 課程名稱}?????? 課程成績
?
?
l? 由于“學號”和“導師工號”都是單屬性,因此上述函數依賴都是完全函數依賴,一共有三種類型,因此在進行投影分解后可得到如下的三個關系模式:
? Student(學號, 姓名, 系別, 導師工號)
? supervisor(導師工號, 導師姓名, 導師職稱)
? course(學號, 課程名稱, 課程成績)
l? 這三個關系模式的碼分別為學號、導師工號和{學號, 課程名稱},每個關系模式中非主屬性都完全函數依賴于碼。這三個關系模式都屬于第二范式。
l? 利用基于外碼的自然連接可以將這三個關系合成原來的關系SSC,即 SSC = student??導師工號supervisor??學號course。外碼的設置如:“導師工號”是student的關于supervisor的外碼,“學號”是course的關于student的外碼。
l? 一個關系模式的碼都是由一個屬性構成,該關系模式肯定屬于第二范式,因為這時每個非主屬性都顯然完全函數依賴于碼。
?
? 【例2.8】設有關系模式teacher(課程名, 任課教師名, 任課教師職稱),表2.19為關系模式teacher的一張關系表。假設每名教師可以上多門課,每門課只由一名教師上,請問關系模式teacher屬于幾范式?
?
關系模式teacher的候選碼只有“課程名”,而“任課教師名”和“任課教師職稱”都是非主屬性。顯然有函數依賴集{課程名→任課教師名, 任課教師姓名→任課教師職稱, 課程名任課教師職稱},即每個非主屬性都完全依賴于候選碼,故關系模式teacher屬于2NF。
?
?
?
上例中關系模式teacher屬于2NF,仍存在數據冗余和插入、刪除操作異常。
?
?? 【例子】若某任課教師上多門課,則需要在teacher表中存儲多次該教師的職稱信息(數據冗余);對于一個新來教師,如果其還沒有排課,那么將無法輸入該教師的信息,因為課程名作為主碼不能為空(插入異常);又如刪除一個任課教師的所有任課記錄,則找不到該任課教師姓名和職稱信息了(刪除異常)。導致這種數據冗余和操作異常的原因在于該關系模式中存在傳遞函數依賴,這將在2.5.3節舉例說明。
?
2.5.3 第三范式(3NF)
???? 定義2.10?? 設R(U)是一個關系模式,如果R(U)∈2NF且每個非主屬性都不傳遞函數依賴于任一候選碼,則稱R(U)屬于第三范式,記為R(U)∈3NF。
????????? 注意,如果一個關系模式的屬性全是主屬性,那該關系模式肯定屬于第三范式,因為該關系模式不存在非主屬性。
??? 【例2.9】假設有一個關于學生選課信息的關系模式——s_c(學號, 課程號, 名次),其相關語義是:學號和課程號分別是學生和課程的唯一標識屬性,每一名學生選修的每門課程有一個名次,且名次不重復。
? 其函數依賴包括:{學號, 課程號} → 名次,{課程號, 名次} → 學號。{學號, 課程號}和{課程號, 名次}是此關系的候選碼。其所有的屬性都是主屬性,此關系模式屬于第三范式。
l? 第三范式是在第二范式的基礎上,增加了條件“每個非主屬性都不傳遞函數依賴于任一候選碼”而得到的。
?
?
【例2.10】假設有一個關于員工信息的關系模式:emp_info(Eno, Ename, Dept, Dleader)。其中,Eno為員工編號,Ename為員工姓名,Dept為員工所在部門,Dleader為部門領導。請說明該關系模式屬于第幾范式以及它存在的問題。
? 員工編號是唯一的,每個員工只屬于一個部門,每個部門只有一個領導(這里假設領導不屬于員工范疇,且不考慮縱向領導關系)。員工編號(Eno)為唯一的碼,由此容易推出:???
? Eno → Ename
?? ???????????? Eno → Dept
?????????????????????? Eno → Dleader
? 顯這些函數依賴都是完全函數依賴。這些函數依賴說明了所有非主屬性都完全函數依賴于碼Eno,所以關系模式emp_info屬于第二范式。但該關系模式還存在下列的函數依賴:???????????
Eno→Dept
????????? Dept→Dleader
????????? Eno→Dleader
?
l? 上述說明非主屬性Dleader傳遞函數依賴于碼Eno,即關系模式emp_info中存在傳遞函數依賴,它不屬于第三范式。傳遞函數依賴的存在同樣會導致一定程度的數據冗余以及插入異常和刪除異常等問題。這體現在:
? 一個部門有多個員工,每一個員工在關系emp_info中都形成一個元組。該元組除了包含員工編號和姓名外,還包含所在部門和部門領導的信息。后兩項信息會多次重復出現,重復的次數與部門的員工數相等。這是數據冗余的根源。
? 數據冗余的存在導致數據維護成本增加。
? 當一個部門剛成立時,如果還沒有招員工,那么將無法輸入部門和部門領導的信息(主碼Eno的輸入值不能為null)。這就造成了插入異常。
? 出于某些原因,部門的員工可能全部辭職,或者暫時全部轉到其他部門去時,需要將所有的員工信息全部刪除,這時部門和部門領導的信息也將被刪除。這就導致了刪除異常。
?
?
l? 為消除傳遞函數依賴,可以使用投影分解法將關系模式分解成相應的若干個模式
???? 【例子】根據存在的傳遞鏈“Eno→Dept→Dleader”,可以從節點“Dept”上將此傳遞鏈切開,形成以下兩個模式:
???????????? emp_info2(Eno, Ename, Dept)
???????????? dept_info2(Dept, Dleader)
關系模式emp_info2的碼為Eno,dept_info2的碼為Dept。
l? 在消除傳遞函數依賴后得到的兩個關系模式emp_info2和dept_info2都屬于第三范式,它們當中都不存在傳遞函數依賴。
??? 【例子】可以在沒有員工信息的前提下插入部門信息;可以刪除所有的員工信息而不影響部門信息;數據冗余度也有所降低了,從而也簡化了其他的一些操作等。
l? 屬于3NF的關系模式主要是消除了非主屬性對于候選的傳遞函數依賴和部分函數依賴,但并沒有考慮主屬性和候選碼之間的依賴關系。它們之間存在的一些依賴關系也會引起數據冗余和操作異常等問題。人們提出了更高一級的范式——BC范式。
?
?
2.5.4 BC范式(BCNF)
???? 定義2.11?? 設R(U)是一個關系模式且R(U) ∈1NF,如果對于R(U)中任意一個非平凡的函數依賴B→C,B必含有候選碼,則稱R(U)屬于BC范式,記為R(U)∈BCNF。
l? 如果要求B→C為非平凡的且完全的,則要求該函數依賴的決定因素為候選碼即可。
l? 在BC范式的定義中并沒有明確提出其中的關系要屬于3NF,但是該定義確實保證了“其非主屬性既不部分函數依賴于候選碼,也不傳遞函數依賴于候選碼”,因而BCNF為3NF的一個子集,即BCNF?3NF。
?
?
?
對于BC范式中的每一個關系R(U),它們具有下列的性質:
u R(U)中的每一個非主屬性都完全函數依賴于任何一個候選碼。假設存在一個非主屬性attr部分函數依賴于一個候選碼B0,即B0?→^p?attr。由部分函數依賴的定義,必存在B0的一個真子集B0′,使得B0′→attr。由于B0′→attr是一個非平凡函數依賴。根據BCNF的定義,B0′必包含某一個候選碼C0。由于候選碼B0的真子集包含該候選碼C0,所以B0也包含C0且C0異于B0。這說明一個候選碼包含一個異于自己的另外一個候選碼,這是不可能的。
u R(U)中的每一個主屬性完全函數依賴于任何一個不包含它的候選碼。假設存在一個主屬性attr并非完全函數依賴于某一個不包含它的候選碼B0。當選擇該候選碼B0為主碼時,attr也不完全函數依賴于主碼B0。這與主碼的定義相矛盾。
u R(U)中沒有屬性完全函數依賴于非候選碼(包括主碼)的屬性集。假設存在一個異于任何一個候選碼的屬性集B0和某一個屬性attr,使得屬性attr完全函數依賴于B0,即B0??? ??attr。但由于B0???→^f???attr,所以顯然有B→attr。由BCNF的定義,B0必包含某一個候選碼C0。因為B0異于任何一個候選碼,所以B0≠C0,因而B0真包含C0,C0為B0的一個真子集。由于C0為候選碼,所以C0→attr。這說明,存在B0的一個真子集C0,使得C0→attr。但這與B0?→^f?attr相矛盾。
?
?
?
????? 定理2.3? 設R(U)是一個關系模式,且R(U)?3NF,如果R(U)只有一個候選碼,則R(U)?BCNF。
???? 證明:對于R(U)中任意一個非平凡函數依賴C→D,假設R(U)唯一的候選碼為B,只要證明C包含B即可。
???? 假設C不包含B,即B ??C。由于B為候選碼,所以B???→^f? ?U,進而可知B→U。因為C和D都為U的子集,所以由Armstrong公理,U→C,U→D,于是B→C,B→D;由于C→D為非平凡函數依賴,所以D ?C;由于C是任意的,所以C ???B;加上條件假設B ? C,于是:
????????? D ??C,B ??C,C??→/????B
??????????? B→C
??????????? C→D
????????? B→D
??? D傳遞依賴于B,這與R∈3NF矛盾。證畢。
??? 特別地,在一個屬于3NF的關系中,當僅有一個屬性能夠唯一標識每個元組時,則這個關系屬于BCNF,且該屬性為唯一的候選碼(也只能以它為主碼)。
?
?
? 【例2.11】觀察例2.10中分解后形成的關系模式:emp_info2(Eno, Ename, Dept)
u 該關系模式中既沒有部分函數依賴也沒有傳遞依賴,所以屬于3NF。且由于僅有唯一的屬性Eno能夠唯一標識每一個元組,所以這個關系屬于BCNF。??
u 定理2.3看起來非常簡單,但它非常有用。在許多情況下,設計的關系往往都是有且僅有一個能夠唯一標識每一個元組的屬性,這時只要保證不存在對該屬性的部分函數依賴和傳遞函數依賴即可保證該關系屬于BCNF,而不用對BCNF的定義進行驗證,從而避免了復雜的驗證過程,提高設計效率。
u 定理2.3中的條件只是一個關系屬于BCNF的充分條件,但不是必要條件。也就是說,滿足該定理條件的關系必屬于BCNF,但不滿足該定理條件的關系也可能屬于BCNF,如例2.12。
?
?
?? 【例2.12】?對于學生住宿關系模式StuDom(學號, 姓名系別, 宿舍)而言,假定“姓名”屬性也具有唯一性,那么關系模式StuDom擁有兩個由單屬性組成的候選碼,分別是“學號”和“姓名”。由于非主屬性,即“系別”和“宿舍”,不存在對任一候選碼的部分或傳遞函數依賴,所以關系模式StuDom屬于第三范式。同時關系模式StuDom中除“學號”和“姓名”外沒有其它決定因素,所以StuDom關系模式屬于BC范式。
u此例中,關系模式StuDom有兩個候選碼,分別是“學號”和“姓名”,而不是只有一個候選碼(不滿足定理2.3的條件),但它卻屬于BC范式。
u那么有沒有屬于第三范式的關系模式卻不屬于BC范式的情況呢?
?
?
? ??【例2.13】對教學關系模式Teach(學生, 教師, 課程),若每一名教師只教授一門課,每門課可由多名任課教師教授,某一名學生選定某門課即對應一個固定的教師。得到下述函數依賴集:
???? {學生, 課程}→教師
???? {學生, 教師}→課程
???? 教師→課程
? {學生, 課程}和{學生, 教師}均是候選碼。因為沒有任何非主屬性對碼的傳遞函數依賴或部分函數依賴,故關系模式Teach屬于三范式。關系模式Teach不屬于BC范式,因為函數依賴“教師→課程”的決定因素——“教師”不含任一候選碼。
u 如果一個關系模型中的關系模式都屬于BCNF,則稱該關系模型滿足BCNF,稱基于該關系模型的關系數據庫滿足BCNF。
u 一個滿足BCNF的關系數據庫已經極大地減少數據的冗余,對所有關系模式實現了較為徹底的分解,消除了插入異常和刪除異常,已經達到了基于函數依賴為測度的最高規范化程度。
?
2.6 關系模式的分解和規范化
l? 2.6.1 關系模式的規范化
?? 關系模式的規范化實際上就是通過模式分解將一個較低范式的關系模式轉化為多個較高范式的關系模式的過程。
???? 從范式變化的角度看,關系模式的規范化是一個不斷增加約束條件的過程;
???? 從關系模式變化的角度看,規范化是關系模式的一個逐步分解的過程。
?? 關系模式的分解是關系模式規范化的本質問題,其目的是實現概念的單一化,即使得一個關系僅描述一個概念或概念間的一個種聯系。通過分解可以將一個關系模式分成多個滿足更高要求的關系模式,這些關系模式可以在一定程度上解決或緩解數據冗余、更新異常、插入異常、刪除異常等問題。
?? 關系模式分解實際上又是一個關系模式的屬性投影和屬性重組的過程,又稱投影分解。投影和重組的基本指導思想是逐步消除數據依賴中不適合的成分,結果將產生多個屬于更高級別范式的關系模式。
?
u 投影分解的步驟就是低級范式到高級范式轉化的步驟,具體步驟是:
? 基于消除關系模式中非主屬性對候選碼的函數依賴的原則,對1NF關系模式進行合理的投影(屬性重組),結果將產生多個2NF關系模式。?
? 基于消除關系模式中非主屬性對候選碼的傳遞函數依賴的原則,對2NF關系模式進行合理的投影,結果將產生多個3NF關系模式。?
? 基于消除關系模式中主屬性對候選碼的傳遞函數依賴的原則,對3NF關系模式進行合理的投影,結果將產生多個BCNF關系模式。
?
?
2.6.2 關系模式的分解
????????????? 連接無損分解
??? 定義2.12?? 假設一個關系模式R(U)被分解成n個子關系模式:R1(U1),R2(U2),…, Rn(Un),其中U = R1(U1)∪R2(U2)∪…∪Rn(Un),并假設r, r1, r2,…, rn分別屬于關系模式R(U)及n個子關系模式的關系(二維表),如果這n個子關系的自然連接與原關系r相等,即r = r1?? ?r2????? …???? rn,那么這種分解稱為(自然)連接無損分解,其中ri是r在Ui上的投影, i = 1,2,…n。
?? 分解的基本思想之一是消除對候選碼的部分函數依賴和傳遞函數依賴。我們可以先在待分解的關系模式中找出這些部分函數依賴和傳遞函數依賴以及完全函數依賴,然后“分解”部分函數依賴和傳遞函數依賴,使得這些函數依賴最終都變成完全函數依賴,最后將這些完全函數依賴所涉及的屬性分別投影成新的關系即可。
??? ?
?
?? 【例2.14】對于例2.6中的關系模式SSC(學號, 姓名, 系別, 導師工號, 導師姓名, 導師職稱, 課程名稱, 課程成績),請運用模式分解方法將其轉化為若干個屬于BC范式的關系模式。
? 關系模式SSC中唯一的候選碼為{學號, 課程名稱}。我們先找出對候選碼的所有完全函數依賴、部分函數依賴和傳遞函數依賴:
???? {學號, 課程名稱}???? 課程成績
???? {學號, 課程名稱}???? {姓名, 系別}
???? {學號, 課程名稱}???? 導師工號
???? 導師工號????? {導師姓名, 導師職稱}
???? {學號, 課程名稱}????? {導師姓名, 導師職稱}
?
?
?
?
u 以下找出部分函數依賴中的完全函數依賴:
??? 由“{學號, 課程名稱}????? {姓名, 系別}”得到“學號????? {姓名, 系別}”
??? 由“{學號, 課程名稱}???? 導師工號?”得到“學號????? 導師工號”
u 我們根據以上所有的完全函數依賴初步設定分解成的各關系模式(原則是“一個完全函數依即為一個關系模式”):
? T1(學號, 課程名稱, 課程成績)
? T2(導師工號, 導師姓名, 導師職稱)
? T3(學號, 姓名, 系別)
? T4(學號, 導師工號)
?
?
?
u 為了減少數據冗余和減少數據維護的復雜性,可以將關系模式T4(學號, 導師工號)并到T3(學號, 姓名, 系別)中,從而形成新的關系模式——T3′(學號, 姓名, 系別, 導師工號)。這樣,就得到如下的分解結果:
? T1(學號, 課程名稱, 課程成績)
? T2(導師工號, 導師姓名, 導師職稱)
? T3′(學號, 姓名, 系別, 導師工號)
u 由定理2.3稍加分析可以知道,以上三個關系模式均屬于BC范式,而且上述的分解是連接無損分解。
?
?
?????? 定理2.4?? 假設S和T為關系模式R分解后所得到的兩個關系模式,則該分解為連接無損分解的充分必要條件是:(S∩T) → (S-T)或(S∩T) → (T-S)
?
?
2. 保持函數依賴的分解
????? 定義2.13?? 設R(U)是一個關系模式,F為R(U)的一個函數依賴集,B,C為R(U)所涉及的屬性集的子集。如果利用Armstrong公理系統中的推理規則能夠從函數依賴集F中推出B→C,則稱F邏輯蘊涵B→C。F所邏輯蘊涵的函數依賴的集合稱為F的閉包,記為F+。
????? 定義2.14?? 設一個關系模式R(U)被分解成n個關系模式:R1, R2,…, Rn,F為R(U)的屬性間函數依賴的集合,F1, F2,…, Fn分別為F在R1, R2,…, Rn上的投影。對于任意F所邏輯蘊涵的函數依賴B→C,總存在某一個Fi,使得Fi邏輯蘊涵B→C,則這種分解稱為保持函數依賴的分解。?
?
?
3. 既保持函數依賴又具有自然連接無損的分解
? 連接無損分解和保持函數依賴的分解是兩個相互獨立的模式分解。但它們的優缺點具有一定的互補性。
? 連接無損分解可以保證分解所得到的關系模式經過自然連接后又得到原關系模式,不會造成信息的丟失。這種分解可能帶來數據冗余、更新沖突等問題。
???? 原因:連接無損分解不是按照關系模式所蘊涵數據語義來進行分解。而保持函數依賴的分解則正好是按照數據語義來進行分解,它可以使分解后的關系模式相互獨立。避免由連接無損分解帶來的問題,但它在某些情況下可能造成信息丟失。一個自然的想法就是構造這樣的分解:該分解既是保持函數依賴的分解,又具有自然連接無損的特性。這種分解就稱為既保持函數依賴又具有自然連接無損的分解。
?
?
???? 【例2.15】? 考慮例2.10中的關系模式:emp_info(Eno, Ename, Dept, Dleader)
? Eno為員工編號,Ename為員工姓名,Dept為員工所在部門,Dleader為部門領導。如果將該關系模式分解為:emp_info1(Eno, Ename, Dept)和emp_info2(Eno, Dleader)。易驗證,這種分解雖然是連接無損分解,但會造成數據冗余、更新異常等問題。進一步分析還可以發現,該分解不保持函數依賴。例如,函數依賴Dept→Dleader既不被emp_info1的函數依賴集所邏輯蘊涵,也不為emp_info2的函數依賴集所邏輯蘊涵。
? 現在我們將關系模式emp_info(Eno, Ename, Dept, Dleader)分解成如下的兩個模式:
????????? emp_info2(Eno, Ename, Dept)
????????? dept_info2(Dept, Dleader)
? 可以驗證,這種分解方法保持了函數依賴,同時又具有自然連接無損的特性,它是既保持函數依賴又具有自然連接無損的分解。
?
?
轉載于:https://www.cnblogs.com/ZanderZhao/p/11056314.html
總結
以上是生活随笔為你收集整理的20321关系数据库理论基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker安装、源、网络
- 下一篇: Get Form type using