在了解范式问题之前,需要明确的概念
(1)键和码在数据库中真是傻傻分不清楚
候选码:不含多余属性的超码,即对于候选码,若要多删除一个属性,就不是超码
超码:在关系中,能唯一标识元组的属性集
主键:用户选作元组标识的一个候选键称为主键
一个实体集可以有多个候选码,但是只能有一个主键
主属性:候选码中的属性
非主属性:与主属性相对的属性即为非主属性
已知关系模式R,R中属性A以及R上的函数依赖集F,如果A包含在R的某个候选键中,则称A为主属性,否则为非主属性
如何求关系模式的候选键?
可以从函数依赖的角度进行求解
(2)函数依赖问题
U{A1,A2,…,An}是属性集合,R(U)是U上的一个关系,x、y是U的子集。若对于R(U)下的任何一个可能的关系,均有x的一个值对应于y的唯一具体值,称y函数依赖于x,记作x→y。 其中x称为决定因素
部分函数依赖:设X,Y是关系R的两个属性集合,存在X->Y,若存在集合Xˊ是X的真子集,存在Xˊ->Y,则Y部分依赖于X
完全函数依赖:设X,Y是关系R的两个属性集合,存在X->Y,集合Xˊ是X的真子集,但对于任意一个Xˊ!->Y,则Y完全函数依赖于X
传递函数依赖:设关系模式R,X,Y,Z是R的属性子集,若存在X->Y,Y!->X,Y->Z,则有X->Z,即Z传递依赖于X
平凡函数依赖:如果X->Y,且Y属于X,即Y是X的子集,则X->Y是平凡的函数依赖
非平凡函数依赖:与非平凡函数依赖对应的就是非平凡函数依赖
e.g. R(A,B,C) 其中函数依赖集为F={B->C, B->A, A->BC},判断R是几范式:
R是BCNF,主键是A(或者B),非主属性为BC(或者AC),不存在传递依赖和 部分依赖,所以为BCNF。注意⚠️:虽然A ->B->C,但是B->A,违背了传递函数依赖的定义,所以A->B->C 不是传递函数依赖
回到开始提到的那个问题,如何求得关系模式的候选键?
从函数依赖集的角度出发,可以将属性(组)分成以下几类:
(1)L类:全部出现在函数依赖的左半部
(2)R类:全部出现在函数依赖的右半部
(3)LR类:出现在函数依赖的左右两边
(4)N类:不出现在函数依赖中
其中,可能成为候选键的有L类,LR类和N类,
对于L类:求出它的闭包,如果闭包包含所有属性,则其成为唯一的候选键
对于LR类:求出其闭包,如果包含所有属性,则为候选键
对于N类:直接成为候选键
INF:如果一个关系模式R中的每个属性A的域值都是原子的,即属性值是不可再分的,则关系模式R属性第一范式
2NF:设关系模式R(U,F),U是属性集合,F是函数依赖集合,如果R是INF且所有非主属性完全依赖于R的每个键,则R是第二范式
3NF:设关系模式R(U,F),如果R是第二范式,且在R中没有非主属性传递依赖于R的键,则R是第三范式
BCNF:设关系模式R(U,F),如果R是第三范式,且R中没有任何属性传递依赖于R的键,则R是BCNF