数据库规范化

Breeze Shane大约 14 分钟DatabaseDatabase

参考
  1. 数据库规范化 - Wikipediaopen in new window
  2. 第一范式 - Wikipediaopen in new window
  3. 第二范式 - Wikipediaopen in new window
  4. 第三范式 - Wikipediaopen in new window
  5. BC范式 - Wikipediaopen in new window
  6. 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)open in new window
  7. 数据库范式(1NF 2NF 3NF BCNF)详解open in new window
  8. BCNF和第三范式的分解算法open in new window
  9. BCNF范式的判断和分解open in new window
  10. 数据库中的范式和多值依赖open in new window
  11. 50.关系模式R(U)中, X.Y.Z是U的子集. 下列关于多值依赖描述中正确的是open in new window
  12. 第五范式 - Wikipediaopen in new window
  13. Join dependency - Wikipediaopen in new window
  14. Lossless join decomposition - Wikipediaopen in new window

前置知识

定义

数据库规范化, 又称正规化标准化, 是数据库设计的一系列原理和技术, 以减少数据库中数据冗余, 增进数据的一致性.

关系规范化

规范化指关系模式调优的一种机制, 其以关系模式中的数据依赖为出发点, 采用关系模式分解等措施, 消除关系模式中不合适的数据依赖, 达到解决数据的插入异常、删除异常、更新异常和数据冗余等问题的目标.

函数依赖

如果RR的两个元组在属性A1,A2,,AnA_1, A_2, \dots, A_n上一致, 那么必在B1,B2,,BmB_1, B_2, \dots, B_m上也一致, 称为: AiA_i函数决定BjB_j, 形式化记作:

A1,A2,,AnB1,B2,,Bm A_1, A_2, \dots, A_n\rightarrow B_1, B_2, \dots, B_m

函数依赖与属性关系

R(U)R(U)是属性集UU上的关系模式, X,YX, YUU的子集:

  • 如果XXYY之间是1:11:1关系, 则存在函数依赖XYX\rightarrow YYXY\rightarrow X, 记为XYX\leftrightarrow Y.
  • 如果X和Y之间是1:n1:n关系, 则存在函数依赖YXY\rightarrow X.
  • 如果X和Y之间是m:nm:n关系, 则X和Y之间不存在函数依赖.

如果对于关系RR中每个实例使得一个给定的FDF_D为真, 则称RR满足函数依赖FF.

平凡的函数依赖: 给定关系模式R(U)R(U), XXYYUU的子集, 若XYX\rightarrow Y, 且YXY\subseteq X, 则称XYX\rightarrow Y是平凡的函数依赖.

非平凡函数依赖: 给定关系模式R(U)R(U), XXYYUU的子集, 若XYX\rightarrow Y, 且Y⊈XY\not\subseteq X, 则称XYX\rightarrow Y是非平凡的函数依赖.

提示

XYX\rightarrow Y, 则称XX为这个函数依赖的决定属性(组), 或决定因素.

YY不函数依赖于XX, 则记作X↛YX\not\rightarrow Y.

完全函数依赖: 给定关系模式R(U,F)R(U, F), XYFX\rightarrow Y\in F, 若XX\forall X^\prime \subsetneq X, 均有X↛YX^\prime \not\rightarrow Y, 则称YYXX完全函数依赖, 记为XFYX\stackrel{F}{\rightarrow}Y.

部分函数依赖: 给定关系模式R(U,F)R(U, F), XYFX\rightarrow Y\in F, 若XX\exists X^\prime \subsetneq X, 且XYX^\prime \rightarrow Y, 则称YY不完全函数依赖于XX, 或YYXX部分函数依赖, 记为XPYX\stackrel{P}{\rightarrow}Y.

传递函数依赖: 给定关系模式R(U,F)R(U, F), 若XYFX\rightarrow Y\in F, 且Y⊈X,Y↛XY\not\subseteq X, Y\not\rightarrow X, 并且YZ,Z⊈YY\rightarrow Z, Z\not\subseteq Y, 则称ZZXX传递函数依赖, 记为X传递ZX\stackrel{\text{传递}}{\longrightarrow}Z

