关系数据库设计【笔记】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/84500783

简述

学习《数据库系统概念》做的笔记

函数依赖

  • 定义一条规则,“如果存在模式(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的实例中的所有元组对 t 1 t_1 t 2 t_2 ,若 t 1 t 2 t_1 \neq t_2 ,则 t 1 [ K ] t 2 [ K ] t_1[K] \neq t_2[K]

关系依赖

表达式看起来比糅杂,但是意思很简单。

  • 我们说这个实例是满足A->B 这样的函数依赖,就是说,对于这个实例的任两个元组,如果他们的A部分是一样的话,那么B部分也是一样的。

其实跟我们之前讲到的那个例子是完全符合的。

平凡的函数依赖

有些函数依赖是很显然的。

  • 比如:A->A之类的。

闭包(closure)

  • 在一个关系模式上,其实是有很多的函数依赖的。
  • 比如:A->BB-C 就可以知道A->C

给出闭包的概念

  • 就是有一个集合F,能通过F推导出来的所有闭包的集合就是F的闭包。

例如:

  • F = {A->BB-C}
  • 那么, F’ = {A->BB-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->bc也是一个属性集,则ac->bc
  • 传递律,a->bb->c,则a->c

Armstrong公理是正确而有效的(sound)。
但是用这个来算闭包实在是太麻烦了。。。

  • 合并律,a->ba->c,则a->bc
  • 分解律,a->bc,则a->ba->c
  • 伪传递律,a->bbc->d,则ac->d

属性集的闭包

  • a->b,我们就说b被a给函数确定
  • 闭包的符号定义 A + A^+ A 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->CA->C在函数依赖集合上,那么B就是无关属性

正则覆盖

  • 去除掉所有的无关属性
  • 然后如果有A->B并且有A->C那么就变成A->BC

猜你喜欢

转载自blog.csdn.net/a19990412/article/details/84500783