第3章 · 播客 第3集

数据库系统 · 函数依赖与范式判定

🎙️ 本集播客第3集:函数依赖、码、主属性、外码的准确定义,1NF 到 2NF、3NF、BCNF 逐级判定,证书表的 2NF 例题和工资表的 3NF 例题逐步演算,末尾把 1NF 到 BCNF 四条内涵一次串成体系。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
🎙️ 第3章播客 第3集
⬇ 下载本集 点击播放
阿明
小雅姐,范式这一节我背过好几遍,一到判定题还是错,问题出在哪?
小雅
问题在于你只背了结论没抓判定条件。先把范式这个概念钉住:关系模型满足的确定约束条件称为范式,根据满足约束条件的级别不同,范式由低到高分为 1NF 第一范式、2NF 第二范式、3NF 第三范式、BCNF 也就是 BC 范式、4NF 第四范式等。级别越高约束越严。把一个低一级的关系模型分解为高一级关系模型的过程,称为关系模型的规范化。
阿明
分解的时候有什么底线?
小雅
关系模型分解必须遵守两个准则:一是无损连接性,信息不失真,不增减信息;二是函数依赖保持性,不破坏属性间存在的依赖关系。这两个名词本身就是考点,出成「规范化分解要保持什么」的两选项。规范化的基本思想是逐步消除不合适的函数依赖,使数据库中的各个关系模型达到某种程度的分离。规范化解决的主要是单个实体的质量问题,是对于问题域中原始数据展现的正规化处理。
阿明
那规范化理论本身有什么用?总不能为了分解而分解。
小雅
原文给了两条:用数据依赖的概念分析和表示各数据项之间的关系;消除 E-R 图中的冗余联系。所以它是数据库逻辑设计的指南和工具,帮助预测模式可能出现的问题。
阿明
行,那函数依赖到底怎么说?我只会写那个箭头。
小雅
原文的通俗解释最好懂:就像自变量 x 确定之后,相应的函数值 f(x) 也就唯一确定了一样,函数依赖是衡量和调整数据规范化的最基础的理论依据。例子里记录职工信息的结构是:职工工号、职工姓名、所在部门。则说职工工号函数决定职工姓名和所在部门,或者说职工姓名、所在部门函数依赖于职工工号,记为职工工号箭头职工姓名,职工工号箭头所在部门。
阿明
函数依赖定了,码是怎么回事?
小雅
关系 R 中的一个属性或一组属性 K,如果给定一个 K 则唯一决定 U 中的一个元组,也就是 U 函数完全依赖于 K,就称 K 为 R 的码。一个关系可能有多个码,选中其中一个作为主码。注意术语是「码」,练习题解析里也叫候选码。然后两个衍生定义:包含在任一码中的属性称为主属性,不包含在任何码中的属性称为非主属性。
阿明
主属性、非主属性,后面判定 2NF、3NF 全靠这两个词。外码呢?
小雅
关系 R 中的属性或属性组 X 不是 R 的码,但 X 是另一个关系模型的码,称 X 是 R 的外码。主码和外码是一种表示关系间关联的重要手段,数据库设计中一个重要的任务就是要找到问题域中正确的关联关系,孤立的关系模型很难描述清楚业务逻辑。
阿明
定义都齐了,开始逐级判定。1NF 的标准是?
小雅
1NF 是最低的规范化要求。如果关系 R 中所有属性的值域都是简单域,其元素也就是属性不可再分,是属性项而不是属性组,那么关系模型 R 是第一范式。这一限制是关系的基本性质,所以任何关系都必须满足第一范式。第一范式是在实际数据库设计中必须先达到的,通常称为数据元素的结构化。原文举了个反例:一个「地区」属性里塞了省市两级,就不满足 1NF,把它拆开就满足了,处理后就可以以省、市为条件进行查询和统计了。
阿明
满足 1NF 之后有什么毛病?
小雅
满足 1NF 的关系模型会有许多重复值,并且增加了修改其数据时引起疏漏的可能性。为了消除这种数据冗余和避免更新数据的遗漏,需要更加规范的 2NF。
阿明
2NF 的判定条件,练习题第 3 题考的原句。
小雅
对,第 3 题题干就是这个定义:如果一个关系 R 属于 1NF,且所有的非主属性都完全依赖于主属性,则称之为第二范式,答案选 2NF。判定关键词是「完全依赖」,反面就是部分依赖——非主属性只依赖主关键字的一部分。这道题的干扰项设置你要看清:BCNF 是每个函数依赖的决定因素都包含码,3NF 是在 2NF 基础上消除传递依赖,都和题干说的「完全依赖」对不上。
小雅
原文例题跟我一步步过。获得专业技术证书的人员情况登记表结构为:省份、姓名、证书名称、证书编号、核准项目、发证部门、发证日期、有效期。这个结构符合 1NF,其中证书名称和证书编号是主码。但是发证部门只完全依赖于证书名称,即只依赖于主关键字的一部分,这就是部分依赖,所以它不符合 2NF。
阿明
不满足 2NF 会造成什么后果?我记得有三种毛病。
小雅
三条,逐条记:首先存在数据冗余,因为证书种类可能不多;其次在更改发证部门时,如果漏改了某一记录,存在数据不一致;再次如果获得某种证书的职工全部跳槽了,那么这个发证部门的信息就可能丢失,即这种关系不允许存在某种证书没有获得者的情况。冗余、不一致、信息丢失,这三条正是规范化的动机。
阿明
那怎么分解到 2NF?
小雅
可以用分解的方法消除部分依赖的情况,方法是:从现有关系中分解出新的关系表,使每个表中所有的非关键字都完全依赖于各自的主关键字。原文分成两个表:一个表是省份、姓名、证书名称、证书编号、核准项目、发证日期、有效期;另一个表是证书名称、发证部门。这样就完全符合 2NF 了。看清楚:发证部门被单独拎出去跟证书名称放一起,因为两者是直接依赖。
阿明
3NF 呢?关键词是传递依赖?
小雅
对。如果一个关系 R 属于 2NF,且每个非主属性不传递依赖于主属性,这种关系是 3NF。从 2NF 中消除传递依赖,就是 3NF。原文例题:有一个表,包含职工姓名、工资级别、工资额,其中职工姓名是关键字,此关系符合 2NF,但是因为工资级别决定工资额,也就是说非主属性工资额传递依赖于主属性职工姓名,它不符合 3NF。
阿明
传递路径是职工姓名到工资级别,工资级别再到工资额。分解办法还是投影?
小雅
同样可以使用投影分解的办法分解成两个表:职工姓名、工资级别一个表,工资级别、工资额另一个表。中间那个「工资级别」既是前一个表的依赖终点又是后一个表的码,这就是拆传递链的标准手法。
阿明
BCNF 我最虚,定义都念不顺。
小雅
先说它为什么存在:一般满足 3NF 的关系模型已能消除冗余和各种异常现象,获得比较满意的效果,但无论 2NF 还是 3NF 都没有涉及主属性间的函数依赖,所以有时仍会引起一些问题,由此引入 BC 范式,由 Boyeet 和 Codd 提出,通常认为 BCNF 是第三范式的改进。定义照抄:如果关系模型 R 属于 1NF,且 R 中每一个函数依赖关系中的决定因素都包含码,则 R 是满足 BC 范式的关系。
阿明
「决定因素都包含码」,这句话怎么用?
小雅
拿到一个关系就看它所有的函数依赖,每个箭头左边的决定因素,是不是都含有码。只要有一条依赖左边只是普通属性组合,就没到 BCNF。原文还有一句定性:当一个关系模型属于 BCNF,则在函数依赖范畴里,就认为已彻底实现了分离,消除了插入、删除的异常。注意限定词「在函数依赖范畴里」。
阿明
四级判定能不能给我串成一句话?
小雅
原文正好给了四条内涵,我逐条念:第一,非主属性完全函数依赖于码,这是 2NF 的要求;第二,非主属性不传递依赖于任何一个候选码,这是 3NF 的要求;第三,主属性对不含它的码完全函数依赖,这是 BCNF 的要求;第四,没有属性完全函数依赖于一组非主属性,这也是 BCNF 的要求。2NF 管非主属性的部分依赖,3NF 管非主属性的传递依赖,BCNF 连主属性之间和非主属性决定主属性的情形都管——一级比一级管得宽,这就是判定的总纲。
阿明
考试给一个关系问「最高属于第几范式」,我就按 2NF、3NF、BCNF 的顺序逐级检查?
小雅
对,顺序检查最稳:先看非主属性是否部分依赖码,有就没到 2NF;再看是否传递依赖,有就停在 2NF;再看所有依赖的决定因素是否包含码,不满足就停在 3NF;全过就是 BCNF。注意 2NF 到 3NF 的判定对象都是非主属性,主属性之间的依赖只有 BCNF 才管,这是最容易混的一刀。
阿明
分解呢?判定完了让我分解成 3NF 怎么办?
小雅
手法就是两次投影:2NF 把部分依赖的非主属性连同它依赖的那部分码拆出去;3NF 把传递链中间属性和它的下游拆出去,方法照着证书表、工资表两个例题的样子搬就行。别忘了底线两条:无损连接性、函数依赖保持性,缺一条这个分解在考试里就不合格。
小雅
本集必背:范式由低到高 1NF、2NF、3NF、BCNF、4NF;分解两准则是无损连接性和函数依赖保持性;码唯一决定元组,一个关系可有多个码选一个作主码,含在码中的是主属性;1NF 属性不可再分是最低要求;2NF 是非主属性完全依赖主属性,证书表因发证部门部分依赖证书名称不满足;3NF 是消除传递依赖,工资额传递依赖职工姓名不满足,拆成职工姓名加工资级别、工资级别加工资额两表;BCNF 是每个函数依赖的决定因素都包含码,在函数依赖范畴里彻底分离消除插入删除异常;四条内涵的分工:2NF 管非主属性部分依赖、3NF 管非主属性传递依赖、BCNF 管主属性间依赖和非主属性决定属性。
阿明
这回判定顺序和每级的分工都清楚了。下一集?
小雅
下一集讲反规范化——为什么规范化到头了反而要故意加冗余,四种反规范化技术一个个对号入座,练习题里那张订单表就出在那里。