第六章 关系数据库规范化理论
1.为什么要学习关系数据库规范化理论?
感性认识:
当遇到一个实际问题时,我们需要决定如何建立数据库、创建表以及合理组织其结构来有效解决问题。
(1)基本概念回顾
关系:可简单的理解为二维表
关系模式:即二维表的逻辑结构
我们称采用基于关系模型组织数据的系统为关系数据库。它按照二维表格的形式存储信息。在该体系中,这些行列组合形成了若干个表格。这些表格共同构建了一个完整的数据库体系。
关系数据库的模式:即关系数据库的逻辑结构
(2)关系模式的形式化定义
在《数据库系统概论》中对二维表结构进行了详细阐述
一个关系模式由五个要素构成:即它是一个五元组
R(U,D,DOM,F)
其中:
R表示具体来说是关系名或表名
U代表属性集合
D为属性域集合
DOM为属性与域之间的映射集合
F则包含U上的一系列数据依赖关系
关系数据库规范化理论的核心关注点在于R、F与U三者之间的相互关联与制约机制的研究。在教学过程中为了简化理论讲解教学人员有时会将五元组模型简化为三元组形式以降低复杂度同时不影响基本原理的理解
三元组表示为R(U, F);当且仅在关系r定义于U上并满足函数依赖集F时;此时称该关系为属于该关系模式R(U,F)的模式中的一个实例
本节中我们对F中的数据依赖关系进行具体说明,并后续将深入探讨函数依赖和多值依赖。
在关系内部属性与属性之间构成了数据依赖的概念。
该约束关系通过分析各属性间的值是否相等来揭示数据间的关联性。
它反映了现实世界中各实体间的相互联系,并作为数据的基本特性存在,在语义层面上有所体现。
数据依赖分类:
函数依赖(Functional Dependency, 简记为FD)是一种广泛存在于现实世界中的现象。例如,在描述学生信息时, 通常涉及的属性包括学号码(Sno)、学生姓名(Sname)和所属系别(Sdept)等。因为每个学号码仅对应一位学生, 而每位学生只属于一个班级, 所以一旦某个学号码被选定后, 其对应的姓名和所属班级也随之被唯一确定下来。这种属性间的依存关系与数学中函数概念具有相似之处: 当给定自变量x的取值后, 函数y也会随之被唯一地赋值下来。
多值依赖(Multivalued Dependency,简记为MVD)
其他
(4)数据依赖F对关系模式的影响
因为关系数据库规范化理论主要研究的是三元组R(U,F),U我们都好理解,最重要的是F,这里我们简单的了解一下F对关系模式,即表的逻辑结构的影响,让我们理性的认识为什么学习关系数据库规范化理论
举个例子:
[例1]建立一个描述学校教务的数据库,数据库涉及的对象有:
学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grade)
我们选择单一的关系模式Student来表示这些对象:
该关系的结构由U和F组成:
其属性集合为:
其中包含Sno、Sdept、Mname、Cname和Grade五个字段。
现实世界的事实语义涉及这些对象之间的联系:
①任何一个系都包含多个学生,并且每一个学生仅归于一个系。
②每个系仅设立一名正职负责人。
③任何一个学生都能够选择学习多门课程,并且每门课程允许多个学生参与选修。
④每个学生在每一门课程上都有一个成绩。
由此可得属性集U上的一组函数依赖关系F。其中函数依赖集F由以下几部分组成:Sno到Sdept的关系;Sdept到Mname的关系;以及(Sno,Cno)共同决定Grade的关系。如图所示。
如果仅当仅考虑函数依赖这种数据依赖时,则能够得到一个描述学生的关系模式Student <U,F>。表6.1记录了该关系模式在某个时刻的状态信息,即其对应的数据表。
这个关系模式设计的并不好,存在以下问题:
1️⃣ 数据冗余(Data redundancy)
比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同,如表6.1所示。这将浪费大量的存储空间。
2️⃣ 更新异常(update anomalies )
由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。 比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。
3️⃣ 插入异常(insertion anomalies )
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
4️⃣ 删除异常( deletion anomalies)
如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。
鉴于存在以上种种问题,可以得出这样的结论:
基于Student的关系模型不具备理想特性。
所谓的理想模型应满足以下条件:
避免出现插入异常、删除异常及更新异常,并使数据冗余尽量减少。
这种状况通常是由于该模型中存在的特定数据依赖关系所导致的。
解决这一问题的方法是将该单一的关系模型分解为不相容的数据依赖部分,并将其转化为多个理想的关系模型。
因此我们可以将这一单一的关系模型拆分为三个独立的关系模型:
S(Sno,Sdept,Sno→Sdept);
SC(Sno,Cno,Grade,(Sno,Cno)→Grade);
DEPT(Sdept,Mname,Sdept→Mname)
这些数据库模式在结构设计上均避免了插入异常和删除异常的问题,并且成功解决了数据冗余的问题。
一个数据库模式中的数据依赖可能会有哪些不良特性?如何改进这些不良特性?这些都是接下来第2章规范化理论要探讨的核心内容。
6.2. 规范化 —— 改造关系模式以解决插入异常、删除异常、更新异常以及数据冗余等问题。
(1)规范化研究什么?
规范化研究如何基于属性间的依赖关系来评估关系是否具备某些不合适的数据特性。
一般通过分析属性间的依赖关系来划分不同级别(如第一范式、第二范式等)的规范化程度。
这些规范化的目的是用于改进关系模式结构并消除不合适的数据依赖。
接下来我们将系统地学习相关知识,并应用于优化数据库设计。
函数依赖关系是数据库设计中的核心概念之一。
候选键用于唯一标识数据库中的记录。
范式是衡量数据库规范化程度的重要标准。 2NF(第二正规形)和3NF(第三正规形)分别对应不同的规范化要求;BCNF(波尔切斯基正规形)是一种更强的规范化标准;多值依赖则涉及到数据冗余的问题;4NF(四价范式)进一步优化了数据结构以避免交叉引用问题。 其中函数依赖关系和候选键是理解学习1NF至4NF范式的基础。
(2)函数依赖
这里我们讨论数据依赖F中的函数依赖,分为以下几种类型:
1、函数依赖
2、平凡函数依赖与非平凡函数依赖
3、完全函数依赖与部分函数依赖
4、传递函数依赖
令R(U)为一组关系模式,则其中X、Y均为U的子集。若从R(U)中任取一个可能的关系r,则该关系满足:若在关系r中不存在两个元组其在X上的属性值完全相同但其在Y上却表现出不同的属性值,则称该关系在Y上表现出良好的区分能力。
X函数确定Y或Y函数依赖X,记做X->Y; F(X)=Y
当X\rightarrow Y且Y\not\subseteq X时,则定义这种关系为非平凡的函数依赖;而当Y\subseteq X时,则定义这种关系为平凡的函数依赖
直接依赖这里我们举个例子:
BH(sno,idCard,address)
学生个体标识字段值为学号信息,
身份个体标识字段值为身份信息,
地址个体标识字段值为地址信息,
其中,学生个体标识字段值将映射至身份个体标识字段值,
同时,身份个体标识字段值也将反向映射至学号信息,
并形成双向映射关系,即学号信息与身份个体标识字段之间存在双向对应关系.
基于上述分析,我们发现,地址信息将直接关联到学号信息.
由此可知,Z的信息直接来源于学号信息.
(3)码
- 作为关系模式中的核心概念之一, 码在上述关于码的相关定义中涉及了多个定义. 本节将采用函数依赖理论作为基础来重新界定码的概念.
- 每个实体集只能由一个候选码所唯一标识
在关系数据库中定义的关系必须符合特定的标准,在这些标准中表现出了不同的层次性特征。根据所满足的不同标准条件,形成了多样化的范式体系。将较低层次的标准通过分解方法转换成多个较高层次标准的过程称为规范化处理。
6.3.1.1. NF
每一个非主属性完全函数依赖于任何一个候选码
不属于2NF会产生以下几个问题:
插入冲突
任何非主属性既不传递依赖于码,
这可能会导致2NF类问题出现。
6.3.1.3. BCNF
若X->Y且Y不属于X时,X必含有码
任何非主键都完全函数依赖于每个键。
任何主键也都完全函数依赖于每个都不包含它。
没有哪一个属性会完全函数依赖于那些不属于码的一组或多个属性。
6.3.1.4. 多值依存性
对于关系模式R(U)中的每一组满足X,Y,Z=U−X−Y条件的关系r,
给定一对(X,Z),都有对应的Y值集合,
这些Y值仅由X决定而与Z无关。
6.3.1.5. NF
对于每一个非平凡的多值依赖X->->Y,X都含有码
6.3.1.6 规范化基本步骤

