数据库-常见概念及一二三、BC范式

属性闭包

闭包就是由一个属性直接或间接推导出的所有属性的集合。

闭包算法:

    result = a		//求属性a的属性闭包
    while(result 发生改变){
    	for 每一个result中的关系a->b
    		if(a 在result中){
    			result加入属性b
    		}
    }

测试超键:如果a是R的超键那么我们可以计算a的闭包A,如果A包含了R的所有属性那么a的确是R的超键。

常用推导式:
(1)Reflexivity:b是a的组成,那么a决定b
(2)Augmentation:a决定b那么ra决定rb
(3)Transitivity:传输性
(4)Union:a决定b,a决定c那么a决定bc
(5)Decomposition:a决定br,那么a决定b,a决定r
(6)Pseudotransitivity(伪递移法则):如果a决定b以及cd决定e,那么ac决定e

简单例子:
f={a->b,b->c,a->d,e->f};由a可直接得到b和d,间接得到c,则a的闭包就是{a,b,c,d}

正则覆盖

F的正则覆盖Fc是一个依赖集,使得F与Fc相互逻辑蕴涵。Fc中任何函数依赖都不含无关属性。Fc中函数依赖左半部分都是唯一的。

正则覆盖算法

//由定义可以得到,正则覆盖其实就是在做去除所有冗余属性这个事
Fc = F
while(Fc 发生变化 ){
	使用合并规则构造a1a2...an---->b1b2...bn的格式
	去除冗余			//请参考附加属性Extraneous Attributes的算法
}

附加属性

Extraneous Attributes,额外属性,附加属性。意思是如果一个关系中拿掉一个属性后的属性闭包与原属性闭包相同,那么很明显有没有那个被拿掉的属性都一样,这是一个冗余的属性。

附加属性算法

//A中关系alpha->beta

//测试属于alpha的属性a是否多余
计算{alpha - a}的属性闭包 B
if B包含a {
	a属性多余
}else{
	a属性不多余
}

//测试属于beta的属性b是否多余
A1 = (A-{alpha->beta})∪{alpha->(beta-b)}
在 A1 下计算alpha的闭包,如果A1包含b那么b多余

简单例子
AB->CD ,A->E,E->C,判断AB->CD中C是否多余
易得 AB->D下
(AB)的闭包 = (ABCDE)
C in AB->CD is extraneous;

无损连接分解

https://blog.csdn.net/suguoliang/article/details/80880923

无损连接分解是将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算仍能还原到原来的关系模式,则称这种分解为无损连接分解。

关系模式R(U,F)的一个分解ρ={R1<U1,F1>,R2<U2,F2>}具有无损连接的充分必要条件是:U1∩U2→U1-U2 属于F+ 或 U1∩U2→U2 -U1属于F+

一个优秀的关系模式的分解应当满足三个条件:消除异常(冗余、更新异常、删除异常),信息的可恢复以及依赖的保持。

无损连接分解算法

//有属性集R,依赖集F,一个分解r{r1,r2,r3,r4...rn}
while(有变化){
	for 每一个R中的关系 a->b{
		对于所有的r中左侧含相同a的分解
		统一b
	}
	if 某一个分解ri变成R{
		是无损连接
	}
}

依赖保持

如果分解可以推出原依赖,就说它们是保持依赖的。

依赖保持算法

//对F上的每一个α→β
result = α; 
while(result发生改变){
	for each 分解后的Ri 
		t=(result ∩ Ri)+  ∩  Ri 
		result=result  ∪  t
}
if β属于result{
	α→β被保持
}else{
	α→β不被保持
}

BCNF范式

BC范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。即不存在非关键字段决定关键字段的情况。

BC范式分解算法

result = R 
R_1 = 空集
for i in 1,2,3,4....n 
    //如果R_i不违反BCNF,则不分解R_i
    if R_i 关系模式中有 α --> β 违反了 BC范式
        relust =  (result-R_i) + (R_i-(α-β)) + (α+β)

简单例子:R = {A ,B, C, D}
I. C → D, C → A, B → C
很容易由 C → D, C → A, B → C
判断出 B 是主码 由于存在 B->C->D 和 B->C->A 故不是3NF,更不是BCNF
分解如下:(B,C)(C,A,D) 这两个关系都是BCNF

II. ABC → D, D → A如果R不是一个BCNF, 将它分解为BCNF范式。
由于ABC →D,D →A 可知 ABC 是主码,但存在非主属性决定主属性(D->A)不满足BCNF,分解如下:(A,B,C)(D,A) 这两个关系都是BCNF

一、二、三范式

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元。

第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键。

第三范式(3NF):满足第二范式(2NF)且表中的每一列只与主键直接相关而不是间接相关,即表中的每一列只能依赖于主键。(即一张表中只能有另一张表中的主键,而不能有其他的任何信息,其他的信息一律用主键在另一表查询)

三范式是BC范式的放宽

三范式分解算法
在这里插入图片描述

多值依赖

多值依赖MVD:指在关系R中,当给定某个属性集合的值 时,存在另外一组属性集合,该组属性集合的值与关系中所有其他属性的值独立。为便于理解,将一个关系的属性分为三个属性组A、B、C,当给定属性A的值 时,B和C的属性组上的取值独立,意思是说B和C的取值可以随意搭配出现在关系中,B的取值不会影响C的取值。

候选码的选取

算法:按以下步骤求候选键:
1.只在FD右部出现的属性,不属于候选码;
2.只在FD左部出现的属性,一定存在于某候选码当中;
3.外部属性一定存在于任何候选码当中;
4.其他属性逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。

例:R<U,F>,U=(A,B,C,D,E,G),F={AB–>C,CD–>E,E–>A.A–>G},求候选码。

因G只在右边出现,所以G一定不属于候选码;而B,D只在左边出现,所以B,D一定属于候选码;BD的闭包还是BD,则对BD进行组合,除了G以外,BD可以跟A,C,E进行组合
先看ABD
ABD本身自包ABD,而AB–>C,CD–>E,A–>G,所以ABD的闭包为ABDCEG=U
再看BDC
CD–>E,E–>A,A–>G,BDC本身自包,所以BDC的闭包为BDCEAG=U
最后看BDE
E–>A,A–>G,AB–>C,BDE本身自包,所以BDE的闭包为BDEAGC=U

因为(ABD)、(BCD)、(BDE)的闭包都是ABCDEG所以本问题的候选码有3个分别是ABC、BCD和BDE

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值