注意

XYX\rightarrow YYXY\rightarrow X, 则有XYX\leftrightarrow Y, 则称ZZ直接依赖于XX.

超键

在关系中能惟一标识元组的属性集称为关系模式的超键。

若一个关系中有多个键, 则要指定其中一个作为主键.

与候选键、主键的关系

候选键:不含有多余属性的超键称为候选键。

主键:用户选作元组标识的一个候选键称为主键。

由此可知:超键\supseteq候选键\supseteq主键

候选码求取

闭包的概念其实各领域基本通用, 要求都是一样的, 包内各元素通过运算符计算得出的结果仍然在包内, 详细的理论可去参考离散数学的代数系统部分.

基于闭包的概念, 如果有某些个属性可以推知其他所有属性, 那么显然这些属性是关键的, 通过闭包运算即可得知某属性集是否为该关系的候选码.

候选键求取理论

对于给定的关系R(A1,A2,,An)R(A_1, A_2, \dots, A_n)和函数依赖集FF, 可将其属性分为4类:

  1. L类: 仅出现在函数依赖左部的属性
  2. R类: 仅出现在函数依赖右部的属性
  3. N类: 在函数依赖左右两边均未出现的属性
  4. LR类: 在函数依赖左右两边均出现的属性

定理:

  1. 对于给定的关系模式RR及其函数依赖集FF, 若X(XR)X(X\in R)是L类属性, 则XX必为RR的任一候选码的成员.
  2. 对于给定的关系模式RR及其函数依赖集FF, 若X(XR)X(X\in R)是R类属性, 则XX不在任何候选码中.
  3. 对于给定的关系模式RR及其函数依赖集FF, 若X(XR)X(X\in R)是N类属性, 则XX必包含在RR的任一候选码中.

推论:

  1. 对于给定的关系模式RR及其函数依赖集FF, 若X(XR)X(X\in R)是L类属性, 且X+X^+包含了RR的全部属性;则XX必为RR的唯一候选码.
  2. 对于给定的关系模式RR及其函数依赖集FF, 若X(XR)X(X\in R)是L类和N类组成的属性集, 且X+X^+包含了RR的全部属性;则XXRR的唯一候选码.

范式

若关系模式RR符合第nn范式的约定规则, 则可表示为RnNFR\in n\mathrm{NF}.

通过模式分解等方法, 将一个属于低级别范式的关系模式转换为若干个属于高级别范式的关系模式的集合, 这种过程即规范化.

第一范式

第一范式(1NF)是数据库正规化所使用的正规形式. 第一范式是为了要排除重复组的出现, 要求:

  • 数据库的每一列的论域都是由不可分割的原子值组成.
  • 每个字段的值都只能是单一值.

若满足以上条件, 则RnNFR\in n\mathrm{NF}.

注意

1NF是对关系模式的基本要求, 不满足第一范式的数据库模式不能称为关系数据库.

第二范式

第二范式(2NF)是数据库正规化所使用的正规形式. 规则是要求资料表里的所有资料都要和该资料表的键(主键与候选键)有完全依赖关系:每个非键属性必须独立于任意一个候选键的任意一部分属性.

一个资料表符合第二范式当且仅当:

  • R1NFR\in 1\mathrm{NF}.
  • 所有非键字段都不能是候选键非全体字段的函数, 即每一个非主属性完全函数依赖于码.
分解算法

设关系模式R(U)R(U),主键是WWRR上还存在XZX\rightarrow Z,并且Z是非主属性且XWX\subseteq W,那么WZW\rightarrow Z就是一个局部依赖。此时应把RR分解成两个模式:

  • R1(XZ)R_1(XZ),主键是XX
  • R2(UZ)R_2(U-Z),主键仍是WW,外键为XX(参照R1R_1)。

利用外键和主键的链接,可以重新得到RR。如果R1R_1R2R_2还不是2NF2\mathrm{NF},重复上述过程,一直到每一个关系模式都是2NF2\mathrm{NF}为止。

第三范式

简洁定义: 对于每个非平凡FD(函数依赖), 或者左边是超键, 或者右边仅由主属性构成.

