数据库范式总结(求正则覆盖,BCNF,3NF分解算法技巧)

数据库范式

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 中每个函数依赖的左侧都是唯一的。方法:右侧转为单属性找出冗余和函数依赖(找函数依赖的方法通过找左右两侧都出现的元素)

方法

  1. 把右部分化为单属性

  2. 去掉左部分的冗余属性 比如AB->C

    1. 假设A冗余,那么看是否B+包含C

    2. 假设B冗余,…

  3. 去掉冗余的函数依赖

    • 如去掉A->B, 那么看是否可由其他依赖推出A->B

  4. 合并函数依赖

在函数依赖集中可以去除的依赖关系被称为无关的。从函数依赖左侧删除属性约束更强,右侧删除约束更弱。

正则覆盖的结果未必唯一,每次删除一个无关属性,删除后的关系要能依据删除后的推出

image-20241230155533837

合并(左侧唯一),找无关,删除

5.函数依赖分解算法

分解后不能通过简化测试来判断是否满足BCNF

BCNF方法:

①.首先将所有属性分成只在左侧出现,只在右侧出现,左右侧都出现的,由此来找到候选码

②.从不符合BCNF范式的依赖开始进行分解,将右侧的尽可能在剩余依赖集中消去。更新剩余属性集和候选码。

③.重复②步骤直至剩余的依赖集也满足BCNF

 

3NF方法:

  1. 先求出正则覆盖F_c

  2. 对于F_c里面的所有函数依赖a->b,均转化为R_i=ab

  3. 对于所有的模式R_i

    • 如果包含候选码,进行第4

    • 如果都不包含候选码, 将任意一个候选码添加到模式R_i里面

  4. 如果一个模式被另一个模式包含,则去掉此被包含的模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值