第八章 关系数据库的设计

第一范式

关系中任何属性的域均是原子的。

超码
唯一标识关系中一条元组的一个或者多个属性的集合。

平凡函数依赖

如果B包含于A,则形如A–>B这样的函数依赖是平凡的。

模式R上满足函数依赖集F的关系,说F在r®上成立。
F+表示F集合的闭包。

BCNF范式

按照定义任何只包含两个属性的模式都属于BCNF。
消除所有基于函数依赖发现的冗余
至少有一项成立:

  • A->B是平凡依赖;
  • A是模式R的一个超码。

分解成为BCNF的一般规则,存在非平凡函数依赖A–>B,且A不是R的超码:

  • (A并B);
  • (R-(B-A))。

出现问题:BCNF分解会妨碍某些函数依赖造成的检查。
引入一种比BCNF弱的范式:第三范式

第三范式

最小的超码:候选码。
对于F+中所有形如A–>B的函数依赖,下面至少一项成立:

  • A–>B是一个平凡的函数依赖;
  • A是R的一个超码;
  • B-A中的每个属性A都包含于R的一个候选码中。

当不存在保持依赖的BCNF设计时,必须在BCNF和3NF之间进行权衡。

Armstrong公理

AB代表A并B。
找到F的全部F+:

  • 自反律;B包含于A,则A–>B成立
  • 增补律;A–>B成立且C为一属性集,则AC–>BC成立
  • 传递律。如果A–>B和B–>C成立,那么A–>C成立。

公理扩展

  • 合并律:A–>B和A–>C成立,那么A–>BC成立;
  • 分解律:A–>BC成立,那么A–>B和A–>C成立;
  • 伪传递律:A–>B和BC–>D成立,那么AC–>D成立。

属性集的闭包

如果a–>B,称属性B被a函数确定;

例如:考虑模式R=(A,B,C,G,H,I)以及函数依赖集F{A–>B,A–>C,CG–>H,CG–>I,B–>H}
现在计算函数依赖集下的(AG)+,开始时result = AG/

  • 由A–>B,将result 变为ABG;
  • 由A–>C,result变为ABCG;
  • 由CG–>H,result变为ABCGH;
  • 由CG–>I,result变为ABCGHI。

用途

  • 用于计算a函数确定的属性集的高效算法可以用来判断a是否为超码,若a+包含属性R中的所有属性,那么a为超码;
  • 检查函数依赖a–>B是否成立,只需要看a+是否包含B;
  • 另一种计算F+的方法。

无关属性

去除函数依赖集中的一个属性不改变函数依赖集的闭包;
考虑函数依赖集F及F中的函数依赖a–>b

  • 如果A属于a,并且F逻辑蕴含(F-{a-b})并上{(a-A)–>b},则属性A在a中是无关的。
  • 如果A属于b,并且函数依赖集(F-{a-b})并上{a–>(b-A)}逻辑蕴含F,则属性A在b中是无关的。
    例如:AB–>C,和A–>C,那么B在AB–>C中是无关的。

如何检验一个属性是否是无关属性
例如:假定F包含AB–>CD,A–>E,且E–>C,检验C在AB–>CD中是否是无关的,先计算F = {AB–>CD,A–>E,E–>C}下AB的属性闭包,闭包计算为ABCDE,包含CD,推断出C是无关的。

F的正则覆盖

  • 任何函数依赖不存在无关属性;
  • 左半部是唯一的,例如不存在A–>B,A–>C,而应该写成A–>BC.

计算正则覆盖
考虑模式(A,B,C)上的如下函数依赖集F,先来来计算F的正则覆盖:
A–>BC,B–>C,A–>B,AB–>C

  • 存在两个函数依赖在箭头左边具有相同的属性集:A–>BC,A–>B将这些函数依赖合并成A–>BC.
  • A在AB–>C中是无关的,因为F逻辑蕴含(F-{AB --> C})并上{B–.>C}。
  • C在A–>BC中是无关的,因为A–>BC被A–>B和B–>C逻辑蕴含。
  • 于是正则覆盖为:A–>B,B–>C.

无损分解和有损分解

无损分解:分解过后的两个关系R1和R2进行自然连接和分解前的R相同。

R1∩R2是R1或者R2的超码,则R的分解就是无损分解。

猜你喜欢

转载自blog.csdn.net/weixin_42882887/article/details/89073736