關系數據庫設計理論
關系數據庫設計理論
構造一個關系數據庫模式的方法可有多種
1、舉例(學生選課數據庫)
*數據庫模式的構造方法一
用一個關系模式來描述學生選課信息()
SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade )
*數據庫模式的構造方法二
*概念模型為(E-R圖):
m n
*將概念模型轉換為以下關系模式:
*學生表S tudent( S no , S name, S sex, S age, S dept) ;
*課程表C ourse( C no , C name, C pno, C credit)
*學生選課 SC( Sno,Cname ,Grade)
SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade )
|
S no |
S name |
S sex |
S age |
S dept |
C no |
C name |
C credit |
Grade |
|
001 |
張三 |
男 |
18 |
計 |
101 |
Pascal |
4 |
90 |
|
001 |
張三 |
男 |
18 |
計 |
102 |
操作系統 |
4 |
80 |
|
001 |
張三 |
男 |
18 |
計 |
103 |
編譯 |
3 |
98 |
|
001 |
張三 |
男 |
18 |
計 |
105 |
數據庫 |
4 |
87 |
|
001 |
張三 |
男 |
18 |
計 |
110 |
數據結構 |
4 |
70 |
|
002 |
李四 |
女 |
17 |
信電 |
103 |
編譯 |
4 |
82 |
|
002 |
李四 |
女 |
17 |
信電 |
105 |
數據庫 |
4 |
87 |
|
003 |
王五 |
男 |
19 |
化工 |
107 |
網絡 |
3 |
86 |
*學生表S tudent( S no , S name, S sex, S age, S dept) ;
*課程表C ourse( C no , C name, C pno, C credit)
|
C no |
C name |
C credit |
|
101 |
Pascal |
4 |
|
102 |
操作系統 |
4 |
|
103 |
編譯 |
3 |
|
105 |
數據庫 |
4 |
|
107 |
網絡 |
3 |
|
110 |
數據結構 |
4 |
*學生選課 SC( Sno,Cname ,Grade)
|
S no |
C no |
Grade |
|
001 |
101 |
90 |
|
001 |
102 |
80 |
|
001 |
103 |
98 |
|
001 |
105 |
87 |
|
001 |
110 |
70 |
|
002 |
103 |
82 |
|
002 |
105 |
87 |
|
003 |
107 |
86 |
|
S no |
S name |
S sex |
S age |
S dept |
|
001 |
張三 |
男 |
18 |
計 |
|
002 |
李四 |
女 |
17 |
信電 |
|
003 |
王五 |
男 |
19 |
化工 |
2、數據庫模式(關系模式)的不同構造方法與數據冗余度、插入異常、刪除異常、更新異常的關系
1) 冗余度比較
*方法1冗余度很大:學生信息冗余大(一個學生如選修n門課,其信息要重復存放n遍。如001號張三,重復存放5遍);課程信息冗余大(一門課程被 n 個學生選修,課程信息存放 n 次)
*方法2冗余度小:只有學號課程號有冗余。冗余度大大小于前一個,它僅有少量冗余數據,這些冗余數據保持在合理水平。
2) 更新異常(修改復雜)
*方法1:由于數據冗余,更新數據庫中的數據時,系統需要付出很大的代價來維護數據庫的完整性;
*方法2:修改復雜度大大減少。
3) 插入異常
*方法1:沒選課程的學生信息,沒被選修的課程信息,沒法插入到表中;(插入異常)
*方法2:不同信息存放在不同的關系中,不產生插入異常現象。
4) 刪除異常
*方法1:如某門課只有一個學生選修,學生畢業或因病退學后,刪除相關信息后,課程等信息也被全部刪除;(刪除異常)
*方法2:不同信息存放在不同的關系中,不產生刪除異常現象。
3、小結
1) 在關系數據庫設計中,關系模式的設計方案可以有多個;
2) 不同的設計方案有好壞之分;
3) 要設計一個好的關系模式方案,要以規范化理論作為指導,規范化理論研究屬性間的數據依賴關系,主要有函數依賴與多值依賴。關系規范化按屬性間不同的依賴程度分為第一范式、第二范式、第三范式、BC范式、第四范式。
4.1 函數依賴
函數依賴是關系模式內屬性間最常見的一種依賴關系
1、 關系中屬性間函數依賴舉例
學生關系屬性的集合U={ Sno,Sdept,Mname,Cname,Grade }
現實世界的已知事實:
1) 一個學生只屬于一個系(含義:學號確定后,學生所在的系也就被唯一確定了。類似于數學中的函數y=f(x),x=Sno,y= Sdept 。我們說 Sno 函數決定 Sdept, 或者說 ,Sdept 函數依賴于 Sno, 記做 sno → sdept ; 反過來一個系有若干學生(解釋系不能決定學生)
2) 一個系只有一名系主任(含義:系確定后系主任名被唯一確定了,類似于數學中的函數,我們說 Sdept 函數決定 Mname, 或者說 ,Mname 函數依賴于 Sdept 。記做 S dept → Mname )
3) 一個學生可以選修多門課,每門課程有若干學生選修(含義:學號與課程號間夠不成決定被決定關系)
4) 每個學生所學的每門課程都有一個成績,含義: (sno,cname) → Grade
屬性組 U 上的一組函數依賴 F={ sno → sdept, S dept → Mname,(sno,cname) → Grade }
2、 函數依賴定義(4 . 1)
設 R(U) 是一個關系模式, U 是 R 的屬性集合, X 和 Y 是 U 的子集。對于 R(U) 的任意一個可能的關系 r ,如果 r 中不存在兩個元組,他們在 X 上的屬性值相同,而在 Y 上屬性值不同,則稱“ X 函數決定 Y ”或“ Y 函數依賴于 X ” , 記作 X → Y
見下表,如Sno →Sname,則 不存在 藍色 兩元組(即學號確定后,姓名不確定):
|
S no |
S name |
S sex |
S age |
S dept |
|
001 |
張三 |
男 |
18 |
計 |
|
001 |
趙六 |
|
|
|
|
002 |
李四 |
女 |
17 |
信電 |
|
003 |
王五 |
男 |
19 |
化工 |
思考題:1)碼是否一定函數決定非碼屬性?非碼屬性間是否存在函數依賴
2)SNo → Sdept 成立 (Sno,Cno) → Sdept 是否也成立?
3)找出以下幾個表的中的函數依賴
SCG( S no , S name, S sex, S age, S dept , C no , C name, C pno, C credit,Grade )
*學生表S tudent( S no , S name, S sex, S age, S dept) ;
*課程表C ourse( C no , C name, C pno, C credit)
*學生選課 SC( Sno,Cname ,Grade)
函數依賴的幾點說明:
1) 函數依賴是所有關系實例(關系模式值的每一狀態)均要滿足的約束條件。
2) 函數依賴是語義范疇。只能根據語義確定函數依賴。如:在沒有同名的情況下“姓名 → 年齡”成立
3) 數據庫設計者可以對現實世界作強制的規定。
4) 若 X → Y ,則 X 稱為這個函數依賴的決定屬性集
5) 若 X → Y,Y → X 則記為 X Y
6) 若 Y 不函數依賴于 X ,則記為 X Y
3、 平凡函數依賴與非平凡函數依賴定義( 4.2 )
在關系模式 R(U) 中,對于 U 的子集 X 和 Y ,如果 X → Y ,但 Y 不是 X 的子集,則稱 X → Y 是非平凡函數依賴。若 Y 是 X 的子集,則稱 X → Y 為平凡函數依賴。
對于任一關系模式,平凡函數依賴都是必然成立的,它不反映新的語義。(為什么?)
4、 完全函數依賴與部分函數依賴
在關系模式 R(U) 中,如果 X → Y, 并且對于 X 的任何一個真子集 X' 都有 X' → Y ,則稱 Y 完全函數依賴于 X ,記作 X → Y( 少 f) 。若 X → Y ,但 Y 不完全函數依賴于 X ,則稱 Y 部分函數依賴于 X ,記 X → Y (少 P )。
5、 傳遞函數依賴
在關系模式 R(U) 中,如果 X → Y , Y → Z ,且 Y 不是 X 的子集, X 不函數依賴于 Y ,則稱 Z 傳遞函數依賴于 X 。
Std(Sno,Sdept,Mname) 有 Sno → Sdept, Sdept → Mname , Mname 傳遞函數依賴于 Sno
6、 碼
設 K 為關系模式 R( U, F )中屬性或屬性組。若 U 完全依賴于 K ,則 K 稱為 R 的一個侯選碼。若關系模式中有多個侯選碼,則選定一個作為主碼。
4.2范式
*1 NF :關系模式 R 的所有屬性都是不可分割的基本數據項,則 R ∈ 1NF
( 非主屬性函數依賴于碼 )
*不滿足1NF的舉例:
學生 ( 學號,姓名,年齡, 入學畢業年月 )
*1 NF 是關系模式的起碼要求
*第一范式舉例:
SLC(Sno,Sdept,Sloc,Cno,Grade)
屬性函數依賴情況:
(虛線表示部分函數依賴,實線表示完全函數依賴)
插入異常:未選課的學生不能插入,因為碼值部分為空( 原因是對碼的部分函數依賴造成 )。(解決問題的辦法:把部分函數以來部分分解出來)
刪除異常:某一學生的選課信息全部刪除后,學生的其他信息也被刪除,否則碼值部分為空(不允許)( 原因是對碼的部分函數依賴造成 )。(解決問題的辦法:把部分函數以來部分分解出來)
數據冗余度大:一個學生選修了多門課程,同一學生的基本信息( Ssept,Sloc )需要保存多次。( 原因是對碼的部分函數依賴造成 )。(解決問題的辦法:把部分函數以來部分分解出來)
修改復雜:修改某學生基本信息時,如果其選修多門課程,同一信息需要重復修改多次。( 原因是對碼的部分函數依賴造成 )(解決問題的辦法:把部分函數以來部分分解出來)
2 NF :滿足第一范式,非主屬性完全函數依賴于碼
前面的關系模式不滿足第二范式,分解為下面兩個模式后,部分函數依賴被消除:
SC(sno,cno,grade)
SL(Sno,Sdept,Sloc)
分解成第二范式后 SC(sno,cno,grade) , SL(Sno,Sdept,Sloc) 。以上4個問題在一定程度上得到了解決。
1) SL 關系中可以插入尚未選修的學生
2) 刪除學生選課關系,只涉及 SC 關系,不涉及 SL 中的學生基本信息。
3) 由于學生選課信息于學生基本信息分開存放,不論該學生選修了幾門課, Sdept 與 Sloc 值都只存儲一次。
4) 某學生轉系,只需要修改相關關系中的一個元組。
第二范式 SL 中存在傳遞函數依賴,使得 SL 仍然存在上述4個問題。
1) 插入異常:系剛成立,無在校學生,無法存入系信息。(解決問題的辦法:把與主碼無關的函數部分分解出來獨立構成關系模式,即消除 對主碼的傳遞函數依賴)
2) 刪除異常:某系的全部學生畢業了,系的信息也丟失了。(解決問題的辦法:把與主碼無關的函數部分分解出來獨立構成關系模式,即消除對主碼的傳遞函數依賴)
3) 數據冗余度大:每一個系的學生都住在同一個地方,關于系的住處信息卻要重復出現。
4) 修改復雜:當某系學生調整住處時,需要修改所有學生的 Sloc 屬性值。
造成上述4個問題的主要原因:非主屬性傳遞函數依賴于主碼。
解決辦法:將傳遞函數依賴關系分解出來。
3NF :滿足第2范式,且主屬性既不部分函數依賴于碼,也不傳遞函數依賴于碼
SL(Sno,Sdept,Sloc) 分解為
SD(sno,sdept)
DL(Sdept,Sloc)
規范化過程:
規范化過程即為關系模式的不斷分解過程。
規范化的實質:概念的單一化。
規范化的目的:
不斷解決關系插入異常、刪除異常、數據冗余度大、修改復雜問題。
3NF 是工程上的標準,在工程應用上,達到第三范式一般情況下就可以了
4.3 關系模式的規范化
1、 第一范式到第三范式的分解過程:分解關系模式消除非主屬性對碼的部分函數依賴,分解關系模式消除非主屬性對碼的傳遞函數依賴。
2、 關系模式的分解方法并不唯一,只有能夠保證分解后的關系模式與原關系模式等價的方法才有意義。
1) 分解具有無損連接性:分解后不能丟失信息,即分解前的關系與分解后關系的自然連接結果相等。
2) 分解后應能保持函數依賴。分解前的函數依賴F被分解后關系模式函數依賴F i 所邏輯蘊含
3) 分解既保持函數依賴,又保持無損連接。
3、 第3范式是工業標準
若要求分解既具有無損連接,又保持函數依賴,那么模式分解一定能達到3 NF ,但不一定能達到 BCNF 。
習題: P 143
第3題
學生(學號,姓名,出生年月,系名,班號,宿舍區)
班級(班號,專業名,系名,人數,入校年份)
系(系名,系號,系辦公室地址,人數)
學會(學會名,成立年份,地點,人數)
學生參加學會(學號,學會名,入會年份)
只考慮與1、2、3 NF 有關的函數依賴(非主屬性部分或完全函數依賴于碼,非主屬性傳遞函數依賴于碼)
學生(學號,姓名,出生年月,系名,班號,宿舍區)
分解為:學生( 學號 ,姓名,出生年月,班號,系) 系宿舍( 系名 。宿舍區)
班級(班號,專業名,系名,人數,入校年份)
分解為:班級(班號,專業名,人數,入校年份) 專業系(專業名,系名)
系(系號,系名,系辦公室地址,人數)
學會(學會名,成立年份,地點,人數)
學生參加學會(學號,學會,入會年份)
作者:
RDIF
出處:
http://www.rzrgm.cn/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手機號)
框架官網:
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.rzrgm.cn/huyong
國思RDIF開發框架
,
給用戶和開發者最佳的.Net框架平臺方案,為企業快速構建跨平臺、企業級的應用提供強大支持。
關于作者:系統架構師、信息系統項目管理師、DBA。專注于微軟平臺項目架構、管理和企業解決方案,多年項目開發與管理經驗,曾多次組織并開發多個大型項目,在面向對象、面向服務以及數據庫領域有一定的造詣。現主要從事基于
RDIF
框架的技術開發、咨詢工作,主要服務于金融、醫療衛生、鐵路、電信、物流、物聯網、制造、零售等行業。
如有問題或建議,請多多賜教!
本文版權歸作者和CNBLOGS博客共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過微信、郵箱、QQ等聯系我,非常感謝。

浙公網安備 33010602011771號