关系数据理论
数据依赖包括函数依赖和多值依赖。
5.1 函数依赖
5.1.1 函数依赖的定义
设 R ( U ) R(U) R(U)是属性集U上的关系模式, X , Y ⊆ U X,Y\subseteq U X,Y⊆U ( X , Y X,Y X,Y是属性), 若对于 ∀ r ( 值 ) ∈ R ( U ) \forall r(值)∈R(U) ∀r(值)∈R(U), ∀ t , s ∈ r \forall t,s∈r ∀t,s∈r(元组),如果 t [ X ] = s [ X ] t[X]=s[X] t[X]=s[X](若每个都不相等也满足条件),能推出 t [ Y ] = s [ Y ] t[Y]=s[Y] t[Y]=s[Y],则称“X函数决定Y”,或“Y函数依赖于X”,记作: X → Y X\rightarrow Y X→Y,称 X X X为决定因素。
若 ∃ t , s ∈ r , t [ X ] = s [ X ] \exists t, s \in r, t[X]=s[X] ∃t,s∈r,t[X]=s[X],但 t [ Y ] ≠ s [ Y ] t[Y]\neq s[Y] t[Y]=s[Y],则称“X不函数决定Y”或“Y不函数依赖于X”,记作:。
函数依赖关系可以理解成关系数据库中“码”的理论基础;函数依赖与别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。
SDC中的函数依赖: S N O − > D E P T , D E P T − > M N A M E , ( S N O , C N A M E ) − > G R A D E SNO->DEPT,DEPT-> MNAME,(SNO,CNAME)-> GRADE SNO−>DEPT,DEPT−>MNAME,(SNO,CNAME)−>GRADE
5.1.2 函数依赖的分类
(1)平凡的函数依赖与非平凡的函数依赖
- 如果 X → Y X\rightarrow Y X→Y,且 Y ⊈ X Y \nsubseteq X Y⊈X,则称 X → Y X\rightarrow Y X→Y为非平凡的函数依赖。
- 如果 X → Y X\rightarrow Y X→Y,且 Y ⊆ X Y \subseteq X Y⊆X,则称 X → Y X\rightarrow Y X→Y为平凡的函数依赖。【必然成立】
如: S N O → S N O SNO\rightarrow SNO SNO→SNO是平凡的函数依赖。
在后面的讨论中,一般函数依赖指非平凡的函数依赖。
(2)完全函数依赖与部分函数依赖
- 如果 X → Y X\rightarrow Y X→Y,对于任意 X X X的真子集 X ′ X^{\prime} X′,都有,则称 Y Y Y对 X X X完全函数依赖,记作
- 如果 X → Y X\rightarrow Y X→Y,存在 X X X的真子集 X ′ X^{\prime} X′,使得 X ′ → Y X^{\prime}\rightarrow Y X′→Y ,则称 Y Y Y对 X X X部分函数依赖,记作 X ⟶ p Y X \stackrel{p}{\longrightarrow} Y X⟶pY
(3)传递函数依赖与直接函数依赖
- 在 R ( U ) R(U) R(U)中,如果 X → Y ( Y ⊈ X ) \mathrm{X} \rightarrow \mathrm{Y}(\mathrm{Y} \nsubseteq \mathrm{X}) X→Y(Y⊈X),, Y → Z \mathrm{Y} \rightarrow \mathrm{Z} Y→Z,则称Z对X传递函数依赖
5.1.3 函数依赖的逻辑蕴含
关系模式 R R R, F F F是其函数依赖, X , Y X,Y X,Y是其属性子集,如果从F的函数依赖能够推出 X → Y X\rightarrow Y X→Y,则称 F F F逻辑蕴含 X → Y X\rightarrow Y X→Y。
被 F F F所逻辑蕴含的函数依赖的全体所构成的集合称作 F F F的闭包,记作 F + F^{+} F+。
示例:
R ( X , Y ) , F = X → Y R(X, Y), F = {X\rightarrow Y} R(X,Y),F=X→Y
F + = { X → ∅ , X → X , X → Y , X → X Y , Y → ∅ , Y → Y , X Y → ∅ , X Y → X , X Y → Y , X Y → X Y } F^{+} = \{X\rightarrow \varnothing, X\rightarrow X, X\rightarrow Y,X\rightarrow XY, Y\rightarrow \varnothing, Y\rightarrow Y, XY\rightarrow \varnothing,XY\rightarrow X,XY\rightarrow Y,XY\rightarrow XY\} F+={X→∅,X→X,X→Y,X→XY,Y→∅,Y→Y,XY→∅,XY→X,XY→Y,XY→XY}
5.1.4 Armstrong公理系统
为了从一组函数依赖求得蕴含的函数依赖,为了确定一个关系模式的码,就需要一套推理规则。下面介绍函数依赖的公理系统——Armstrong公理系统。
对于关系模式 R ( U , F ) R(U,F) R(U,F),设 F F F是 U U U上的一组函数依赖,则:
- 自反律:若 Y ⊆ X ⊆ U Y\subseteq X\subseteq U Y⊆X⊆U,则 X → Y X \rightarrow Y X→Y为 F F F所蕴含。
- 增广律:若 X → Y X \rightarrow Y X→Y为 F F F所蕴含( X → Y ∈ F + X\rightarrow Y∈F^{+} X→Y∈F+), Z ⊆ U Z\subseteq U Z⊆U,则 X Z → Y Z XZ\rightarrow YZ XZ→YZ为 F F F所蕴含。【两边加相同的属性】
- 传递律:若 X → Y X \rightarrow Y X→Y及 Y → Z Y \rightarrow Z Y→Z为F所蕴含( F + F^{+} F+) ,则 X → Z X \rightarrow Z X→Z为 F F F所蕴含。
三个有用的推理规则:
-
合并规则:由 X → Y X \rightarrow Y X→Y, Y → Z Y \rightarrow Z Y→Z,有 X → Y Z X \rightarrow YZ X→YZ。
-
伪传递规则:由 X → Y X \rightarrow Y X→Y, W Y → Z WY \rightarrow Z WY→Z,有 X W → Z XW \rightarrow Z XW→Z。【推导:1式两边都加 W W W】
-
分解规则:由 X → Y X \rightarrow Y X→Y, Z ⊆ Y Z\subseteq Y Z⊆Y,有 X → Z X \rightarrow Z X→Z。推导: Z ⊆ Y Z\subseteq Y Z⊆Y是平凡函数依赖,则 Y → Z Y\rightarrow Z Y→Z,然后传递
[推论] X → Y , X → Z , X → A ⟷ X → Y Z A X\rightarrow Y,X\rightarrow Z,X\rightarrow A \longleftrightarrow X\rightarrow YZA X→Y,X→Z,X→A⟷X→YZA
5.1.5 由函数依赖定义的码
候选码:设 K K K为 R < U , F > R< U , F > R<U,F>的属性或属性组,若 K ⟶ f U K \stackrel{f}{\longrightarrow} U K⟶fU(K要完全决定U,即K任意真子集都不能决定U),则称K为R的候选码
主码:若 R ( U , F ) R(U , F) R(U,F)有多个候选码,则可以从中选定一个作为R的主码
主属性:包含在每一个候选码中的属性
非主属性:不包含在任何候选码中的属性
全码:关系模式的码由整个属性组构成
5.2 范式及其规范化
范式是对关系(关系模式 R R R)的不同数据依赖程度的要求。各种不同的范式都是以对关系模式的属性间允许的数据依赖加以限制的形式表示的。
若 R ( U , F ) R(U,F) R(U,F)符合 x x x范式的要求,则称 R R R为 x x x范式,记作: R ∈ x N F R\in xNF R∈xNF 例:x好学生,有德、德智、德智体……
通过模式分解将一个低级范式转换为若干个高级范式的过程称作规范化;限制最少,数据依赖条件越少,范围最广。
5.2.1 1NF
属性不可再分,是原子量
定义
分量是否需要再分,与具体应用有关;如果用到值的一部分,则需要进一步分割。
-
如果只是查询出生日期,则它满足1NF;
-
如果查询两人生日是否相同,则只比较月、日,需要将生日分解,就不满足1NF。
姓名 | 生日 |
---|---|
王军 | 98.7.10 |
张立 | 99.7.10 |
李明 | 90.3.28 |
姓名 | 年 | 月日 |
---|---|---|
王军 | 98 | 7.10 |
张立 | 99 | 7.10 |
李明 | 90 | 3.28 |
5.2.2 2NF
若 R ∈ 1 N F R\in 1NF R∈1NF,且每个非主属性完全依赖于码,则称 R ∈ 2 N F R\in 2NF R∈2NF, 即2NF不允许有非主属性对码的部分依赖;若R中有非主属性对码的部分依赖,则 R ∉ 2 N F R\notin 2NF R∈/2NF。
[例1]关系模式 S D C ( S N O , D E P T , M N A M E , C N A M E , G R A D E ) SDC(SNO,DEPT,MNAME,CNAME,GRADE) SDC(SNO,DEPT,MNAME,CNAME,GRADE),判断 S D C ∈ 2 N F SDC\in 2NF SDC∈2NF?
步骤:
先根据函数依赖确定候选码,再观察每个非主属性是否完全依赖于码。
因为 D E P T , M N A M E DEPT,MNAME DEPT,MNAME部分依赖于码$(SNO,CNAME) , 所 以 ,所以 ,所以SDC\notin 2NF$ 。
若码为一个,一定是完全依赖关系;
消除非主属性对码的部分依赖——模式分解
改造:
非主属性有两种,一种完全依赖于码,一种部分依赖于码。
将SDC分解为:
S C ( S N O , C N A M E , G ) ∈ 2 N F SC(SNO , CNAME , G)\in 2NF SC(SNO,CNAME,G)∈2NF
S D M ( S N O , D E P T , M N A M E ) ∈ 2 N F SDM(SNO , DEPT , MNAME)\in 2NF SDM(SNO,DEPT,MNAME)∈2NF
解决了部分插入异常和更新异常,删除异常还存在
[例2]关系模式 R ( A , B , C , D ) R(A,B,C,D) R(A,B,C,D),码为 A B AB AB,给出它的一个函数依赖集,使得 R R R属于 1 N F 1NF 1NF而不属于 2 N F 2NF 2NF。
F = { ( A , B ) → f C , B → D } F=\{(A, B) \stackrel{f}{\rightarrow} C, \quad B \rightarrow D\} F={(A,B)→fC,B→D}
5.2.3 3NF
关系模式 R < U , F > R< U , F > R<U,F>中,若不存在这样的码 X X X,属性组 Y Y Y及非主属性Z( Z ⊈ Y Z\nsubseteq Y Z⊈Y),使得下式成立:
则称 R ∈ 3 N F R\in 3NF R∈3NF。即 3 N F 3NF 3NF要求:非主属性既不部分也不传递依赖于码。
[例1]判断 S D M ( S N O , D E P T , M N A M E ) ∈ 3 N F SDM (SNO , DEPT , MNAME) \in 3NF SDM(SNO,DEPT,MNAME)∈3NF是否成立。
因为 S N O → D E P T , D E P T → M N A M E SNO \rightarrow DEPT,DEPT\rightarrow MNAME SNO→DEPT,DEPT→MNAME,所以 S D M ∉ 3 N F SDM\notin 3NF SDM∈/3NF
模式分解的方法是:消除非主属性对码的传递依赖
改造:
将 S D M ( S N O , D E P T , M N A M E ) SDM(SNO,DEPT,MNAME) SDM(SNO,DEPT,MNAME)分解为:
S D ( S N O , D E P T ) ∈ 3 N F SD (SNO , DEPT) \in 3NF SD(SNO,DEPT)∈3NF 二元/目关系
D M ( D E P T , M N A M E ) ∈ 3 N F DM(DEPT , MNAME) \in 3NF DM(DEPT,MNAME)∈3NF
[例2] S C ( S N O , C N A M E , G R A D E ) ∈ 3 N F SC(SNO , CNAME , GRADE) \in 3NF SC(SNO,CNAME,GRADE)∈3NF不能传递。
全码:所有属性加一起才能构成码,即 U ⟶ f U U \stackrel{f}{\longrightarrow} U U⟶fU,必满足3NF;
任意二元关系模式都属于第三范式。
[例3]关系模式 R ( A , B , C , D ) R(A,B,C,D) R(A,B,C,D),码为 A B AB AB,给出它的一个函数依赖集,使得 R R R属于 2 N F 2NF 2NF而不属于 3 N F 3NF 3NF。
F = ( A , B ) → C , C → D F={(A,B) \rightarrow C,C\rightarrow D} F=(A,B)→C,C→D