文章目錄
0.思維導圖
1.爲什麼要學習關係數據庫規範化理論?
感性認識:
- 當我們面對一個實際問題時,我們應該如何去建數據庫,建表,庫的結構,表的結構我們該如何組織,才能更好的解決問題。
- 如何省內存,提高查詢修改刪除更新的效率?
- 如何避免可能出現的隱患,如修改刪除更新插入等異常?
- 以上就是關係
數據庫規範化理論
研究解決的問題,說白了就是告訴你如何才能設計出合適的庫和表
下面我們回顧幾個概念和問題,以便更好地學習後面的關係數據庫規範化理論
(1)基本概念回顧
-
關係:可簡單的理解爲二維表
-
關係模式:即二維表的邏輯結構
-
關係數據庫:指採用了關係模型來組織數據的數據庫,其以行和列的形式存儲數據,
關係型數據庫這一系列的行和列被稱爲表,一組表組成了數據庫
。 -
關係數據庫的模式:即關係數據庫的邏輯結構
(2)關係模式的形式化定義
- 這裏我們回顧一下《數據庫系統概論》中對二維表結構的定義
關係模式由五部分組成,即它是一個五元組:
R(U, D, DOM, F)
R: 關係名,即表名
U:組成該關係的屬性名集合
D: 屬性組U中屬性所來自的域。數據的取值範圍和類型
DOM: 屬性向域的映象集合
F:屬性組U上的一組數據依賴。
關係數據庫規範化理論研究的就是R、F、U,之間的關係。
因爲D和DOM對研究表的設計關係不大,所以在學習關係數據庫規範化理論時可以將五元組簡化成三元組
三元組:
R(U, F)
當且僅當U上的一個關係r
滿足F
時,r
稱爲關係模式 R(U, F)的一個關係
(3)什麼是數據依賴F?
這裏我們對F
中的數據依賴
進行簡單解釋,後面會詳細敘述函數依賴
和多值依賴
。
數據依賴
是一個關係內部屬性與屬性之間的一種約束關係。
這種約束關係是通過屬性間值的相等與否體現出來的數據間相關聯繫
。
它是現實世界屬性間相互聯繫的抽象,是數據內在的性質,是語義的體現。
數據依賴分類:
- 函數依賴(Functional Dependency,簡記爲FD)
函數依賴極爲普遍地存在於現實生活中。比如描述一個學生的關係,可以有學號(Sno)、姓名(Sname)、 系名(Sdept) 等幾個屬性。由於一個學號只對應一個學生,一個學生只在一一個系學習。因而當“學號”值確定之後,學生的姓名及所在系的值也就被唯一地確定了。
屬性間的這種依賴關係類似於數學中的函數y=f(x),自變量x確定之後,相應的函數值y也就唯一地確定 了。
- 多值依賴(Multivalued Dependency,簡記爲MVD)
- 其他
(4)數據依賴F對關係模式的影響
- 因爲
關係數據庫規範化理論
主要研究的是三元組R(U,F)
,U我們都好理解,最重要的是F,這裏我們簡單的瞭解一下F對關係模式,即表的邏輯結構的影響,讓我們理性的認識爲什麼學習關係數據庫規範化理論
舉個例子:
[例1]建立一個描述學校教務的數據庫,數據庫涉及的對象有:
學生的學號(Sno)、所在系(Sdept)、系主任姓名(Mname)、課程名(Cname)、成績(Grade)
這裏我們用單一的關係模式Student來表示這些對象:
Student <U、F>
該關係的屬性集合:
U ={ Sno, Sdept, Mname, Cname, Grade }
這裏說明一下現實世界的事實語義,關於這些對象之間的聯繫:
①一個繫有若干學生,但一個學生只屬於一個系。
②一個系只有一名(正職)負責人。
③一個學生可以選修多門課程,每門課程有若干學生選修。
④每個學生學習每一一門課程有一個成績。
於是得到屬性組U上的一組函數依賴F
F={Sno- > Sdept, Sdept- >Mname, (Sno, Cno)- >Grade}
(如圖所示)
- 如果只考慮函數依賴這一種數據依賴, 可以得到一個描述學生的關係模式Student <U,F>。表6.1是某一時刻關係模式Student的一個實例,即數據表。
這個關係模式設計的並不好,存在以下問題:
1️⃣ 數據冗餘(Data redundancy)
- 比如,每一個系的系主任姓名重複出現,重複次數與該系所有學生的所有課程成績出現次數相同,如表6.1所示。這將浪費大量的存儲空間。
2️⃣ 更新異常(update anomalies )
- 由於數據冗餘,當更新數據庫中的數據時,系統要付出很大的代價來維護數據庫的完整性,否則會面臨數據不一致的危險。 比如,某系更換系主任後,必須修改與該系學生有關的每一個元組。
3️⃣ 插入異常(insertion anomalies )
- 如果一個系剛成立,尚無學生,則無法把這個系及其系主任的信息存入數據庫。
4️⃣ 刪除異常( deletion anomalies)
- 如果某個系的學生全部畢業了,則在刪除該系學生信息的同時,這個系及其系主任的信息也丟掉了。
鑑於存在以上種種問題,可以得出這樣的結論:
Student關係模式不是一個好的模式
。“好”的模式:
不會發生插入異常、刪除異常、更新異常,數據冗餘應儘可能少- 原因:由存在於模式中的
某些數據依賴
引起的 - 解決方法:通過
分解關係模式
來消除其中不合適 的數據依賴
可以把這個單一模式分成3個關係模式:
S(Sno,Sdept,Sno → Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
DEPT(Sdept,Mname,Sdept→ Mname)
這三個模式都不會發生插入異常、刪除異常的問題,數據的冗餘也得到了控制。
一個模式的數據依賴會有哪些不好的性質,如何改造一個不好的模式
,這就是接下來2.規範化
要討論的內容。
2.規範化—改造關係模式,解決插入異常、刪除異常、更新異常和數據冗餘問題。
(1)規範化研究什麼?
- 規範化討論如何
根據屬性間依賴情況來判定關係是否具有某些不合適的性質
- 通常
按屬性間依賴情況來區分關係規範化程度
爲第一範式、第二範式、第三範式和第四範式等
- 用來改造關係模式,
通過分解關係模式來消除其中不合適的數據依賴,以解決插入異常、刪除異常、更新異常和數據冗餘問題。
接下來我們依次學習以下內容,來更好的掌握規範化理論,來更好的設計表的結構,設計關係模式。
- 函數依賴
- 碼
- 範式
- 2NF
- 3NF
- BCNF
- 多值依賴
- 4NF
其中函數依賴、碼是爲了學習範式、1NF,2NF,3NF……打基礎
(2)函數依賴
這裏我們討論數據依賴F中的函數依賴,分爲以下幾種類型:
- 函數依賴
- 平凡函數依賴與非平凡函數依賴
- 完全函數依賴與部分函數依賴
- 傳遞函數依賴
① 函數依賴
注意:
函數依賴不是指關係模式R的某個或某些關係滿足的約束條件,而是指R的一切關係均要滿足的約束條件。
以下是一個錯誤的例子:
sno->sdept,sno應該唯一決定sdept
函數依賴和別的數據依賴樣是語義範疇的概念,只能根據語義來確定一個函數依賴。
例如,姓名→年齡這個函數依賴只有在該部門沒有同名人的條件下成立。如果允許有同名人,則年齡就不再函數依賴於姓名了。
② 平凡函數依賴與非平凡函數依賴
③ 完全函數依賴與部分函數依賴
④ 傳遞函數依賴
直接依賴這裏我們舉個例子:
BH(sno,idCard,address)
X:sno 學號
Y:idCard 身份證號
Z:address 住址
X->Y,Y->X,X<->Y,Y->Z
所以我們說Z直接依賴於X
(3)碼
- 碼是關係模式中的一個重要概念。在 碼的定義中有關碼的若干定義, 這裏用函數依賴的概念來定義碼。
- 碼唯一決定一個實體集
① 候選碼、超碼、主碼
② 主屬性和非主屬性
主屬性與非主屬性
- 包含在任何一個候選碼中的屬性 ,稱爲
主屬性(Prime attribute)
- 不包含在任何碼中的屬性稱爲
非主屬性(Nonprime attribute)
或非碼屬性(Non-key attribute)
舉幾個例子:
[例2]
關係模式S(Sno,Sdept,Sage),單個屬性Sno是碼
,
SC(Sno,Cno,Grade)中,(Sno,Cno)是碼
[例3]
關係模式R(P,W,A)
P:演奏者 W:作品 A:聽衆
一個演奏者可以演奏多個作品
某一作品可被多個演奏者演奏
聽衆可以欣賞不同演奏者的不同作品
碼爲(P,W,A),即All-Key
③ 外部碼
(4)範式
- 範式是符合某一種級別的關係模式的集合
- 關係數據庫中的關係必須滿足一定的要求。滿足不同程度要求的爲不同的範式。
- 級別越高,表設計的越合理
範式的種類:
各種範式之間存在聯繫:
- 某一關係模式
R爲第n範式
,可簡記爲R∈nNF。
一個低一級範式的關係模式,通過模式分解
可以轉換爲若干個高一級範式的關係模式的集合,這種過程就叫規範化
① 1NF
1NF的定義:
- 如果一個關係模式R的所有屬性都是
不可分的基本數據項
,則R∈1NF
- 第一範式是對關係模式的最起碼的要求。不滿足第一範式的數據庫模式不能稱爲關係數據庫
- 但是滿足第一範式的關係模式並不一定是一個好的關係模式
以下是一個滿足1NF,但不是好的關係模式的例子:
關係模式 S-L-C(Sno, Sdept, Sloc, Cno, Grade)
Sloc爲學生住處,假設每個系的學生住在同一個地方
- 這個例子中存在函數依賴,不是一個好的關係模式
圖形化表示:
S-L-C不是一個好的關係模式,一個關係模式 R不屬於2NF,就會產生以下幾個問題:
- (1)
插入異常
。假若要插入一個學生Sno=S7, Sdept =PHY, Sloc =BLD2, 但該生還未選課,即這個學生無Cno
,這樣的元組就插不進S-L-C中。因爲插入元組時必須給定碼值,而這時碼值的一部分 爲空,因而學生的固有信息無法插入。
- (2)
刪除異常
。假定某個學生只選一門課,如S4就選了一門課C3,現在C3這門課他也不選了,那麼C3這個數據項就要刪除。而C3是主屬性,刪除了C3,整個元組就必須一起刪除,使得S4的其他信息也被刪除了
,從而造成刪除異常,即不應刪除的信息也刪除了。 - (3)
修改複雜
。某個學生從數學系(MA)轉到計算機科學系(CS),這本來只需修改此學生元組中的Sdept分量即可,但因爲關係模式S-L-C中還含有系的住處Sloc屬性,學生轉系將同時改變住處,因而還必須修改元組中的Sloc分量。另外,如果這個學生選修了k門課,Sdept、 Sloc重複存儲了k次,不僅存儲冗餘度大
,而且必須無遺漏地修改k個元組中全部Sdept、Sloc 信息,造成修改的複雜化
。
爲什麼會有這些問題呢?
- 原因:
Sdept、 Sloc部分函數依賴於碼
。 - 解決方法(也就是2NF的處理方法)
S-L-C分解爲兩個關係模式
,以消除這些部分函數依賴
SC(Sno, Cno, Grade)
S-L(Sno, Sdept, Sloc)
② 2NF
-
採用投影分解法將一個1NF的關係分解爲多個2NF的關係,可以在一定程度上減輕原1NF關係中存在的插入異常、刪除異常、數據冗餘度大、修改複雜等問題。
-
將一個1NF關係分解爲多個2NF的關係,並不能完全消除關係模式中的各種異常情況和數據冗餘。所以又引入了3NF。
③ 3NF
這裏我們對上面的2NF例子再次進行剖析:
解決方法:
- 採用投影分解法,把S-L
分解
爲兩個關係模式,以消除傳遞函數依賴
:
S-D(Sno, Sdept)
D-L(Sdept,Sloc) - S-D的碼爲Sno, D-L的碼爲Sdept。
分解後的關係模式S-D與D-L中不再存在傳遞依賴
-
採用投影分解法將一個2NF的關係分解爲多個3NF的關係,可以
在一定程度上解決原2NF關係中存在的插入異常、刪除異常、數據冗餘度大、修改複雜等問題。
-
將一個2NF關係分解爲多個
3NF
的關係後,仍然不能完全消除關係模式中的各種異常情況和數據冗餘。
④ BCNF
BCNF ( Boyce Codd Normal Form)是由Boyce與Codd提出的,比上述的3NF又進了一步,
通常認爲BCNF是修正的第三範式,有時也稱爲擴充的第三範式。
下面用幾個例子說明屬於3NF的關係模式有的屬於BCNF,但有的不屬於BCNF。
[例5] 關係模式C(Cno,Cname,Pcno)
C∈3NF
C∈BCNF
關係模式C(Cno, Cname, Peno), 它
只有一個碼Cno, 這裏沒有任何屬性對Cno部分依賴或傳遞依賴,所以C∈3NF。
同時C中Cno
是唯一的決定因素
, 所以C ∈BCNF。
[例6]關係模式S(Sno, Sname, Sdept, Sage)
假定S有兩個碼Sno,Sname
S∈3NF。
S ∈ BCNF
假定Sname也具有唯一性, 那麼S就有兩個碼,這兩個碼都由單個屬性組成,彼此不相交。其他屬性不存在對碼的傳遞依賴與部分依賴,所以S∈3NF。
同時S中除Sno、Sname外沒有其他決定因素
,所以S也屬於BCNF。
[例7]關係模式SJP(S,J,P)
SJP∈3NF,
SJP∈BCNF
[例6.7]關係模式SJP(S, J, P)中,S是學生,J表示課程,P表示名次。
每一個學生選修每門課程的成績有一定的名次,
每門課程中每一名次只有一個 學生(即沒有並列名次)。
由語義可得到下面的函數依賴:
(S,J)→P; (J,P)→S
所以(S,J) 與(J,P)都可以作爲候選碼
。
這兩個碼各由兩個屬性組成,而且它們是相交的。
這個關係模式中顯然沒有屬性對碼傳遞依賴或部分依賴。
所以SJP∈3NF,而且除(S,J)與(J,P)以外沒有其他決定因素,所以SJP∈BCNF。
[例8] 關係模式STJ(S, T, J)中,S表示學生,T表示教師,J表示課程。
每一教師只教一門課,
每門課有若干教師,
某一學生選定某門課, 就對應一個固定的教師。
由語義可得到如下的函數依賴。
(S,J)→T,(S,T)-J, T→J
函數依賴
關係可以用如圖表示
這裏(S,J)、 (S,T)都是候選碼
。
STJ是3NF,因爲沒有任何非主屬性對碼傳遞依賴或部分依賴
,
但STJ不是BCNF關係
,因爲T是決定因素,而T不包含碼。
如何解決才能讓STJ是BCNF關係呢?
⑤ 3NF與BCNF的關係
- 3NF和BCNF是在函數依賴的條件下對模式分解所能達到的分離程度的測度。
- 一個模式中的關係模式如果都屬於
BCNF
,那麼在函數依賴範疇內它已實現了徹底的分離,已消除了插入和刪除的異常。
3NF的“不徹底”性
表現在可能存在主屬性對碼
的部分依賴
和傳遞依賴
。
(5)多值依賴
- 前面我們講了數據依賴分爲函數依賴和多值依賴,函數依賴在上面已經敘述了,這裏我們再討論多值依賴。
用一個例子引入多值依賴:
[例9] 學校中某一門課程由多個教師講授,他們使用相同的一套參考書。每個教員可以講授多門課程,每種參考書可以供多門課程使用。
可以用一個非規範化的關係來表示教師T、課程C和參考書B之間的關係
把這張表變成一張規範化的二維表:
-
關係模型Teaching (C, T,B)的
碼是(C, T, B)
,即all-key
,因而Teaching∈BCNF。
-
但是當
某一課程(如物理)增加一名講課教師(如周英)時
,必須插入多個(這裏是三個)元組:
(物理,周英,普通物理學
),(物理,周英,光學原理
),(物理,周英,物理習題集
)。 -
同樣,
某一門課(如數學)要去掉一本參考書(如微分方程)
,則必須刪除多個(這裏是兩個)元組:
(數學,李勇
,微分方程
),(數學,張平
,微分方程
)。 -
可以看出對數據的增刪改很不方便,數據的冗餘也十分明顯。
-
仔細考察這類關係模式,發現它具有一種稱之爲
多值依賴
(Multi-Valued Dependency, MVD)的數據依賴。
① 多值依賴的定義
例如,在關係模式Teaching中,對於一個(物理,光學原理)有一組T值{李勇,王軍},這組值僅僅決定於課程C上的值(物理)。
也就是說對於另一個(物理,普通物理學),它對應的一組T值仍是{李勇,王軍},儘管這時參考書B的值已經改變了。
因此T多值依賴於C,即C→→T
。
② 平凡多值依賴和非平凡多值依賴
下面再舉一個具有多值依賴的關係模式的例子。
- 對於W的每一個值Wi, S有一個完整的集合與之對應而不問C取何值。所以W→→S(多值依賴)。
如果用圖下圖來表示這種對應
- 則對應W的某一個值Wi的全部S值記作{S}wi (表示此倉庫工作的全部保管員)
- 全部C值記作{C}wi (表示在此倉庫中存放的所有商品)。
- 應當有{S}wi中的每一個值和{C}wi中的每一個C值對應。
- 於是{S}wi與{C}wi之間正好形成一個完全二分圖,因而
W→→S
。 - 由於C與S的完全對稱性,必然有
W→→C
成立。
多值依賴具有以下性質:
③ 多值依賴與函數依賴的區別
(6)4NF
(7)規範化小結—重點歸納步驟
-
關係數據庫的規範化理論是數據庫邏輯設計的工具
-
目的:儘量消除插入、刪除異常,修改複雜,數據冗餘
-
基本思想:逐步消除數據依賴中不合適的部分
實質:·概念的單一化·
關係模式規範化的基本步驟:
參考:《數據庫系統概論第五版》—王珊