数据库系统概念笔记——第八章:关系数据库设计

Posted 叶卡捷琳堡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库系统概念笔记——第八章:关系数据库设计相关的知识,希望对你有一定的参考价值。

第八章:关系数据库设计

这一章比较难,学得不是很好,有些内容需要期末再补充

8.1 好的关系设计的特点

8.1.1 设计选择:更大的模式

在课本的示例中中,我们考虑将instructor表和department表合并为一个更大的表,起名为inst_dept
在这里插入图片描述
在合成这张新表后,似乎有好处,比如某些查询可以使用更少的连接来表达

但合成完后的表也有弊端,比如对每个系的教师,必须重复一遍系得信息(building,budget)
如果用原先的两张表,那么对于每个预算数额只存储一遍。
这说明合并后的inst_dept表并不好,因为它重复存储了预算,并且要承担某些用户可能更新一条元组而不是所有元组的预算数额,这样会产生数据不一致

这个合并后的关系还有其它的问题,比如出现一个没有教师的系时,会插入空值信息,等等

8.1.2 设计选择:更小的模式

假设从之前的大模式inst_dept表开始,我们是如何指定它要分成instructor表和department表的呢?

我们发现,在合并后的大模式中,budget会出现重复,存在数据冗余
换句话说,存在一个规则,如果存在dept_name->budget的函数一路来关系,那么这张表就存在问题,由于dept_name不是主码,因此budget会出现重复,重复即冗余

因此由于存在这个函数依赖,需要将这张表拆成instructor和department两张表

对于很多数据库而言,由于有大量属性和多个函数依赖,找到正确的分解要难得多,因此为了处理这种情况,需要后面的规范方法

注意并不是所有的分解都是有益的

比如将employee分解为以下两个模式
在这里插入图片描述
在这里插入图片描述
当分解为这两张表后,如果出现员工重名的情况,那么这两张表做自然连接的结果就和原始数据不一样了,会出现信息不一致的问题,因此这种分解是不可取的
在这里插入图片描述
上面的这种分解称为有损分解。反之,如果分解后的数据仍然一致,则称为无损分解

8.2 原子域和第一范式

如果一个域被认为是不可再分的单元,那么这个域是原子的

如果一个关系模式R的所有属性都是原子的,那么这个关系模式R属于第一范式(1NF)

注意要对这个原子性有正确的理解,具体的例子课本里有

8.3 使用函数依赖进行分解

首先明确,我们学习和使用函数依赖的目的是什么?

利用函数依赖,可以对现有关系进行分解,所以,函数依赖的本质作用是对现有的冗余的关系模式进行分解

关于后续相关符号的介绍
在这里插入图片描述
在这里插入图片描述

8.3.1 码和函数依赖

在现实世界中,数据通常存在各种约束,而满足所有这种约束的实例,被称为合法实例

现实世界中的约束可以转换为数据库中的码(超码,候选码,主码)

回顾超码的定义
在这里插入图片描述
函数依赖的定义
在这里插入图片描述
从另一个角度来说,超码所反映的依赖关系是函数依赖的一个特例
在这里插入图片描述
也就是说,函数依赖可以用于表示不能用超码表现的约束

例:对于关系模式inst_dept

inst_dept(ID,name,salary,dept_name,building,budget)

在该模式中函数依赖dept_name->budget成立
属性对(ID,dept_name)构成inst_dept的一个超码

使用函数依赖的两种方式

  • 判定关系的实例是否满足给定函数依赖集F
  • 说明合法关系集上的约束。如果我们希望只考虑R上满足函数依赖集F的关系,我们说F在r®上成立

平凡函数依赖
在这里插入图片描述
F集合的闭包
在这里插入图片描述

8.3.2 Boyce-Codd范式

Boyce-Codd范式(BCNF)可以消除基于函数依赖发现的冗余

判定有函数依赖集F的关系模式R属于BCNF的条件是
在这里插入图片描述
两个条件满足一个即可

举例
在这里插入图片描述
在这里插入图片描述
不属于BCNF模式的关系模式分解的一般规则
在这里插入图片描述

8.3.3 BCNF和保持依赖

在第七章的关于大学数据库的E-R图中,一位学生只能有一位导师。假如我们将该关系模式做一个小小的改动,让一个学生可以有多个导师,但一个系最多只能有一个

修改后的E-R图如下
在这里插入图片描述
对于新的E-R图,之前的关系模式不变,但导出的dept_advisor模式变为

dept_advisor(s_ID,i_ID,dept_name)

则下面两个函数依赖在dept_advisor上成立

  • i_ID->dept_name
  • s_ID,dept_name->i_ID

注意dept_advisor不属于BCNF模式,如果按BCNF分解规则进行分解,会得到以下两张表

(s_ID,i_ID)
(i_ID,dept_name)

但是照这样分解之后,新的模式虽然满足BCNF,但却不满足我们要求的依赖关系

