第一范式、第二范式、第三范式、BC范式
第一范式
数据表中的每个字段都是最小的数据单元,不可分割,保证字段的原子性。
本文借知乎刘慰教师的例子来说明范式,如下表不满足第一范式:
分割后即可满足第一范式:
第二范式
在满足第一范式的基础下,数据表中的每一个非主属性都完全依赖于任何一个候选码(关键字),即满足第二范式。
判断是否是第二范式:
1.找出所有码;
2.判断出所有主属性和非主属性;
3.判断每一个非主属性是否完全依赖于任何一个码。
示例:
因为该表不能直接通过一个属性来区分每个元组,可以通过学号和课程共同区分元组,所以该表的码为(学号,课程),以下分析:
(学号,课程)—P→姓名,因为学号—F→姓名
(学号,课程)—P→系名,因为学号—F→系名
(学号,课程)—P→系主任,因为学号—F→系主任
因为非主属性部分依赖于码,所以该表不符合第二范式,若想符合第二范式可以通过成绩表、学生表两张表来实现。
第三范式
在满足第二范式的基础下,数据表中的每一个非主属性都直接依赖于码,不存在传递依赖。
再用上面满足第二范式的表来示例:
因为学号→系名,系名→系主任,存在传递依赖,所以不满足第三范式,需要将系名和系主任建一张新表。
BC范式
BCNF 在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
(1)所有非主属性对每一个码都是完全函数依赖;
(2)所有的主属性对于每一个不包含它的码,也是完全函数依赖;
(3)没有任何属性完全函数依赖于非码的任意一个组合。
R属于3NF,不一定属于BCNF,如果R属于BCNF,一定属于3NF。
如上图表,一个管理员只在一个仓库工作;一个仓库可以存储多种物品。可知有如下关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是该表的候选关键字,表中的唯一非关键字段为数量,符合第三范式。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,也就是不满足上面的第(2)条件,所以其不符合BC范式。若想符合BC范式,应分为(仓库ID,管理员)、(仓库ID,存储物品ID,数量)两张表。
本文参考了https://blog.csdn.net/u013164931/article/details/79692402