问题的提出
就拿我们之前的的基本表来举例,如图所示,Student表上存在各种函数依赖,但是这个关系模式存在以下问题:
1.数据冗余
比如:每一个系的系主任姓名重复出现,重复次数与该系所有课程成绩出现次数相同,这将浪费大量空间。
更新异常
由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。比如,更换系主任后要修改该系学生所有元组。
插入异常
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
删除异常
如果某个系的学生全部毕业了,在删除该系学生的同时,这个系及其系主任的信息也丢掉了。
规范化
函数依赖
设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作 X → Y X→Y X→Y。
- X → Y X→Y X→Y,但 Y ⊈ X Y \not\subseteq X Y⊆X,则称 X → Y X→Y X→Y是非平凡的函数依赖
- X → Y X→Y X→Y,但 Y ⊆ X Y \subseteq X Y⊆X,则称 X → Y X→Y X→Y是平凡的函数依赖。对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。若不特别声明,总是讨论非平凡的函数依赖
- 若 X → Y X→Y X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素。
- 若 X → Y X→Y X→Y, Y → X Y→X Y→X,则记作 X ⟷ Y X \longleftrightarrow Y X⟷Y
- .若Y不函数依赖于X,则记作X ↛ \not\rightarrow →Y。
在R(U)中,如果 X → Y X→Y X→Y,并且对于X的任何一个真子集X,都有 X ′ X' X′
↛ \not\rightarrow → Y,则称Y对X完全函数依赖,记作
X → F Y X \overset F \rightarrow Y X→FY
若X → → →Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作
X → P Y X \overset P \rightarrow Y X→PY
在R(U)中,如果 X → Y ( Y ⊈ X ) X→Y(Y \not\subseteq X) X→Y(Y⊆X),Y ↛ \not\rightarrow →X,Y→Z, Z ⊈ \not\subseteq ⊆Y则称Z对X传递函数依赖(transitive functional dependency)。记为 X → 传 递 Z X \overset {传递} \rightarrow Z X→传递Z。
码
设K为R<U,F>中的属性或属性组合,若K → F \overset{F} \rightarrow →FU,则K为R的候选码。注意U是完全依赖于K,而不是部分依赖于K。如果U部分函数依赖于K即K → P \overset{P} \rightarrow →PU,则K称为超码。候选码是最小的超码,即K的任一真子集都不是候选码。
\quad 若候选码多于一个,则选定其中一个为主码
\quad 包含在任何一个候选码中的属性为主属性;不包含在任何候选码中的属性称为非主属性。
2NF、3NF、BCNF(第二范式第三范式BC范式)
一个二维表就是一个第一范式,在此基础上满足:
每一个非主属性完全函数依赖于任何一个候选码就满足第二范式;
若每一个非主属性既不传递依赖于码,也不部分依赖于码,就满足第三范式;若在第三范式的前提下,每个决定因素都包含码,则满足BC范式。
多值依赖
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X → → Y X→→Y X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
若 X → → Y X→→Y X→→Y,而 Z = ∅ Z=\varnothing Z=∅,即 Z Z Z为空,则称 X → → Y X→→Y X→→Y为平凡的多值依赖。即对于R(X, Y),如果有 X → → Y X→→Y X→→Y成立,则 X → → Y X→→Y X→→Y为平凡的多值依赖。