上面这种分解不是保持依赖的,由于常常希望保持依赖,需要考虑一种比BCNF更弱的范式,称为3NF

8.3.4 第三范式

第三范式的定义
在这里插入图片描述
注意任何满足BCNF的关系模式都满足3NF,所以BCNF是比3NF更严格的范式

8.3.5 更高的范式

注意BCNF分解不一定是完美的,也可能会出现问题,比如下面这个例子
在这里插入图片描述
因此解决这些问题需要多值依赖和更高的范式

8.4 函数依赖理论

8.4.1 函数依赖集的闭包

给定模式上的函数依赖F,我们就可以证明,某些其它的函数依赖在模式上也成立。我们称这些函数依赖被F“逻辑蕴含”。
在检验范式时,不能只考虑给定的函数依赖集,还需要考虑模式上成立的所有函数依赖

逻辑蕴含的定义

给定关系模式r ( R ),如果r ( R )的每一个满足F的实例也满足f,则R上的函数依赖f被r上的函数依赖集F逻辑蕴含

例子:
在这里插入图片描述
Armstrong公理
在这里插入图片描述
计算F+的算法
在这里插入图片描述

8.4.2 属性集的闭包

属性集闭包的概念
在这里插入图片描述
例子
在这里插入图片描述

8.4.3 正则覆盖

对于一个关系模式的函数依赖集F,每当用户在该关系上执行更新时,数据库系统必须确保此更新不破坏任何函数依赖

无关属性

如果去除函数依赖中的一个属性不改变该属性依赖集的闭包则称该属性是无关的

无关属性的形式化定义
在这里插入图片描述
正则覆盖的定义
在这里插入图片描述
计算正则覆盖的算法
在这里插入图片描述
求正则覆盖的例子
在这里插入图片描述
注意,在有些例子里,正则覆盖不止一个,可能有多个

8.4.4 无损分解

无损分解的定义
在这里插入图片描述
更通俗地说,无损分解地意思是,分解后两者作自然连接的结果与分解前相同

select * from
r1 natural join r2

select * from
r

得到的结果相同

对于二元分解,判断无损连接的方法
在这里插入图片描述

8.4.5 保持依赖

在分解后依然保持依赖,称为保持依赖

保持依赖的具体定义
在这里插入图片描述

8.5 分解算法

8.5.1 BCNF分解

1.判定一个关系模式是否属于BCNF的简化方式
在这里插入图片描述
2.BCNF分解算法

如果一个关系模式不属于BCNF,需要将其转换为BCNF,可以利用BCNF算法将其转换,算法的具体步骤如下
在这里插入图片描述
BCNF分解的例子

对于一个关系模式
在这里插入图片描述
在这里插入图片描述
使用算法不断迭代之后得到最终的分解结果

8.5.2 3NF分解

将模式转换为3NF无损分解且保持依赖的算法
在这里插入图片描述

8.5.4 BCNF和3NF的比较

关于数据库设计的两种范式:3NF和BCNF,3NF的一个优点是我们总可以在满足无损并保持依赖的前提下得到3NF设计。但3NF也有缺点,有时候需要用空值表示数据项间的某些可能有意义的联系

对于应用函数依赖的数据库的设计目标是

  • BCNF
  • 无损
  • 保持依赖

由于不能总是满足这三个要求,因此不得不在BCNF和3NF两者间作选择

8.6 使用多值依赖的分解

多值依赖的部分不太重要,考试也不涉及,这里省略

二、PPT补充的内容

1.候选码求解理论

求解一个关系的候选码,是一个NP问题,但这里有一个相对简单的方法

对于给定的关系模式R(U,F),可以将其属性分为4类

  • L类:仅出现在F的函数依赖左部的属性
  • R类:仅出现在F的函数依赖右部的属性
  • N类:在F的函数依赖两边均未出现的属性
  • LR类:在F的函数依赖两边均出现的属性

快速求解候选码的充分条件
在这里插入图片描述
例:设关系模式R(U,F),U = {A,B,C,D},F = {D->B,B->D,AD->B,AC->D},求R的候选码

A、C是L类属性,AC必是R的一个候选码的成员,(AC)F+ = {ACDB},所以AC是R的唯一候选码

推论
在这里插入图片描述
定理2
在这里插入图片描述
定理3
在这里插入图片描述
例题
在这里插入图片描述
推论
在这里插入图片描述

2.无损连接的判断——表格法

使用以下方法可以判断是否是无损连接
在这里插入图片描述
在这里插入图片描述
具体的示例在PPT上有

3. 第二范式(2NF)

什么关系属于第二范式呢?
在这里插入图片描述

以上是关于数据库系统概念笔记——第八章:关系数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

操作系统概念笔记——第八章:内存管理

读书笔记 - js高级程序设计 - 第八章 BOM

第八章 指针实验

C语言第八章:函数概念递归函数内联函数

深入理解计算机操作系统--读书笔记-第八章异常

CSAPP读书笔记--第八章 异常控制流