BCNF及之前都需要知道
函数依赖, 传递依赖
不会专门考范式的详细定义, 只会考判定, 给例子判定范式最高达到什么级别, 如何进一步提高范式
关系模式和范式
关系模式
关系模式五元组: R(U, D, DOM, F)
D(域)和DOM(属性到域的映射)和设计模式关系不大, 因此可以把关系模式看成一个三元组R(U, F). 当且仅当U上的一个关系R满足F时, R称为关系模式R(U, F)的一个关系.
范式
范式是符合某一种级别的关系模式的集合.
关系数据库中的关系必须满足一定的要求, 满足不同程度要求的为不同范式.
各范式之间存在联系: 高级别包含低级别. 低级范式的关系模式可以通过模式分解转换为高级范式关系模式的集合, 这个过程叫规范化.
数据依赖
一个关系内部, 属性之间的约束关系(属性间值的相等与否), 是现实世界属性间相互联系的抽象, 是数据内在的性质, 是语义的体现.
函数依赖(FD)
表内的一个属性值可由另一个属性值唯一推出, 即一个属性值取定之后另一个属性也随之确定, 则称这两个属性间存在函数依赖(象集只有一个元素).
正式定义
正式定义: 设R(U)是一个属性组U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y,X称为这个函数依赖的决定因素(Determinant)。
即可以多对一, 不可以一对多. 与函数的定义相同.
如果一一对应, 则记为X←→Y.
书写形式:
关系模式上定义的函数依赖适用于R的所有关系实例.
函数依赖是语义范畴的概念, 由现实世界限制而来.
函数依赖分类
- 平凡函数依赖: X → Y, Y包含于X(即自己唯一决定自己的一个部分)
- 非平凡函数依赖: X → Y, Y不包含于X(即自己唯一决定不完全是自己的一个部分)
平凡函数依赖必然成立(自己取定了, 子集当然也取定了), 所以一般只讨论非平凡函数依赖.
特殊函数依赖
- 完全函数依赖: X → Y, 且X的任何真子集都不能函数确定Y, 则Y对X完全函数依赖(必须要完整的X内包含的所有属性的组才能确定Y的值), 记为.
- 部分函数依赖: X → Y, 且存在X的真子集可以函数确定Y, 则Y对X为部分函数依赖(X的一部分就可以确定Y), 记为.
- 传递函数依赖: Y对X为非平凡函数依赖(Y不是X的一部分), Z对Y为非平凡函数依赖(Z不是Y的一部分), 且X不函数依赖于Y(不一一对应, 一个Y可以对应多个X), 则称Z对X传递函数依赖, 记为
函数依赖与码
R(U, F), K为U的子集, 若(属性全集完全函数依赖于K), 则称K为R的一个候选码.
若(属性全集部分函数依赖于K), 则称K为R的一个超码(即K的一部分是候选码)
若关系模式R有多个候选码, 则选定其中一个为主码.
任意候选码中的属性称为主属性. 不在任何候选码内的属性为非主属性(非码属性).
全码: 整个属性组为码, 即没有某一个成分能唯一标定元组.
外码: 某一属性/属性组不是本关系模式的码, 但是是另一个关系模式的码, 则称该属性/属性组是本关系模式的外码. 主码和外码一起提供了表示关系间联系的手段.
1NF(“一格一个值”, 不能表中有表)
作为二维表, 关系的每个分量都是不可分的数据项(不允许表中有表) → 第一范式
第一范式是关系模式的最起码要求.
1NF的缺陷:
- 数据冗余(某项数据重复出现)
- 更新异常(修改复杂, 更新重复出现的数据项时, 必须修改每一个包含该项的元组)
- 插入异常(一项信息不存在时无法插入另一项信息)
- 删除异常(删除一项信息后丢失另一项信息)
出现原因: 存在对码不是完全函数依赖的属性
解决方案: 用规范化理论改造关系模式, 对模式进行模式分解, 转换成多个更高范式的模式
2NF(“不靠一半,要靠全部”, 消除部分依赖)
在第一范式的基础上, 每一个非主属性都完全函数依赖于任何一个候选码(即任何一个候选码都能唯一决定任何一个非主属性, 且其真子集不能决定).
非形式化说法: 别让信息只靠候选码的一部分就能找全, 必须依靠完整的码. 非主属性必须完全函数依赖于码
1NF → 2NF: 投影分解

分解为:

四个问题仍然存在, 但是有所改善.

3NF(”只认老大不认小弟”, 消除传递依赖)
不允许非主属性可以决定其他非主属性, 即非主属性通过来自主属性的传递依赖决定其他属性. 非主属性的值只能通过码来唯一确定.
实现3NF的要求: 消除主属性到非主属性的传递依赖.
四个问题仍然存在, 但是有所改善.
BCNF(”如果谁能说了算, 那他一定是老大”, 消除非码依赖)
修正的3NF
如果一个属性集能决定另一个属性集(即一个属性组非平凡函数依赖于另一个属性组), 则被函数依赖的属性组必然包含码(只要一个字段/字段的集合能决定别人, 那它就得是候选码或包含候选码).
除了消除来自主码的传递依赖, 还消除了其他非主码因素造成的依赖.
性质:
- 所有非主属性都完全函数依赖于每个候选码
- 所有主属性都完全函数依赖于每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
实现了BCNF就在函数依赖的范畴内实现了模式的彻底分解, 达到了最高的规范化程度, 消除了插入异常和删除异常.
3NF的“不彻底”性表现在可能存在主属性对码的部分依赖和传递依赖.
多值依赖和4NF之类
不多做要求