本章的目的:如何構造一個好的資料庫模式
6.1 問題的提出:
- 關系模式的表示:
- 關系模式由五部分組成,是一個五元組:R(U,D,DOM,F)
- R表示關系模式名
- U表示一組屬性
- D表示U的取值范圍,如Son的取值范圍是0-100
- DOM表示屬性的域映射,如age到整數100,中的映射
- F為屬性組U的組資料依賴,如函式依賴,多值依賴等等
- 細節:
- 由于D、DOM與模式設計關系不大,因此在本章把關系模式看作一個三元組:R<U,F>
- 當且僅當 U 上的一個關系 r 滿足 F 時, r 稱為關系模式 R 的一個關系
- 理解:U是一組屬性(如:學生表),如果有一個表里的資料滿足U這一組屬性(如:學生表),那么該表就是模式里的一個關系
- 作為二維表,關系要符合一個最基本的條件:每個分量必須是不可分的資料項,滿足了這個條件的關系模式就屬于第一范式(1NF)
- 理解:

- 理解:
-
資料依賴:
-
一個關系內部屬性與屬性之間的一種約束關系,通過屬性間值的相等與否體現出來的資料間相關聯系
-
- 資料依賴的主要型別:
- 函式依賴(簡記:FD)
- 理解:如:知道學生學號,推出學生姓名,知道學生選課號,推出課程名稱
- 多值依賴(簡記:MVD)
- 理解:如:和函式一樣,但它可以通過一個值推出多個資料
- 函式依賴(簡記:FD)
- 函式依賴在現實生活中的體現:
- 例1:描述一個學生關系,可以有學號、姓名、系名等屬性
- 一個學號只對應一個學生,一個學生只在一個系中學習,“學號”值確定后,學生的姓名及所在系的值就被唯一確定
- Sname=f(Sno),Sdept=f(Sno) 就即Sno函式決定Sname,Sno函式決定Sdept,記作Sno -> Sname,Sno->Sdpt
- 例2:建立一個描述學校教務的資料庫,涉及的物件包括:學生的學號(Sno)、所在系(Sdept)、系主任姓名(Mname)、課程號(Cno)、成績(Grade)
- 假設學校教務的資料庫模式用一個單一的關系模式 Student 來表示,則該關系模式的屬性集合為:U = {Sno,Sdept,Mname,Cno,Crade}
- 現實世界的已知事實(語意):
-
① 一個系有若干學生,但一個學生只屬于一個系
② 一個系只有一名(正職)負責人
③ 一個學生可以選修多門課程,每門課程有若干學生選修
④ 每個學生學習每一門課程有一個成績
-
-
由此可得到屬性組 U 上的一組函式依賴 F :F = {Sno -> Sdept, Sdept -> Mname, (Sno,Cno) -> Grade}
-

