上一次我们介绍了数据库中关系代数查询,从选择、投影到连接等操作符,探索了数据库查询
大家可以移步我的文章:数据库系统概论期末经典大题讲解(用关系代数进行查询)-CSDN博客
今天,我们将继续沿着数据库系统的精髓探索之路,深入研究数据库系统概论中的经典大题:范式、闭包和主码。让我们深入挖掘这些概念,并为期末考试做好充分准备
目录
一.范式提升
1NF
2NF
3NF
BCNF
综合例子:
二.求闭包
三.求主码
一.范式提升
1NF
关系R中每个分量都是不可分割的数据项,则R属于1NF
2NF
定义 若R属于1NF,且每个非主属性完全函数依赖于码,则称R属于2NF。
该关系模式属于1NF,不属于2NF。 因为有非主属性部分函数依赖于码:
- 非主属性Sdept、 Sloc部分函数依赖于码
方法:
非主属性有两种: 一种完全依赖于码;
一种部分依赖于码 --- 将其分出
就是完全依赖的单独作为一个关系模式,部分依赖的将部分依赖费主码和非主属性作为一个关系模式
可变为SC(SNO, CNO, G) S-L(SNO, SDEPT, SLOC) 此时便是2NF
3NF
定义:若R属于2NF, 且它的任何一个非主属性都不传递依赖于任何候选码,则R属于3NF
(不能有传递依赖)
上述例子存在 SNO->SDEPT , SDEPT->SLOC (存在传递依赖了,不是3NF)
规范化过程中通过一组投影分解消除传递依赖,建议作如下分解(第二步分解):
已知关系R(A,B,C), A为主码(A->B, A->C),且B->C,
则将R分解成为两个投影: R1(B,C), B为主码 R2(A,B), A为主码,B为外码
据此可分解为:SC(SNO, CNO, G) S-L1(SNO, SDEPT,) S-L2(SDEPT, SLOC)
BCNF
关系模式R中每一个决定因素都包含(或是)码,则R属于BCNF
综合例子:
某书店购书情况汇总登记表 :
根据分析可以得到一组函数依赖: F={ NO→C#,C#→CN,C#→CA,B#→BN,B#→EU,B#→UP,(NO,B#) →QUA },表中(NO,B#)为关键字
先升级为2NF
再分解为3NF
二.求闭包
在关系模式R<U, F>中为F所逻辑蕴含的函数依赖的全体叫做F的闭包,记为F+
设F为属性集U上的一组函数依赖,X属于U, X+F={A|X ->A能由Armstrong公理导出}, X+F称为属性集X关于函数依赖F的闭包
步骤:
eg:
三.求主码
设关系模式R<U, F> (1) 将R的所有属性分为 L、 R、N和 LR四类
1.
- L类: 仅出现在F的函数依赖左部的属性;
- R类: ………………………...右…………;
- N类: 在F的函数依赖左右两边都不出现的属性;
- LR类: …………………………都出现的属性
2.
- 开始求L类中单个属性的闭包 ,如果最后结果是全部属性,那个那个属性即为主码
- 所有单个属性都不能达到结果,那就开始找多个属性结合的闭包(从2到n慢慢增加,直到结果是全部属性)
- 如果L类中用完了都不行,那就加上N类属性,先加一个,不行在增加。
- 如果L+N都不行,最后加上LR类吧(当然老师不会出那么复杂的,一般顶多加上N类就行了)
eg:
设关系模式R(A, B, C, D, E, P), 其函数依赖集: F={A→D, E→D, D→B, BC→D, DC→A}
求R的所有候选码。
解: L类: C, E
R类:
N类: P
LR类: A, B, D
因为(CEP)F+=CEPDBA,所以CEP是R的唯一候选码
那么今天就先到这里了,之前写博客都是用富文本,今天发现好多符号都不能打出,影响大家的观感,只能截图进来,看来要去学习学习markdown了。希望下次能学会markdown来有更好的格式吧