第三范式(3NF)是数据库正规化所使用的正规形式, 要求所有非主键属性都只和候选键有相关性, 也就是说非主键属性之间应该是独立无关的.

分解算法

首先对最小函数依赖集按照左部相同原则进行分组,然后计算左部\cup右部,

然后看分组后的各子关系彼此有无包含关系,如果有就合并。

最后看分出来的这些属性组是否至少有一组包含了码。

如果包含码,就说明该分解操作是无损且保持函数依赖的3NF3\mathrm{NF},反之就不是了,这时候需要另外添加一个分组并加入码。

证明例题

求证: 若R3NFR\in 3\mathrm{NF}, 则每一个非主属性既不部分依赖于码也不传递依赖于码.

(1) 关于对码的传递函数依赖

假设存在对码的传递函数依赖, 则必有: \exists属性组P,SP, STT, 其中PP是码, 满足PS,ST,S↛P,T⊈SP\rightarrow S, S\rightarrow T, S\not\rightarrow P, T\not\subseteq S, 与3NF的定义相违背, 假设不成立.

(2) 关于对码的部分函数依赖

若存在对码的部分函数依赖, 则必有: \exists属性组P,QP, QSS, 其中PP是码, QP,S⊈QQ\subsetneq P, S\not\subseteq Q, 满足QSQ\rightarrow S, 则有PQ,QS,Q↛PP\rightarrow Q, Q\rightarrow S, Q\not\rightarrow P, 与3NF的定义相违背, 假设不成立.

巴斯范式(Boyce-Codd Normal Form, BCNF)

定义: 如果对于关系模式R中存在的任意一个非平凡函数依赖XAX\rightarrow A, 都满足X是R的一个超键, 那么关系模式R就属于BCNF.

形式化定义: 关系模式R<U,F>1NFR<U, F> \in 1\mathrm{NF}, 对FF中的每一个非平凡函数依赖, XY(Y⊈X)X\rightarrow Y(Y\not\subseteq X), 若XX必含有码, 则称R<U,F>BCNFR<U,F>\in \mathrm{BCNF}.

等价语义: 属于BCNF的关系模式, 每个非平凡依赖的左边必须包括侯选建.

RBCNFR\in \mathrm{BCNF}:

  • R中所有非主属性对每一个码都是完全函数依赖.
  • R中所有主属性对每一个不包含它的码也是完全函数依赖.
  • R中不存在任何属性完全函数依赖于非码的一组属性.
分解算法
  1. R=R0,F=F0R=R_0, F=F_0
  2. RR已经是BCNF\mathrm{BCNF},则返回{R}\{ R \}
  3. 若R存在BCNF违例,假设为XYX\rightarrow Y。使用属性闭包算法计算X+X^+,选择R1=X+R_1=X^+作为关系模式,使用R2R_2包含属性XX和不在X+X^+中的属性。
  4. 使用FD的投影算法计算R1R_1R2R_2FDF_D集,分别记为F1F_1F2F_2
  5. 使用本算法递归地分解R1R_1R2R_2。返回分解得到的结果集合。

数据依赖的公理系统(Armstrong公理系统)

首先ArmStrong公理系统具有以下三个运算性质:

  1. 自反律(Reflexivity): 若YXUY\subseteq X\subseteq U,则XYX\rightarrow YFF所蕴含。
  2. 增广律(Augmentation): 若XYX\rightarrow YFF所蕴含,且Z UZ\subseteq U,则XZYZXZ\rightarrow YZFF所蕴含。
  3. 传递律(Transitivity): 若XYX\rightarrow YYZY\rightarrow ZFF所蕴含,则XZX\rightarrow ZFF所蕴含。

根据Armstrong公理系统可以获得三条推理规则:

  • 合并规则:由XYX\rightarrow YXZX\rightarrow Z,有XYZX\rightarrow YZ
  • 伪传递规则:由XYX\rightarrow YWYZWY\rightarrow Z,有XWZXW\rightarrow Z
  • 分解规则:由XYX\rightarrow YZYZ\subseteq Y,有XZX\rightarrow Z

