摘抄自https://www.zhihu.com/question/24696366
- 函数依赖:若在一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说Y函数依赖于X,写作 X → Y(一个 X 不会对应两个 Y,Y = f(X))
- 完全函数依赖:属性集X → Y,对于X的任意真子集X’,都有 X’ !→ Y,则称 Y完全函数依赖于X
- 部分函数依赖:属性集X → Y,存在X的某个真子集X’,有 X’ → Y,则称 Y部分函数依赖于X
- 传递函数依赖:X → Y,Y → Z (前提:Y 不包含于 X,且 Y !→ X),那么我们就称 Z 传递函数依赖于 X
- 学号 → 姓名,系名 → 系主任
- 分数 完全函数依赖于 姓名+课程;分数 完全依赖于 学号+课程
- 系名 部分函数依赖于 学号+姓名;因为单拿出来 学号可以确定系名(系名 函数依赖于 学号);单拿出来 姓名也可以确定系名
- 系主任 传递函数依赖于 学号;学号确定系名,系名确定系主任
注意:满足第二范式,一定满足第一范式;满足第三范式,一定满足第二范式
- 第一范式:列不可分
第一范式是最基本的范式,数据表中的所有字段都是不可拆分的原子值,就说明数据表满足第一范式
下标不符合第一范式:
- 第二范式:不存在非主属性对候选码的部分依赖
- 找出所有的候选码 (能够标识一组数据唯一性的最小属性集)
- 所有候选码中包括的属性叫作主属性
- 主属性以外的属性叫作非主属性
- 判断是否存在非主属性是否对候选码的部分函数依赖
分析上图:
- 候选码:学号+课程 ((能够标识一组数据唯一性的最小属性集))
查看所有每一单个属性,当它的值确定了,是否剩下的所有属性值都能确定。
查看所有包含有两个属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。
……
查看所有包含了六个属性,也就是所有属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。
- 主属性:学号、课程
- 非主属性:姓名、系名、系主任、分数
- 判断:姓名、系名、系主任 都 部分函数依赖于 候选码
- 结论:不符合第二范式
将表拆分,两个表都符合第二范式
- 第一张表:
候选码:学号+课程
主属性:学号、课程
非主属性:分数
判断:分数完全函数依赖于(学号+课程)- 第二张表:
候选码:学号(考虑重名,姓名就不列为候选键)
主属性:学号
非主属性:姓名、系名、系主任
判断:非主属性完全函数依赖于候选码
- 第三范式:不存在非属性码对候选键的传递函数依赖
观察上表,
- 候选码:学号
- 主属性:学号
- 非主属性:姓名、系名、系主任
- 判断:学号 → 系名,系名 → 系主任
- 不符合第三范式
- BCNF是第三范式的改进
一个满足BCNF的关系模式的条件:
- 所有非主属性对每一个码都是完全函数依赖。
- 所有的主属性对每一个不包含它的码,也是完全函数依赖。
- 没有任何属性完全函数依赖于非码的任何一组属性。
水润鹅鸣 生态广平
河北邯郸