posts - 87,comments - 0,views - 12128

码属性和非码属性

在讲函数依赖和范式前,我们需要了解码属性和非码属性

码属性就是构成候选码的属性,非码属性就是不构成候选码的属性,主属性是指构成主码的属性

候选码是能够确定关系R的最小属性集合,可以有多个,即多种匹配方法,超码就是一个候选码随便加上另一个属性,主码就是候选码中选一个来当,所以主属性也是码属性

函数依赖

基本介绍

函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。

这句话看起来比较抽象,简单来说,就是我在设计表的时候,给这个表加了个函数依赖,那么这个表的所有实例都必须遵守这个函数依赖

那函数依赖是什么呢?其实很简单,他就是用来表示表中各个属性之间的依赖关系的

比如说,我有一个表模式 R=(A, B, C),函数依赖可以是这样子 A -> C,这就表示属性A可以决定C,换句话说就是,当A的值确定后,C的值也必须确定

是不是很像数学上的函数,事实上它就是这么一回事,用函数的形式表示属性间的依赖关系,就是函数依赖了

还需要注意的是,AB -> C 这个的意思是属性A和属性B结合,可以确定C,这是一种简写的方式

所以我们还能够知道,如果说对于函数依赖 A -> C,A的值绝对不能重复,因为一重复,你就没法确定C值了,也就不符合函数依赖的定义了

还要注意的是以下两种特殊情况

  • 函数依赖可以确定关系R,如K -> R,这个意思就是K就是码属性的集合了
  • 函数依赖为空集,即没有函数依赖,表示所有属性结合起来确定关系R,即所有属性都是码属性

我们再来看看,用函数依赖表示超码是怎么样的吧
1

再看看补码,这里就是在超码的基础上,加了个限制,那就是任何K的子集,都不能确定关系R,换句话说,就是补码是最小的超码
2

类型

平凡函数依赖

4

比如说,AB -> A AB -> B A -> A这三个就是平凡依赖,这是自然成立的,不需要推导,这是因为当你选中一个元组,里面包含,属性A和属性B时,自然就确定了属性A和属性B,没啥好说的

完全函数依赖和部分函数依赖

在关系R中,X属于R,Y属于R,并且X->Y,若对于X的任意一个真子集X1,都不满足X1->Y,则称Y完全函数依赖于X,反之,则称Y部分函数依赖于X

完全函数依赖记作,f 表示 full
5

部分函数依赖记作,p 表示 part
6

两个的区别就是,能不能找到一个真子集让Y依赖于这个真子集

传递函数依赖

在关系R中,X->Y, Y->Z,且Y不属于X,也不依赖于X,则称Z传递函数依赖于X,若Y依赖于X,即X<-->Y,则称Z直接函数依赖于X

闭包

函数依赖集的闭包

7

这三个是基本规则,自反性、增广性(扩容)、传递性

由这三个可以推出以下的几个规则
8

求闭包的算法
9

翻译一下,就是先初始化,F+ =F,然后对闭包中的每个函数依赖进行自反和增广(简称扩容),然后对扩容的闭包进行传递,就是组合称新的函数依赖,然后就一直重复这个过程,知道闭包不在改变

属性集的闭包

10

属性集的闭包是依赖于某个函数依赖集的,并不能单独成立

闭包的求法
11

算法挺简单的,就是把能推导出来的属性加到result集合中就行了

可以用属性集的闭包判断候选码,如果这个属性集的闭包覆盖了所有属性,那它就一定是超码,如果这个属性集的任何真子集的闭包没法覆盖所有属性,那它进一步成为候选码

范式

13

1NF

第1范式就是要求关系的所有属性都是原子的即可,简单来说,每个属性包含的信息要尽量精简,就是分到不能再分的意思

2NF

第2范式要求非码属性完全函数依赖于候选码,消除了非码属性的部分函数依赖,可能还存在传递函数依赖

3NF

第3范式要求每一个非码属性既不部分函数依赖也不传递函数依赖于候选码,消除了非码属性的部分函数依赖和传递函数依赖

如果关系R中的每个属性都是码属性,那么关系R是3NF

BCNF

BC范式要求对于每个函数依赖X->Y,如果Y不是X的子集,那么X必须含有候选码。换句话说,如果满足条件,那么X是超码

如果函数集为空集,即R中的每个属性都是码属性,那么关系R是BCNF

没有非平凡函数依赖,表示数据高度独立,即属性之间没有复杂的依赖关系,相当于函数依赖为空集

依赖保持

16

简单来说,就是分解之后的表的函数依赖集的并集要和原来的表的函数依赖集相等

posted on   Dylaris  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示