关系模式可能存在的问题
- 数据冗余 Data Redundancy
存储一些列的重复出现的数据,通常出于效率和语义方面的考虑;但是,浪费存储空间,比如每一个系的系主任姓名重复出现,重复次数甚至与该系所有学生的所有课程成绩出现次数相同。同时,冗余控制不当可能会导致更新异常。
- 更新异常 Update Anomaly
数据冗余,更新数据时,维护数据完整性代价大。
-
插入异常(Insertion Anomaly)
例子:考虑一个存储学生课程信息的数据库表,其中学生信息和课程信息分别存储在两个表中,通过学生ID关联。如果某个学生还未选修课程,那么在学生表中就没有与该学生相关的记录。
分析:在这种情况下,插入新学生记录时,如果不同时插入相关的课程信息,就会导致数据不完整。为了避免这种异常,通常需要使用外键或联接来确保插入学生记录时,同时也插入相关的课程信息。
-
删除异常(Deletion Anomaly)
例子:考虑一个存储图书信息的数据库表,其中每本书的作者信息也存储在同一表中。如果一本书的作者决定不再写书,那么删除该作者的所有书籍记录可能导致书籍信息的丢失。
分析:删除异常会导致数据丢失和完整性问题。为避免这种异常,可以将作者信息存储在单独的作者表中,然后使用外键关联两个表,这样在删除作者记录时,书籍记录不会受到影响。
-
修改异常(Update Anomaly)
例子:考虑一个存储订单信息的数据库表,其中包括订单号、产品名称和订单总额。如果某个订单中的产品名称发生更改,那么需要在数据库中更新所有相关的订单记录,否则订单信息将不一致。
分析:修改异常可能导致数据不一致和错误。为避免这种异常,可以将产品信息存储在单独的产品表中,然后在订单表中使用产品ID与产品表关联,而不是直接存储产品名称。这样,在产品名称更改时,只需更新产品表中的记录,而订单表中的记录将保持一致。
函数依赖
设R(U)是属性集合U={A1,A2,...,An}上的一个关系模式,X,Y是U上的两个子集,若对R(U)的任何一个可能的关系r,r中不存在有两个元组满足在X中的属性值相等而在Y中的属性值不等,则称“X函数决定Y”或者“Y函数依赖于X”,记作X→Y。
特性
-
对于X→Y,但Y⊆X,也就是Y有不同于X的属性,则称X→Y为非平凡的函数依赖nontrivial FD
。
-
反之如果Y⊆X,比如{X,Y}→X、X→X,则称为平凡的函数依赖trivial FD
。
-
若X→Y,则任意两个元组,若X上值相等,则Y上值必然相等,称X为决定因素。
-
若X→Y,Y→X,则记作X↔Y。
-
X→Y,基于模式R的,则要求对任意的关系r成立;有基于具体关系r的,则要求对某一关系r成立。
-
如果一个关系r的某属性集X,r中根本没有X上相等的两个元组存在,则X→Y恒成立。
-
若Y不函数依赖于X,则记作X→Y
完全函数依赖&部分函数依赖
在R(U)中,若X→Y并且对于X的任何真子集X′都有X′→Y,则称Y完全函数依赖于X,记为X→FY,否则称Y部分函数依赖于X,记为X→PY。
部分函数依赖存在着非受控冗余,需要消除。比如说学号和课号决定姓名,然而有学号即可决定姓名,所以这是部分函数依赖。
传递函数依赖
在R(U)中,若X→Y,Y→Z,且Y⊆X,Z⊆Y,Z⊆X,Y→X,则称Z传递依赖于X,记为X→TY。
比如,U={学号,姓名,年龄,班号,班长,课号,成绩},学号决定班号,班号决定班长,所以学号决定班长是传递函数依赖,这里可见,两段都是非平凡的函数依赖。
传递函数依赖存在着非受控冗余,需要消除。
主属性和非主属性
基于候选键的定义,回顾之前提到的候选键,使用函数依赖的理论来解释就是,设K为R(U)中的属性或属性组和,若K→FU,则称K为R(U)上的候选键CK
。
特性
举例说明
比如对于属性集合学生(学号,年龄,家庭住址,课程号,成绩,教师,教师职务)
:
学号和课程号能够决定集合中的所有属性,所以学号和课程号可以构成候选键,剩余属性为非主属性。
再比如,属性集合商店(商店,商品,商品经营部,商品经营部经理)
:
商店和商品可以决定商品经营部,商店和商品经营部可以决定商品经营部经理,
逻辑蕴含和闭包
设F是关系R(U)中的一个函数依赖集合,X,Y是R的属性子集,如果能从F这个函数依赖集合中推导出X→Y,则称F逻辑蕴含X→Y,记作F⊨X→Y。F可能逻辑蕴含了不止一个函数依赖。
被F逻辑蕴含的所有函数依赖集合称为F的闭包,记作F+,换言之,能从函数依赖集合F中推导出的所有函数依赖组成的集合,称为F的闭包。
如何得到一组函数依赖关系的所有闭包F+?
初始化F+为与F相同的函数依赖集合;
重复以下步骤,直到F+不再发生改变:
- 对于F+的每个函数依赖,使用自反律,增广律
- 将生成的新函数依赖添加到F+中
- 对于F+中的每一对函数依赖,检查他们是否可以使用传递律进行组合
- 如果可以组合,将生成的新功能添加到F+中
举例说明
The Procedure for Computing F+
F={X→Y,Y→Z}
F+={XY→X,XY→Y,XY→Z,XZ→X,XZ→Y,XZ→Z...}
Armstrong公理
设F为R(U)的一组函数依赖,记为R(U,F)。
自反律 Reflexivity
若属性集Y⊆X,X⊆U,则X→Y被F逻辑蕴含,假设有一属性集合X,表示一个人的姓名和年龄,即X={姓名,年龄},可以推出由X推导出姓名或者年龄或者两者共同构成的集合即X本身。
增广律 Augmentation
若X→Y∈F,且Z⊆U,则XZ→YZ被F逻辑蕴含,换言之,如果X→Y在F这个函数依赖集合中,另一属性(组)Z是属性集U中的元素,那么从F中可以推导出XZ函数决定YZ。
传递律 Transitivity
若X→Y∈F,且Y→Z,则X→Z被F逻辑蕴含。
以上,X,Y,Z均为非空属性集合。
举例说明
R=(A,B,C,G,H,I)F={A→B,A→C,CG→H,CG→I,B→H}
可以推出比如:
根据传递律,A→H。
根据增广律,CG→H,CG→I。
根据增广律以及传递律
CG→CGICGI→HICG→HI
Armstrong引理
合并律 Additivity
若X→Y,且X→Z,则X→YZ,因为根据增广律可得X→XY,XY→YZ,再有传递律可得结果。
分解律 Projectivity
即合并律的逆过程,现在要你证明分解律{X→YZ}⊨X→Y,首先,根据条件可知X→YZ,根据自反律得到YZ→Y或者YZ→Z,再根据传递性可得出结果。
伪传递律 Pseudo-transitivity
若X→Y,且若WY→Z,则若XW→Z,通俗来讲就是构造函数依赖之间的传递性。
举例说明
R=(A,B,C,D)F={A→B,A→C,BC→D}Please prove A→D
根据增广律,AC→BC,根据传递律和BC→D,AC→D,由A→C,根据增广律,得到A→AC,再根据传递律得到A→D。
属性集的闭包
使用递归,终止条件,前后两次闭包内结果一致,则返回,通过求属性闭包,我们能找到CK,同时通过属性集闭包的运算,我们可以判断某一个函数依赖是否遵循一组属性依赖集。规范一下写法,如果有R=ABCDEF,Z={AB→C,BC→AD,D→E,CF→B},请问,AB→D是否遵循Z函数依赖集合。
AB+=ABinitiallyAB+=ABCusingAB→CAB+=ABCDusingBC→ADAB+=ABCDEusingD→E
可见,上述如果R中不含有F,那么AB的属性集闭包能够推出所有属性集。
候选键的计算
找出超键,然而删元素,比如对于ABCD组成的R, A->B, BC->D, A->C
先通过左侧得出ABC->ABCD,然后在ABC的基础上删元素,删除A,BC的闭包只能推出BCD;删除C,AB的闭包可以推出ABCD,保留;删除B,AC的闭包可以推出ABCD,保留;在此基础上再删,AC删除C,A的闭包也能推出ABCD…
要小心互相指向的情况,因为这样可能会有可能不止一个候选键。
下面有几个辅助判别的技巧,函数依赖中的元素可以被分为四种情况:
-
只出现在左侧的属性,一定是CK的一部分,因为如果不提供,则无法被函数决定
-
只在右侧出现的属性,一定不是CK的一部分,因为一定可以被CK函数决定
-
既出现在左侧,又出现在右侧,可能是也可能不是,老老实实根据删除的顺序判断
-
两侧都没有出现,一定是CK的一部分
例题及模板
R=ABCDE, FD={A→B,BC→A,D→E}, find all the CK of relation R
Step 1:
Let X:={A,B,C,D}
Step 2:
Try to remove A
{B,C,D}+={A,B,C,D,E}
Thus X:{B,C,D}
Step 3,4,5:
Attempt to remove B,C,D separately
{C,D}+={C,D,E}
{B,D}+={B,D,E}
{B,C}+={A,B,C}
None can be removed
So {B,C,D} is a candidate key and add to T
Step 6:
To find another super key, let X:={A,C,D}
Step 7,8,9:
Attempt to remove A,C,D separately
{C,D}+={C,D,E}
{A,D}+={A,B,D,E}
{A,C}+={A,B,C}
None can be removed
So {A,C,D} is a another candidate key and add to T
All the CK of relation R are {A,C,D} and {B,C,D}.
超键的计算
以上面找候选键的例子为例,计算超键的个数,有两种方法,枚举和组合计算
根据候选键{A,C,D}和 {B,C,D},R={A,B,C,D,E},候选键{A,C,D}剩余BE,候选键{B,C,D}剩余AE
从BE和AE中选,可得(C20+C21+C22)∗2=8,再减去一个重复组成部分ABCD和ABCDE,最终有6个超键。
总结
五类问题
- 判断一个relation的FD
- 求closure
- 求CK
- 求SK的个数
- 求某个FD是否蕴含在F中