【数据库】模式分解与模式设计

285 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.模式的分解

一个十分抽象的定义: 在这里插入图片描述 但我们分解的一个目的,就是 既要保持函数依赖,又要保持无损连接性

如果一个分解具有无损连接性,则它能够保证不丢失信息。 如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况

1.1 无损连接

又一个抽象的定义 在这里插入图片描述 通俗点说,就是分解之后的几个关系进行自然连接,要和分解之前的关系模式相同。

定理:注意“或”“其中一个” 在这里插入图片描述 该定理的一个例题: 在这里插入图片描述

1.2 保持依赖

定义: 在这里插入图片描述 函数依赖集在分解前后不变

严格定义: 在这里插入图片描述 若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的(Preserve dependency)。

判断保持依赖的例题: 在这里插入图片描述

综合判断分解是否恰当的例题: 在这里插入图片描述

2.模式设计

2.1 明确概念

2.1.1 范式

范式是对关系的不同数据依赖程度的要求

2.1.2 主属性与非主属性

主属性:候选码中的属性 非主属性:不包含在任何一个候选码中的属性称为非主属性 在这里插入图片描述

2.2 1NF 第一范式

定义:关系中每一分量不可再分。即不能以集合、序列等作为属性值 (也不可以有多值属性)

不良特性分析: 在这里插入图片描述

  • 插入异常:如果学生没有选课,关于他的个人信息及所在系的信息就无法插入
  • 删除异常:如果删除学生的选课信息,则有关他的个人信息及所在系的信息也随之删除了
  • 更新异常:如果学生转系,若他选修了k门课,则需要修改k次
  • 数据冗余:如果一个学生选修了k门课,则有关他的所在系的信息重复

2.3 2NF 第二范式

定义:若R∈1NF,且每个非主属性完全依赖于R的每一个候选关键字,则称R∈2NF。重点是消除非主属性对码的部分依赖(即只依赖候选码中的一部分)

分解为2NF方法

采用投影运算消除部分依赖,例 在这里插入图片描述 R可以通过R1和R2自然连接恢复

更为系统化的方法: ①找出基本函数依赖 ②找出主码 ③找出函数依赖集的正则覆盖 ④找出正则覆盖中为部分函数依赖的进行分解

例题: 在这里插入图片描述 解答: 在这里插入图片描述 在这里插入图片描述

不良特性分析: 在这里插入图片描述

  • 插入异常:如果系中没有学生,则有关系的信息就无法插入
  • 删除异常:如果学生全部毕业了,则在删除学生信息的同时有关系的信息也随之删除了
  • 更新异常:如果学生转系,不但要修改SD,还要修改DEAN,如果换系主任,则该系每个学生元组都要做相应修改
  • 数据冗余:每个学生都存储所在系的系主任的信息

2.4 3NF 第三范式

定义:如果R的任何一个非主属性都不传递依赖于它的任何一个侯选关键字,则称R是第三范式,简记为3NF。重点是消除非主属性对码的传递依赖在这里插入图片描述 另外的定义:下面三项至少一项成立 1,a—>b是平凡的函数依赖,即b属于a。 2,a—>b,其中a是关系模式R的一个超码。 3,b - a中的每个属性A都包含于R的一个候选码。(这一项成立不是BCNF)

分解为3NF方法

①求出最小正则覆盖Fc
②对于Fc中每个函数依赖α\alphaβ\beta: 构建模式Ri=α+β\alpha+\beta(即两个集合的并集) ③如果Ri中都不包含候选码,再构造出一个Ri+1等于R的任意候选码
④去除包含于其他模式的Ri,剩余Ri即为所求

例题: 在这里插入图片描述 解: 注意:如果是求正则覆盖,则第一个函数依赖要跟第三个函数依赖合并
但这里题目是说要基本函数依赖 在这里插入图片描述 *

不良特性分析: 在这里插入图片描述

  • 插入异常:如果没有学生选修某位老师的任课,则该老师担任课程的信息就无法插入
  • 删除异常:删除学生选课信息,会删除掉老师的任课信息
  • 更新异常:如果老师所教授的课程有所改动,则所有选修该老师课程的学生元组都要做改动
  • 数据冗余:每位学生都存储了有关老师所教授的课程的信息

症由:TNO→CNO,BCNF会消除

2.5 BCNF

在这里插入图片描述 即:BC范式要求所有非平凡函数依赖都形如X→Y,其中X是一个超码 归根结底是在3NF基础上消去主属性的传递函数依赖

另外的定义:以下两项至少一项成立
a—>b是平凡的函数依赖,即b属于a。
a—>b,其中a是关系模式R的一个超码。

算法伪代码: 在这里插入图片描述 在这里插入图片描述

例子: 在这里插入图片描述 缺陷:BCNF不一定能保持依赖

3.总结

分解为3NF,BCNF的过程所涉及的概念(正则覆盖等)可以参考BCNF和第三范式的分解算法 在这里插入图片描述