-
函式依賴存在的問題:
-
資料冗余:上述例子中,如果一個學生選擇了10本課程,那么系主任的名字就重復10次,就產生了資料冗余
-
更新例外:資料冗余,更新資料時,維護資料完整性代價大,如,系更換系主任后,必須修改與該系學生有關的每一個元組
-
插入例外:如果一個系剛成立,尚無學生,則無法把這個系及其系主任的資訊存入資料庫,因:學號是主碼,課程號是主碼,為空那么主任的資訊就不能插入
-
洗掉例外:如果某個系的學生全部畢業了,則在洗掉該系學生資訊的同時,這個系及其系主任的資訊也丟掉了,因主碼不能為空,為空了資訊怎么還存在
-
-
說明:
-
上述的Student關系模式不是一個好的模式,一個“好”的模式應當不會發生插入例外、洗掉例外和更新例外,資料冗余應盡可能少
-
存在以上問題的原因是這個模式中的函式依賴存在某些不好的性質
-
-
解決方法:用規范化理論改造關系模式來消除其中不合適的函式依賴
-
-
函式依賴的解決方式:
-
用規范化理論改造關系模式來消除其中不合適的函式依賴,就是盡可能的去減少一個表中的多個函式依賴
-
S(Sno,Sdept,Sno -> Sdept)
-
SC(Sno,Cno,Grade,(Sno,Cno) -> Grade)
-
DEPT(Sdept,Mname,Sdept -> Mname)
-
這三個模式都不會發生插入例外、洗掉例外的問題,資料的冗余也得到了控制
-
6.2 規范化:
- 什么是規范化?如何把不好的資料庫(各種函式依賴,資料冗余,更新例外,插入例外洗掉例外)的資料規范化
6.2.1 函式依賴:
- 什么是函式依賴?如:學號確定姓名,姓名確定學號,但不能一個學號確定多個姓名,一個姓名確定多個學號
- 例:如果Sname是不能重名的
- 有關函式的一些術語和記號:
- 細節1:對于任一關系模式,平凡函式依賴都是必然成立的,它不反映新的語意,若不特別宣告,總是討論非平凡函式依賴
- 細節2:x和y可以是一個,或者是一組
- X -> Y,但 Y?X,則稱 X→Y 是非平凡的函式依賴
- 理解:如(Sno,Sname) -> Grade, 那么Grade可以推出Sno或Sname嗎?不能這就是非平凡的函式依賴
- X -> Y,但 Y?X,則稱 X→Y 是平凡的函式依賴
- 理解:如(Sno,Sname) -> Sno,那么Sno 推出里面其中一個(Sno,Sname)就是平凡的函式依賴
- 若 X→Y,則 X 稱為這個函式依賴的決定屬性組,也稱為決定因素
- 如:通過系名得到系主任的名字,那么系名就是決定因素
- 若 X→Y,Y→X,則記作 X←→Y
- 若 Y 不函式依賴于X,則記作 X
Y - 完全函式依賴:記作: X
Y
- 什么是完全函式依賴?如:(Sno,Sname) -> Grade,但是Grade推不出來Sno,Sname
- 課本原文:在 R(U) 中,如果 X→Y,并且對于 X 的任何一個真子集 X′ , 都有 X′?Y, 則稱 Y 對 X 完全函式依賴記作 X
Y
- 部分函式依賴:記住:X
Y
- 什么是部分函式依賴?如:(Sno,Sname) -> sno或Sname,Sno可以推出(Sno,Sname)里的Sno
- 課本原文:若 X→Y,但 Y 不完全函式依賴于 X,則稱 Y 對 X 部分函式依賴記作 部分函式依賴:記住X
Y
- 例子:
-
傳遞函式依賴:記作:X
Z-
什么是傳遞函式依賴:如:(Sno) -> Sdept,Sdept->Mname,就是一個依賴于一個,學號知道系,系不能知道確定學號,系得到系主任
-
課本原文:在 R(U) 中,如果 X→Y (Y?X) , Y?X , Y→Z , Z?Y ,則稱 Z 對 X 傳遞函式依賴(transitive functional dependency),記為:X
Z -
細節:X和Y不能相互依賴X<->Y,否則就是Z直接依賴于X,就不是傳遞依賴了
-
6.2.2 碼:
- 細節:碼也稱“鍵"或"鍵碼"就是叫法不同性質一樣
- 候選碼:
- 什么是候選碼?給定一個值可以確定一條記錄,如學生表中的Sno或Sname(學生姓名不能重名),那么Sno和Sname就都是候選碼
- 課本原文:設 K 為 R 中的屬性或屬性組合,若 K→FU ,則 K 稱為 R 的候選碼(candidate key)
- 主碼:
- 什么是主碼?主碼來自候選碼,主碼只有一個,但是主碼可以是一個屬性或多個屬性組成,如Sno可以或(Sno,Sname)括號里面的都是主屬性
- 細節:候選碼中的誰都可以是主碼,但主屬性只有一個
- 課本原文:若關系模式 R 有多個候選碼,則選定其中的一個為主碼
- 超碼:
- 什么是超碼?是在主碼間擴招出來的,如:(Sno,Sage)Sno主碼加Sage形成一個超碼,候選碼就是最小的超碼
- 課本原文:如果 U 部分函式依賴于 K,即 K→PU ,則 K 稱為超碼(surpkey),候選碼是最小的超碼,即 K 的任意一個真子集都不是候選碼
- 全碼:
- 什么是全碼?所有屬性組成,才能確定一條記錄
- 外碼(外部碼):
- 什么是外碼?不是本表中的屬性,參考于其它表中的屬性,來確定資訊
- 例子:SC(Sno,Cno,Grade)中,Sno不碼,Sno是Student(Sno,Sdept,Sage)的碼,則Sno是SC的外碼
- 課本原文:關系模式 R 中屬性或屬性組 X 并非 R 的碼,但 X 是另一個關系模式的碼,則稱 X 是 R 的外部碼(foreign key),也稱外碼,主碼與外碼一起提供了表示關系(表)間的聯系的手段
- 主屬性和非主屬性:
- 主屬性和非主屬性是針對,候選碼和主碼來說的
- 主屬性:
- 什么是主屬性?包含在任何一個候選碼中的屬性,稱為主屬性
- 非主屬性:
- 什么是非主屬性?不包含在任何候選碼中的屬性
6.2.3 范式:
- 什么是范式?滿足一種級別的關系模式的集合
- 理解:關系資料庫中的表,必須滿足不同的要求,滿足的程度不同就是不同的范式
- 各種范式之間的存在聯系:
- 5NF ? 4NF ? BCNF ? 3NF ? 2NF ? 1NF
- 理解:2NF保護1NF,3NF包含2NF(2NF是包含1NF的),以此類推
- 5NF ? 4NF ? BCNF ? 3NF ? 2NF ? 1NF
- 規范化:是指一個低一級范式的關系模式,提供模式分解轉換為若干個高一級范式的關系模式集合的程序
- 模式分解:可以理解為把一個關系表分解為多個關系表
- 第一范式-1NF:只要基本表中不出現,像合并單元格的就是第一范式,第一范式是基本前題
- 第二范式-2NF:非主屬性(非候選碼),要完全函式依賴于任何一個候選碼
- 理解:一個表中函式依賴關系必須是完全函式依賴,不能是其他依賴
- 例子:S-L-C(Sno, Sdept, Sloc, Cno, Grade),Sloc 為學生的住處,并且每個系的學生住在同一個地方,S-L-C的碼為 (Sno,Cno),則函式依賴有:
-
(Sno, Cno)
Grade --> 完全函式依賴Sno → Sdept,
-
(Sno, Cno)
Sdept --> 部分函式依賴,不符合第二范式Sno → Sloc,
-
(Sno, Cno)
Sloc -> 部分函式依賴,不符合第二范式Sdept → Sloc(每個系的學生只住一個地方)
- 函式依賴關系如下:
- 實線是完全函式依賴
- 虛線是部分函式依賴
- 出現例子上不能形成第二范式的原因是,sdept、Sloc它是部分函式依賴
- 解決辦法:
- 用投影分解把關系模式S-L-C分解(前面說到的模式分解)成兩關系,消除部分函式依賴
- SC(Sno,Cno,Grade) 和 S-L(Sno,Sdept,Sloc)
- 雖然分成了兩個表,都是是有通過Sno進行表的聯系
- 一個關系模式不屬于第二范式,產生的問題:
- 插入例外、洗掉例外、修改復雜
- 第三范式-3NF:不能有傳遞依賴存,第三范式是包含第二范式,第三范式是在第二范式上改進(上述以說)
- 例子:S-L(Sno,Sdept,Sloc)該關系是上述案例模式分解出來的,它存在函式依賴,Sno -> Sdept -> Sloc,把該問題解決就可以升級為第三范式
- 解決辦法:S-D(Sno,Sdept)和D-L(Sdept,Sloc),該兩個關系中就不存在函式依賴
- BCNF范式:BCNF范式是第三范式改進版
- 滿足如下條件的就是BC范式:
- 1.所有非主屬性對每一個候選碼都是完全函式依賴
- 理解:不是碼的值,必須對候選碼完全函式依賴
- 2.所有主屬性對每一個不包含它的候選碼也是完全函式依賴
- 理解:碼可以推出碼,如Sno -> Sname(Sname不能重復)
- 3.沒有任何屬性完全函式依賴于非碼的任何一組屬性
- 理解:就是非碼,不能推出依賴關系
- 1.所有非主屬性對每一個候選碼都是完全函式依賴
- 滿足如下條件的就是BC范式:
- 例子:C(Cno,Cname,Pcno),它只有一個碼 Cno,沒有任何屬性對 Cno 部分依賴或傳遞依賴, 所以 C ∈ 3NF,同時 C 中 Cno 是唯一的決定因素,所以 C ∈ BCNF
- 理解:Cno -> Cname ;Cno -> Pcno,依賴關系都是候選碼符合條件第2點,沒有依賴關系符合第3點,第2點也符合
- 例子:S(Sno,Sname,Sdept,Sage),假定 Sname 也具有唯一性,那么 S 就有兩個碼,這兩個碼都由單個屬性組成,彼此不相交,其他屬性不存在對碼的傳遞依賴與部分依賴,所以 S ∈ 3NF,同時 S 中除 Sno,Sname 外沒有其他決定因素,所以 S 也屬于 BCNF
- 理解:Sno <-> Sname; (Sno,Sname)-> Sdept; (Sno,Sname) -> Sage ;Sno -> Sdept ;Sno-> Sage ;Sname -> Sage 符合條件的3點
- 例子:關系模式 SJP(S,J,P) 中, S 是學生,J 表示課程,P 表示名次,每一個學生選修每門課程的成績有一定的名次,每門課程中每一名次只有一個學生(即沒有并列名次)
- 理解:(S,J)→P ;(J,P) -> S ,(S,J)與(J,P)都可以作為候選碼
- 例子:關系模式 STJ(S,T,J) 中,S 表示學生,T 表示教師,J 表示課程,每一教師只教一門課,每門課有若干教師,某一學生選定某門課,就對應一個固定的教師,由語意可得到函式依賴(S,J)→T ,(S,T)→J , T→J ,
- 理解:因為沒有任何非主屬性對碼傳遞依賴或部分依賴,STJ∈ 3NF,因為 T 是決定因素,而 T 不包含碼, 所以 STJ? BCNF
6.3 資料依賴的公理系統:
-
閉包:
- 什么是閉包?就是通過候選碼去推匯出它的函式依賴(個人理解)
- 課本原文:在關系模式 R<U,F> 中為 F 所邏輯蘊涵的函式依賴的全體叫作 F 的閉包(closure),記為 F+
- 閉包記作:

-
例子1:
-

-
例子2:
-

-
例子3:
-

-
例子4:
-

-
例子5:
-

-
求候選碼:
- 什么是求候選碼?就是通過函式一拉的兩邊的出現屬性,通過屬性的閉包來確定候選碼
- 怎么求?:如果函式一拉的左邊出現,拼接和N合并去求閉包,看是否可以求出完整的閉包(就是整個R),能求出完整的閉包就是候選碼
- 如果有LR兩邊都出現的,就需要拿L去拼接去求閉包,拼接求出來完整閉包,的LR就不能在用來下一次的拼接
- R不要理
- L表示屬性只在函式依賴的左邊出現
- R表示屬性只在函式依賴的右邊出現
- LR表示屬性只在函式依賴的左右邊出現
- N表示函式依賴的兩邊都不出現
-
- 例子1:

- 例子2:
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/528107.html
標籤:SQL Server
