关系模式
一个关系模式应当是一个五元组 (含关系名)
R<U, D, dom, F>
- R 为关系名,它是符号化的元组语义
- U 为一组属性
- 属性组 U 中的属性来自域 D
- dom 为属性列表到域的映射
- F 为属性组 U 上的一组数据依赖 (函数依赖)
由于第三点与第四点对模式设计关系不大,因此通常把关系模式看作是一个三元组:R<U, F>,当且仅当 U 上的一个关系 r 满足 f 时,r 称为关系模式 R<U, F> 的一个关系
例如:R 为成绩表,U 为 (学号,姓名,课程号,成绩),F 为 {学号 → 姓名,课程号 → 课程名,(学号,课程号) → 成绩}
函数依赖
函数依赖是一种最重要、最基本的数据依赖
设 R(U) 是属性集 U 上的关系模式,X、Y 是 U 的子集。若对 R(U) 的任何一个可能的关系 r,r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 X 函数决定 Y 或 Y 函数依赖于 X。记作 X → Y
- 非平凡的函数依赖
如果 X → Y,但 Y ⊈ X,则称 X → Y 是非平凡的函数依赖。一般情况下,总是讨论非平凡的函数依赖
- 平凡的函数依赖
如果 X → Y,但 Y ⊆ X,则称 X → Y 是平凡的函数依赖
- 完全函数依赖
在 R(U) 中,如果 X → Y,并且对于 X 的任何一个真子集 X’ 都有 X’ 不能决定 Y,则称 Y 对 X 完全函数依赖,记作 X -F-> Y
- 部分函数依赖
如果 X → Y,但 Y 不完全函数依赖于 X,则称 Y 对 X 部分函数依赖,记作 X -P-> Y。部分函数依赖也称为局部函数依赖
- 传递依赖
在 R(U, F) 中,如果 X → Y,Y ⊈ X,Y → Z,则称 Z 对 X 传递依赖
参考:Untitled Document (pop0726.github.io)
码
设 K 为 R(U, F) 中属性的组合,若 K → U,且对于 K 的任何一个真子集 K’ 都有 K’ 不能决定 U,则 K 为 R 的候选码。若有多个候选码,则选一个作为主码。候选码通常也称为候选键,或者候选关键字
- 主属性和非主属性
包含在任意一个候选码中的属性称为主属性,否则称为非主属性
- 外码
若 R(U) 中的属性或属性组 X 非 R 的码,但 X 是另一个关系的码,则称 X 为外码
- 超码
能表示出所有属性的集合,候选码是最小的超码
- 全码
所有的属性都是主码
函数依赖的公理系统 (Armstrong 公理系统)
设关系模式 R(U, F),其中 U 为属性集,F 是 U 上的一组函数依赖,那么有以下 推理规则
- 自反律:若 Y ⊆ X ⊆ U,则 X → Y 为 F 所蕴涵
- 增广律:若 X → Y 为 F 所蕴涵,且 Z ⊆ U,则 XZ → YZ 为 F 所蕴涵
- 传递律:若 X → Y,Y → Z 为 F 所蕴涵,则 X → Z 为 F 所蕴涵
根据上述三条推理规则又可推出下述三条推理规则
- 合并规则:若 X → Y,X → Z,则 X → YZ 为 F 所蕴涵
- 伪传递律:若 X → Y,WY → Z 为 F 所蕴涵,则 XW → Z 为 F 所蕴涵
- 分解规则:若 X → Y,Z ⊆ Y,则 X → Z 为 F 所蕴涵
属性闭包计算
闭包计算即找出候选码,如何选出候选码?
- 只出现在左边的一定是候选码
- 只出现在右边的一定不是候选码
- 左右都出现的不一定
- 左右都不出现的一定是候选码
- 再求确定的候选码的闭包,如果可以推出全部,那么当前确定的就是候选码,否则,你要把每一个可能的值放进当前确定的候选码里面进行求闭包
例如:
R<U, F>,U(A, B, C, D, E, G) F = {AB → C, CD → E, E → A, A → G}, 求候选码
1)只出现在左边:B, D 一定是候选码 2)只出现在右边:G 一定不是候选码 3)左右都出现的:A,C,E 不一定是候选码 5)求闭包
BD → 啥也推不出来,所以要把每一个可能的求闭包 (BDA)+ :可推出C,E,A,G 所以可以推出ABCDEG (BDC)+ :可推出E,A,G 所以可以推出ABCDEG (BDE)+ :可推出A,G,C 所以可以推出ABCDEG
所以,它的候选码最终是{(BDA),(BDC),(BDE)}
求最小函数依赖集
如何求最小依赖集? 1)拆右边为多个元素的(比如A->BC 拆为 A->B和A->C) 2)出去当前元素,求它的闭包,把集合里面所有元素都弄完 3)左边最小化(通过遮住元素来看能不能推出其他元素) 比如BCD,遮住B看能推出CD吗,遮住C看能推出BD吗,遮住D看能推出BC吗
例: 已知关系 R<U,F> U{A, B, C, D, E, F, G} F = {BCD->A, BC->E, A->F, F->G, C->D, A->G} 求F的最小依赖集
解:
// (1)
(BCD)+ = BCDED
(BC)+ = BCD
(A)+ = AG
(F)+ = F
(C)+ = C
(A)+ = AFG(删除,因为有G)
// (2)
BCD->A —> BC->A
BC->E
A->F
F->G
C->D