版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/84500783
简述
学习《数据库系统概念》做的笔记
- 前一篇是ER图以及ER模型相关的
- E-R模型和E-R图
文章目录
函数依赖
- 定义一条规则,“如果存在模式(dept_name, budget),则dept_name可以作为主码”。
- 这条规则就被定位为函数依赖(functional dependency)
通过函数依赖发现问题
- 如果存在这样的函数依赖,但是dept_name却不是原来的关系数据库的主码。那么说明有重复的budget信息。
无损分解和有损分解
- 无损分解:分解之后,再用自然连接的方式组合起来可以恢复为原样。否则就是有损的。
原子域和第一范式
- 之前在ER模型中讲到了子结构的问题。这里对这种东西做一个思想化。
原子域定义
- 一个域是原子的,如果该域中的元素被认为是不可分的单元(不存在子结构)。
第一范式定义
- 我们称一个关系模式R属于第一范式(First normal Form, 1NF),如果R中的所有的元素都是原子的。
使用函数依赖进行分解
超码的定义
- 旧定义: 可以唯一识别关系中的一条元组的一个或等多个属性的集合
- 新定义: 令r(R)是一个关系模式。R的子集K是R的超码的条件是
- 在r (R)的合法实例中,对r的实例中的所有元组对 和 ,若 ,则 。
关系依赖
表达式看起来比糅杂,但是意思很简单。
- 我们说这个实例是满足A->B 这样的函数依赖,就是说,对于这个实例的任两个元组,如果他们的A部分是一样的话,那么B部分也是一样的。
其实跟我们之前讲到的那个例子是完全符合的。
平凡的函数依赖
有些函数依赖是很显然的。
- 比如:
A->A
之类的。
闭包(closure)
- 在一个关系模式上,其实是有很多的函数依赖的。
- 比如:
A->B
,B-C
就可以知道A->C
。
给出闭包的概念
- 就是有一个集合F,能通过F推导出来的所有闭包的集合就是F的闭包。
例如:
- F = {
A->B
,B-C
} - 那么, F’ = {
A->B
,B-C
,A->C
} 是F的闭包
Boyce-Codd范式(BC范式)
- BC范式比较好,它能消除掉所有的基于函数依赖的冗余
条件非常简单:
基于函数依赖集合F的关系模式R属于BCNF,
对于F闭包中的所有范式a-b
,必须要有下面的两个条件满足一个
a->b
是一个平凡的函数依赖a
是函数的超码
其实这是合理的。
- 如果是超码,当然一点问题都没有。(因为超码本身就会带着一堆的函数依赖)
- 如果不是超码的话,就必须要保证这个函数依赖是平凡的。(可以理解为没什么影响的)
因为平凡的话,是说对任意的关系,这个函数依赖都成立,那。。当然无论你怎么改这玩意都是存在的啦。。当然就不管它啦。
第三范式(3NF)
3NF是相当于BCNF更弱一点的范式。
3NF放宽了点条件
对于F闭包中的所有范式a-b
,必须要有下面的三个条件满足一个
a->b
是一个平凡的函数依赖a
是函数的超码b-a
中的每一个属性,都包含于R的一个候选码中(可以是每个属性属于不同的候选码)
函数依赖理论
- 逻辑蕴涵(logically imply),(其实就说有一个函数依赖,可以用一个函数依赖集中的某些东西来推导出来,那么就蕴涵了呗)
- (所以,就会有闭包的概念出现了)
Armstrong公理
一般来说,大家都是知道这个公理的内容,而记不太住,这个公理的名字。。
- 自反律,a包含有b,则
a->b
- 增补律,
a->b
且c
也是一个属性集,则ac->bc
- 传递律,
a->b
且b->c
,则a->c
Armstrong公理是正确而有效的(sound)。
但是用这个来算闭包实在是太麻烦了。。。
- 合并律,
a->b
且a->c
,则a->bc
- 分解律,
a->bc
,则a->b
且a->c
- 伪传递律,
a->b
,bc->d
,则ac->d
属性集的闭包
a->b
,我们就说b被a给函数确定- 闭包的符号定义 为 的闭包
第四范式
多值依赖
多值依赖A->->B
条件,对于任意两个满足t1[A] = t2[A]
的实例来说,都存在有一个t3和t4,使得
t1[A] = t2[A] = t3[A] = t4[A]
t3[B] = t1[B]
并且t3[R-B] = t2[R-B]
t4[B] = t2[B]
并且t4[R-B] = t1[R-B]
第四范式(4NF)
对于在这个范式中,所有的多值依赖(来自整个的闭包)至少有下面中的一个成立
A->->B
是一个平凡的多值依赖A
是超码
正则覆盖
无关属性
- 将依赖集合F中的某个函数依赖的左边的某个属性去掉之后,任然被之前的F给逻辑蕴含。则这个属性是无关属性。
类似的定义在右半部分(但是就是去掉后的部分要蕴含原来的F)
实例
- 比如
AB->C
和A->C
在函数依赖集合上,那么B就是无关属性
正则覆盖
- 去除掉所有的无关属性
- 然后如果有
A->B
并且有A->C
那么就变成A->BC