数据库范式
1.好的设计的特点
分解:有损分解无损分解。
有损分解:分解后的关系可能无法通过自然连接将所有数据恢复回原来的关系。
无损分解:分解成关系时没有信息丢失
2.函数依赖
函数依赖:如果在关系 R 的任意两个元组 t_1 和 t_2 中
只要 t_1[X] = t_2[X],就有 t_1[Y] = t_2[Y],那么称在关系 R 中,Y 函数依赖于 X,记为:X \rightarrow Y
平凡函数依赖:AB->A,A->A
闭包:由集合F能推导出的F^*,若A->B,B->C成立,则推断A->C也成立
无损分解的新理解:如果分解后的R_1∩R_2的结果是R1或R2的超码,则分解是无损分解
3.范式
BCNF范式
所有α->β的函数依赖要么是平凡的,要么α是超码。相比3NF消除了传递依赖。
数据库设计属于BCNF的条件是每一个模式都属于BCNF
保持依赖:对于每个函数依赖来说,其对应的属性都可以在同一个关系中找到
BCNF和保持依赖不能总是同时满足。
3NF范式
多增加了一个条件:β-α中的每个属性都被包含于R的候选码中
3NF是对BCNF的最小放松。
比较:因为BCNF不一定能保持依赖,所以必须在保持依赖的3NF和BCNF中选择
4.函数依赖理论
F 的闭包是被 F所逻辑蕴含的所有函数依赖的集合,我们将 F 的闭包记作 F^+
阿姆斯特朗公理:自反律,增补律,传递律,合并律,分解律,伪传递律。
计算属性集的闭包:将 X 本身加入闭包集合 X^+,即 X^+ = X。遍历所有已知的函数依赖集,如果某个依赖的左边(即决定属性集)是X^+的子集,则将该依赖 右边 的属性加入到 X^+ 中。重复步骤,直到没有新的属性可以加入到 X^+ 为止。
用途:验证属性集是不是超码,验证函数依赖是否成立,计算F^+
正则覆盖F_c:正则覆盖是一个等效的函数依赖集,不破坏任何函数依赖,所有的函数依赖集中的每个依赖都是 最简的,即每个依赖的左边是 不可再缩小的。F_c 中每个函数依赖的左侧都是唯一的。方法:右侧转为单属性找出冗余和函数依赖(找函数依赖的方法通过找左右两侧都出现的元素)
方法:
-
把右部分化为单属性
-
去掉左部分的冗余属性 比如AB->C
-
假设A冗余,那么看是否B+包含C
-
假设B冗余,…
-
-
去掉冗余的函数依赖
-
如去掉A->B, 那么看是否可由其他依赖推出A->B
-
-
合并函数依赖
在函数依赖集中可以去除的依赖关系被称为无关的。从函数依赖左侧删除属性约束更强,右侧删除约束更弱。
正则覆盖的结果未必唯一,每次删除一个无关属性,删除后的关系要能依据删除后的推出
合并(左侧唯一),找无关,删除
5.函数依赖分解算法
分解后不能通过简化测试来判断是否满足BCNF
BCNF方法:
①.首先将所有属性分成只在左侧出现,只在右侧出现,左右侧都出现的,由此来找到候选码
②.从不符合BCNF范式的依赖开始进行分解,将右侧的尽可能在剩余依赖集中消去。更新剩余属性集和候选码。
③.重复②步骤直至剩余的依赖集也满足BCNF
3NF方法:
-
先求出正则覆盖F_c
-
对于F_c里面的所有函数依赖a->b,均转化为R_i=ab
-
对于所有的模式R_i
-
如果包含候选码,进行第4
-
如果都不包含候选码, 将任意一个候选码添加到模式R_i里面
-
-
如果一个模式被另一个模式包含,则去掉此被包含的模式。