数据库规范化
参考
- 数据库规范化 - Wikipedia
- 第一范式 - Wikipedia
- 第二范式 - Wikipedia
- 第三范式 - Wikipedia
- BC范式 - Wikipedia
- 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)
- 数据库范式(1NF 2NF 3NF BCNF)详解
- BCNF和第三范式的分解算法
- BCNF范式的判断和分解
- 数据库中的范式和多值依赖
- 50.关系模式R(U)中, X.Y.Z是U的子集. 下列关于多值依赖描述中正确的是
- 第五范式 - Wikipedia
- Join dependency - Wikipedia
- Lossless join decomposition - Wikipedia
前置知识
定义
数据库规范化, 又称正规化、标准化, 是数据库设计的一系列原理和技术, 以减少数据库中数据冗余, 增进数据的一致性.
关系规范化
规范化指关系模式调优的一种机制, 其以关系模式中的数据依赖为出发点, 采用关系模式分解等措施, 消除关系模式中不合适的数据依赖, 达到解决数据的插入异常、删除异常、更新异常和数据冗余等问题的目标.
函数依赖
如果的两个元组在属性上一致, 那么必在上也一致, 称为: 函数决定, 形式化记作:
函数依赖与属性关系
设是属性集上的关系模式, 是的子集:
- 如果和之间是关系, 则存在函数依赖和, 记为.
- 如果X和Y之间是关系, 则存在函数依赖.
- 如果X和Y之间是关系, 则X和Y之间不存在函数依赖.
如果对于关系中每个实例使得一个给定的为真, 则称满足函数依赖.
平凡的函数依赖: 给定关系模式, 和是的子集, 若, 且, 则称是平凡的函数依赖.
非平凡函数依赖: 给定关系模式, 和是的子集, 若, 且, 则称是非平凡的函数依赖.
提示
若, 则称为这个函数依赖的决定属性(组), 或决定因素.
若不函数依赖于, 则记作.
完全函数依赖: 给定关系模式, , 若, 均有, 则称对完全函数依赖, 记为.
部分函数依赖: 给定关系模式, , 若, 且, 则称不完全函数依赖于, 或对部分函数依赖, 记为.
传递函数依赖: 给定关系模式, 若, 且, 并且, 则称对传递函数依赖, 记为
注意
若且, 则有, 则称直接依赖于.
超键
在关系中能惟一标识元组的属性集称为关系模式的超键。
若一个关系中有多个键, 则要指定其中一个作为主键.
与候选键、主键的关系
候选键:不含有多余属性的超键称为候选键。
主键:用户选作元组标识的一个候选键称为主键。
由此可知:超键候选键主键
候选码求取
闭包的概念其实各领域基本通用, 要求都是一样的, 包内各元素通过运算符计算得出的结果仍然在包内, 详细的理论可去参考离散数学的代数系统部分.
基于闭包的概念, 如果有某些个属性可以推知其他所有属性, 那么显然这些属性是关键的, 通过闭包运算即可得知某属性集是否为该关系的候选码.
候选键求取理论
对于给定的关系和函数依赖集, 可将其属性分为4类:
- L类: 仅出现在函数依赖左部的属性
- R类: 仅出现在函数依赖右部的属性
- N类: 在函数依赖左右两边均未出现的属性
- LR类: 在函数依赖左右两边均出现的属性
定理:
- 对于给定的关系模式及其函数依赖集, 若是L类属性, 则必为的任一候选码的成员.
- 对于给定的关系模式及其函数依赖集, 若是R类属性, 则不在任何候选码中.
- 对于给定的关系模式及其函数依赖集, 若是N类属性, 则必包含在的任一候选码中.
推论:
- 对于给定的关系模式及其函数依赖集, 若是L类属性, 且包含了的全部属性;则必为的唯一候选码.
- 对于给定的关系模式及其函数依赖集, 若是L类和N类组成的属性集, 且包含了的全部属性;则是的唯一候选码.
范式
若关系模式符合第范式的约定规则, 则可表示为.
通过模式分解等方法, 将一个属于低级别范式的关系模式转换为若干个属于高级别范式的关系模式的集合, 这种过程即规范化.
第一范式
第一范式(1NF)是数据库正规化所使用的正规形式. 第一范式是为了要排除重复组的出现, 要求:
- 数据库的每一列的论域都是由不可分割的原子值组成.
- 每个字段的值都只能是单一值.
若满足以上条件, 则.
注意
1NF是对关系模式的基本要求, 不满足第一范式的数据库模式不能称为关系数据库.
第二范式
第二范式(2NF)是数据库正规化所使用的正规形式. 规则是要求资料表里的所有资料都要和该资料表的键(主键与候选键)有完全依赖关系:每个非键属性必须独立于任意一个候选键的任意一部分属性.
一个资料表符合第二范式当且仅当:
- .
- 所有非键字段都不能是候选键非全体字段的函数, 即每一个非主属性完全函数依赖于码.
分解算法
设关系模式,主键是,上还存在,并且Z是非主属性且,那么就是一个局部依赖。此时应把分解成两个模式:
- ,主键是;
- ,主键仍是,外键为(参照)。
利用外键和主键的链接,可以重新得到。如果和还不是,重复上述过程,一直到每一个关系模式都是为止。
第三范式
简洁定义: 对于每个非平凡FD(函数依赖), 或者左边是超键, 或者右边仅由主属性构成.
第三范式(3NF)是数据库正规化所使用的正规形式, 要求所有非主键属性都只和候选键有相关性, 也就是说非主键属性之间应该是独立无关的.
分解算法
首先对最小函数依赖集按照左部相同原则进行分组,然后计算左部右部,
然后看分组后的各子关系彼此有无包含关系,如果有就合并。
最后看分出来的这些属性组是否至少有一组包含了码。
如果包含码,就说明该分解操作是无损且保持函数依赖的,反之就不是了,这时候需要另外添加一个分组并加入码。
证明例题
求证: 若, 则每一个非主属性既不部分依赖于码也不传递依赖于码.
(1) 关于对码的传递函数依赖
假设存在对码的传递函数依赖, 则必有: 属性组及, 其中是码, 满足, 与3NF的定义相违背, 假设不成立.
(2) 关于对码的部分函数依赖
若存在对码的部分函数依赖, 则必有: 属性组及, 其中是码, , 满足, 则有, 与3NF的定义相违背, 假设不成立.
巴斯范式(Boyce-Codd Normal Form, BCNF)
定义: 如果对于关系模式R中存在的任意一个非平凡函数依赖, 都满足X是R的一个超键, 那么关系模式R就属于BCNF.
形式化定义: 关系模式, 对中的每一个非平凡函数依赖, , 若必含有码, 则称.
等价语义: 属于BCNF的关系模式, 每个非平凡依赖的左边必须包括侯选建.
若:
- R中所有非主属性对每一个码都是完全函数依赖.
- R中所有主属性对每一个不包含它的码也是完全函数依赖.
- R中不存在任何属性完全函数依赖于非码的一组属性.
分解算法
- 设
- 若已经是,则返回。
- 若R存在BCNF违例,假设为。使用属性闭包算法计算,选择作为关系模式,使用包含属性和不在中的属性。
- 使用FD的投影算法计算和的集,分别记为和。
- 使用本算法递归地分解和。返回分解得到的结果集合。
数据依赖的公理系统(Armstrong公理系统)
首先ArmStrong公理系统具有以下三个运算性质:
- 自反律(Reflexivity): 若,则为所蕴含。
- 增广律(Augmentation): 若为所蕴含,且,则为所蕴含。
- 传递律(Transitivity): 若及为所蕴含,则为所蕴含。
根据Armstrong公理系统可以获得三条推理规则:
- 合并规则:由,,有
- 伪传递规则:由,,有
- 分解规则:由 及,有
模式分解
(这里是施工现场, 我正在填坑了, 您先等等, 别着急......ToT)
第四范式
多值依赖
设计的目的: 尽量消除插入、删除异常, 修改复杂, 数据冗余.
定义:
设是一个属性集上的一个关系模式, 和是的子集, 并且. 关系模式中多值依赖成立, 当且仅当对的任一关系, 给定的一对值, 有一组的值, 这组值仅仅决定于值而与值无关.
在关系模式中, 函数依赖不能表示属性值之间的一对多联系, 这些属性之间有些虽然没有直接关系, 但存在间接的关系, 把没有直接联系、但有间接的联系称为多值依赖的数据依赖.
判定方法: 对于任意关系中, 如果存在两个元组(就是行), 记为, 如果他们的某一属性的值相等, 那么我们交换它们另外的属性的值后, 得到的新的两个元组, 在表中仍可以在原来的表中找到与它们相匹配的元组.
平凡多值依赖和非平凡的多值依赖:
若, 而, 则称为平凡的多值依赖, 否则称为非平凡的多值依赖.
多值依赖与函数依赖的区别:
函数依赖是多值依赖的一种特殊情况, 根据定义中的"有一组的值", 我们可以令这一组内只含有一个元素, 这时就是函数依赖.
因此我们认为函数依赖一定是多值依赖, 多值依赖是函数依赖的超集.
多值依赖的性质:
- 对称性: 若, 则, 其中.
- 传递性: 若, 则.
- 函数依赖是多值依赖的特殊情况: 若, 则.
- 若, 则.
- 若, 则.
- 若, 则.
总之, 第四范式的要求有以下三点:
- 不允许有非平凡且非函数依赖的多值依赖.
- 允许的非平凡多值依赖是函数依赖.
- 平凡的多值依赖属于第四范式.
第五范式
关系数据库设计的第五范式(), 也称投影-连接范式(Project-join Normal Form, PJ/NF)是数据库规范化的一个级别,以去除多个关系之间的语义相关.
定义: 一张表满足第五范式当且仅当它的每个连接依赖可由候选键推出. 连接依赖于\,^*\{A, B, \dots , Z\},定义为都是的属性的子集, 且的连接(Join)等于。上的连接依赖\,^*\{A, B, \dots , Z\}可由的候选键推出,当且仅当的每一个都包含了R的超键.
连接依赖
Wikipedia上没有中文词条的解释, 能找到的只有英文版的:
In the area of computer science known as dependency theory, a join dependency is a constraint on the set of legal relations over a database scheme. A table is subject to a join dependency if can always be recreated by joining multiple tables each having a subset of the attributes of . If one of the tables in the join has all the attributes of the table , the join dependency is called trivial.
The join dependency plays an important role in the Fifth normal form, also known as project-join normal form, because it can be proven that if a scheme is decomposed in tables to , the decomposition will be a lossless-join decomposition if the legal relations on are restricted to a join dependency on called \,^*(R_{1},R_{2},\ldots ,R_{n}).
不过英文版解释的也比较清晰, 我想在这里应该不用再做赘述了.
总结
以上各范式之间的联系