21/7/30 读书笔记 关系模式的规范化
21/7/30 读书笔记
数据库系统概论 关系数据理论与规范化
在数据库设计中,我们最常考虑的一件事情就是如何构造合适的数据模式。在关系数据库中,这一问题转变为如何构造合适的关键模型,进一步来说就是如何设计关系表。
我们如何评价一系列(相关的)关系表的好坏呢?或者说,我们如何评价一个模式的好坏?我们认为一个好的模式应该不会发生插入异常、删除异常、更新异常,且数据冗余尽可能少。
以关系表SMCG(学号,系号,系主任名称,课程名称,成绩)为例(仅举例,故不精细):
插入异常:当某个实体已经在现实世界中存在,但是在模式中由于某些原因而无法插入(缺乏主键等),导致模式中不能反映某个实体的存在性。比如学校新增了一个人工智能系,但是目前还没学生选课入学,因此SMCG中没有任何一条记录包括人工智能系,人工智能系是否存在并不影响表的结构。
删除异常:类似插入异常,某个实体在现实世界中一直存在,但是由于相关记录被删而导致模式中不能反映其存在性。比如所有人工智能系学生毕业了,但是系还在,当所有有关记录删除后,出现了上述相同的情况。
更新异常:由于数据冗余,而导致数据更新时需要花费大量代价维护数据的一致性。我们注意到一个系只有一个系主任,而导致多条记录中我们重复记录了系号->系主任这层关系。当某系的系主任变更时,我们需要更新所有该系相关的记录。
数据冗余:某种对应关系重复出现,导致大量同质的数据存在。比如上述的系号->系主任关系。
我们可以将一个性质不好的关系表改造为多个性质较好的表。这一步就是我们探讨的规范化。
形式上来说,我们首先定义关系模式为\(R(U,D,DOM,F)\):
- \(U\)与\(F\):属性组 / 属性组上的关系的集合
- \(D\)与\(DOM\):\(U\)所涉及的域 / \(U\)到\(D\)的映射关系的集合
我们仅考虑\(U\)与\(F\),将关系模式描述为\(R(U,F)\)
然后我们定义关系之间的依赖关系,分为函数依赖与多值依赖。
最后定义范式,其描述了一种关系模式的规范程度。规范程度越高,我们认为其性质越好。四种范式包括:
- 第一范式 1NF:当一种关系模式的每个分类都是不可分割时,即满足第一范式(即不能表中有表)。
- 第二范式 2NF
- 第三范式 3NF
- 扩充的第三范式 BCNF
- 第四范式 4NF
每种范式都满足前一种范式的对规范性的要求并且在规范性上要求更加严格。
一个低范式的关系模式可以通过模式分解为若干个高一级范式的关系模式的集合,这一步就是规范化。
我们将进一步定义函数依赖与多值依赖,并在其基础上详细定义第二范式、第三范式、扩充的第三范式以及第四范式。
函数依赖
形式化定义:对于关系模式\(R(U,F)\),\(X,Y\)分别是两个属性集合,且均为\(U\)的子集。如果对于\(R\)中的任意一个关系\(r\),\(r\)中不存在两个元组具有相同的\(X\)取值,而在\(Y\)上的取值不同。此时我们认为X函数确定Y或Y函数依赖于X。记为\(X\to Y\),\(X\)称为这个函数关系的决定属性组,即决定因素。
- 非平凡的函数依赖:\(X\to Y\)但是\(Y\nsubseteq X\)。
- 平凡的函数依赖:\(X\to Y ,Y\subseteq X\)。
- 完全函数依赖:\(X\to Y\),且对于\(X\)的任意真子集\(X^{'}\),有\(X^{'}\to Y\)永不成立。
- 部分函数依赖:\(X\to Y\)且不完全函数依赖的情况下,称\(Y\)部分函数依赖于\(X\)。
- 传递函数依赖:如果\(X\to Y\)成立且\(Y\to X\)不成立,\(Y\to Z\)成立,\(Z\nsubseteq Y\)成立,称Z对X传递函数依赖。
- 如果\(X\to Y\)且\(Y\to X\),那么\(X\)与\(Y\)相互依赖,使得上述函数关系变为Z对X(直接)函数依赖。
第二范式 2NF
定义:若\(R\in 1NF\),且每个非主属性 完全函数依赖于 任何一个候选码,则\(R\in 2NF\)。
候选码:对属性集合\(K\subseteq U\),如果U完全函数依赖于K,那么K称为候选码
主属性与非主属性:K中所有属性称为主属性,U中不包含在K内的属性称为非主属性
2NF部分解决了插入异常、删除异常和更新异常。
第三范式 3NF
定义:若\(R\in 1NF\),且R中不存在一个码X、属性组Y、非主属性Z,使得\(X\to Y\)且\(Y\to Z\),但是\(Y\to X\)不成立。即不存在非主属性对码的传递函数依赖或部分函数依赖。可以证明\(3NF\subset 2NF\)。
主码:从候选码中选出一个属性作为主码
码:候选码和主码统称码
3NF在函数依赖的条件下进一步实现了模式分解,但是主属性对码的部分依赖和传递依赖分离不彻底。
扩充的第三范式 Boyce-Codd Normal Form (BCNF)
定义:若\(R\in 1NF\),若\(X\to Y\)且\(Y\nsubseteq X\)是 \(X\)中包含码 的充分条件,这\(R\in BCNF\)。即对R上的任何函数依赖关系,决定因素X中一定含有码。可以证明\(BCNF\subset 3NF\)。
BCNF在函数依赖的范畴内实现了彻底的模式分离,消除了插入和删除的异常。
多值依赖
多值依赖是一种不同于函数依赖的数据依赖关系。
形式化定义为:对关系模式\(R\),\(X、Y、Z\)是三个属性集合,且是U的子集,满足\(Z=U-X-Y\)。当对\(R\)中任一关系\(r\),给定一对\((x,z)\)值,存在一组\(Y\)的取值,使得这组值仅与\(x\)有关,与\(z\)无关。这种依赖记为\(X\to\to Y\)。
- 平凡的多值依赖:\(X\to\to Y\)且\(Z=\empty\),此时\(X+Y=U\)。
以关系模式WSC(仓库,保管员,商品)为例。一个仓库对应多个保管员,每个仓库也有多个商品。
按照语义,每个仓库都有一组保管员的集合与之对应,而不管仓库中存放了什么商品。每个保管员保管所在仓库所有的商品。因此我们认为\(仓库\to\to 保管员\)。此时注意,我们同样可以说每个仓库都有一组商品的集合与之对应,而与仓库的保管员是谁无关,因此同样有\(仓库\to\to商品\)。这构成了多值依赖的对称性。
而多值依赖还具有传递性:\(X\to\to Y\)且\(Y\to\to Z\),则\(X\to\to Z-Y\)。
函数依赖与多值依赖的关系是:
- 函数依赖是多值依赖的特殊情况,即对于任何一个\(X\)的取值,都有唯一的\(Y\)取值与之对应(多值依赖下表现为一组Y的取值)。
- 多值依赖取决于\(U\)的范围,因为有关\(Z=U-X-Y\)。
- 对于函数依赖,我们可以认为\((X\to Y) \and (Y^{'} \subseteq Y) \to (X\to Y^{'})\)。但是在多值依赖下,\((X\to\to Y) \and (Y^{'} \subseteq Y) \to (X\to\to Y^{'})\)不成立。
4NF
形式化定义:对于关系模式\(R\in 1NF\),如果对\(R\)上的每个非平凡多值依赖\(X\to\to Y\),\(X\)都包含码,则\(R\in 4NF\)。即限制关系模式的属性间不存在非平凡且非函数依赖的多值依赖。
对每个非平凡多值依赖\(X\to\to Y\),有\(Z=U-X-Y\neq\empty\),因此\(Z\)与\(Y\)构成对称属性,满足\(X\to\to Z\)。未满足4NF的关系模式中,在对于\(X\)时(即非平凡多值依赖关系的前件)会存在数据冗余现象,因为每个\((y,z)\)组合所在的元组都会需要一个\(x\)。X具有候选码,意味着\(X\to Y\),因此4NF要求下的所有非平凡多值依赖都应该是函数依赖。
将BCNF分解为4NF的关键思想在于拆分对称的属性,比如关系模式WSC中,保管员和商品是对称的属性,因此可以拆分为WS(仓库,保管员)和WC(仓库,商品)两张表,这两张表都满足4NF的要求。

浙公网安备 33010602011771号