一、几个重要的概念
-
超键
- 在关系中能唯一标识元组的属性或者属性集称为超键
-
候选键
- 不含有多余属性的超键。即在候选键中再删除属性就不是键了。
-
部分依赖
- 设X,Y 是关系R 的两个属性集合,存在X -> Y,若X’ 是X 的真子集,存在 X’ -> Y,则称Y 部分函数依赖于X
-
完全依赖
- 设X,Y 是关系R 的两个属性集合,存在X -> Y,若X’ 是X 的真子集,不存在 X’ -> Y,则称Y 完全函数依赖于X
-
传递函数依赖
- 设X、Y、Z 是关系R 中互不相同的属性集合,存在 X->Y, Y->Z ,则称Z传递函数依赖于X
二、1NF
- 第一范式的数据表一定是二维数据表
- 第一范式是指数据库的每一列都是不可分割的基本数据项,强调列的原子性。
三、2NF
第二范式首先要满足第一范式,在此基础上,还要满足一下两条
- 表必须有主键
- 没有包含在主键中的列必须完全依赖于主键,而不能部分依赖于主键
举个栗子:如果数据库中有联合主键,但是有的列只依赖于联合主键中的一个或者部分属性,这个时候该表就不满足第二范式
四、3BF
第三范式首先要满足第二范式,在此基础上,还要满足下条
-
每个非主属性都不传递依赖与该范式的候选键
- 【解释】不能存在:非主键列A 依赖于非主键列B,非主键列B依赖于主键的情况
现在来总结一下:
第二范式和第三范式都是对非主属性的约束,第二范式约束的是 完全函数依赖,第三范式约束的是 传递函数依赖
五、BC范式
5.1 首先我们举个栗子:
若公司有若干个仓库:每个仓库只能有一个管理员,一个管理员只能在一个仓库工作;一个仓库可以存放多个物品,一个物品可以放在不同的仓库。每种物品在每个仓库中都有对应的数量。那么关系表 **仓库(仓库名,管理员,物品名,物品数量)**属于哪一个范式。
分析:
- 已知的函数依赖:
- 仓库名-> 管理员;
- 管理员 -> 仓库名;
- (仓库名,物品名)-> 物品数量;
- (管理员,物品名)-> 物品数量;
从上面的函数依赖可以看出来
不存在非主属性对主属性的部分和传递函数依赖。所以属于第三范式
5.2 栗子中存在的问题
-
【问题一】先新增加一个仓库,但是尚未存放任何物品,是否可以为该仓库指派管理员?
- 不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
-
【问题二】某仓库被清空之后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?
- 仓库本身与管理员的信息也会被随之删除。
-
【问题三】如果某仓库更换了管理员,会带来什么问题?
- 这个仓库有几条物品存放记录,就要修改多少次管理员的信息
从上面的栗子上我们可以看到,虽然满足了 第三范式,但是仍然存在插入异常、修改异常和删除异常问题。
造成这个问题的原因是:
存在主属性对码的部分函数依赖于传递函数依赖
上面的四个范式写的还是比较简单的,之后可能会有进一步的栗子做为补充。
参考并感谢
https://www.zhihu.com/question/24696366/answer/29189700 来源:知乎 作者:刘老师