模式分解

(这里是施工现场, 我正在填坑了, 您先等等, 别着急......ToT)

第四范式

多值依赖

设计的目的: 尽量消除插入、删除异常, 修改复杂, 数据冗余.

定义:

R(U)R(U)是一个属性集UU上的一个关系模式, X,YX, YZZUU的子集, 并且ZUXYZ=U-X-Y. 关系模式R(U)R(U)中多值依赖XYX↠Y成立, 当且仅当对R(U)R(U)的任一关系rr, 给定的一对(x,z)(x, z)值, 有一组YY的值, 这组值仅仅决定于xx值而与zz值无关.

在关系模式中, 函数依赖不能表示属性值之间的一对多联系, 这些属性之间有些虽然没有直接关系, 但存在间接的关系, 把没有直接联系、但有间接的联系称为多值依赖的数据依赖.

判定方法: 对于任意关系中, 如果存在两个元组(就是行), 记为A,BA, B, 如果他们的某一属性XX的值相等, 那么我们交换它们另外的属性YY的值后, 得到的新的两个元组, 在表中仍可以在原来的表中找到与它们相匹配的元组.

平凡多值依赖和非平凡的多值依赖:

XYX↠Y, 而ZZ=\varnothing, 则称XYX↠Y为平凡的多值依赖, 否则称XYX↠Y为非平凡的多值依赖.

多值依赖与函数依赖的区别:

函数依赖是多值依赖的一种特殊情况, 根据定义中的"有一组YY的值", 我们可以令这一组YY内只含有一个元素YY^*, 这时就是函数依赖.

因此我们认为函数依赖一定是多值依赖, 多值依赖是函数依赖的超集.

多值依赖的性质:

  1. 对称性: 若XYX↠Y, 则XZX↠Z, 其中Z=UXYZ=U-X-Y.
  2. 传递性: 若XY,YZX↠Y, Y↠Z, 则XZYX↠Z-Y.
  3. 函数依赖是多值依赖的特殊情况: 若XYX\rightarrow Y, 则XYX↠Y.
  4. XY,XZX↠Y, X↠Z, 则XYZX↠Y\cup Z.
  5. XY,XZX↠Y, X↠Z, 则XYZX↠Y\cap Z.
  6. XY,XZX↠Y, X↠Z, 则XYZ,XZYX↠Y-Z, X↠Z-Y.

总之, 第四范式的要求有以下三点:

  1. 不允许有非平凡且非函数依赖的多值依赖.
  2. 允许的非平凡多值依赖是函数依赖.
  3. 平凡的多值依赖属于第四范式.

第五范式

关系数据库设计的第五范式(5NF5\mathrm{NF}), 也称投影-连接范式(Project-join Normal Form, PJ/NF)是数据库规范化的一个级别,以去除多个关系之间的语义相关.

定义: 一张表满足第五范式当且仅当它的每个连接依赖可由候选键推出. RR连接依赖于\,^*\{A, B, \dots , Z\},定义为A,B,,ZA, B, \dots , Z都是RR的属性的子集, 且A,B,,ZA, B, \dots , Z的连接(Join)等于RRRR上的连接依赖\,^*\{A, B, \dots , Z\}可由RR的候选键推出,当且仅当A,B,,ZA, 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 TT is subject to a join dependency if TT can always be recreated by joining multiple tables each having a subset of the attributes of TT. If one of the tables in the join has all the attributes of the table TT, 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 RR is decomposed in tables R1R_{1} to RnR_{n}, the decomposition will be a lossless-join decomposition if the legal relations on RR are restricted to a join dependency on RR called \,^*(R_{1},R_{2},\ldots ,R_{n}).

不过英文版解释的也比较清晰, 我想在这里应该不用再做赘述了.

总结

以上各范式之间的联系

5NF4NFBCNF3NF2NF1NF \mathrm{5NF}\subsetneq\mathrm{4NF}\subsetneq\mathrm{BCNF}\subsetneq\mathrm{3NF}\subsetneq\mathrm{2NF}\subsetneq\mathrm{1NF}