第一范式:
每一个属性下的信息都不可拆分。
比如一个表下的联系方式可拆分为邮箱和电话.
第二范式:
非主属性必须完全依赖于主属性(这里的主属性可以是两条属性的组合)
由上图可以看出货物名称这个非主属性完全依赖于货物类型和货物ID这两个候选主键的集合。
去掉了注意事项,消除了其对货物类型的部份依赖。
第三范式:
以常见的学生表为例:
S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,姓名,所在系,系名称,系地址。
该表的主属性为SNO且为单一关键字,满足第二范式但是不满足第三范式,因为DNAME、LOCATION依赖于DNO,属于传递依赖。
可将该表拆分为S1(SNO、SNAME、DNO)和D1(DNO、DNAME、LOCATION).
两个表通过DNO来实现连接。
第三范式主要消除了非主属性的传递依赖。
BC范式:
以网上常见的仓库表为例:
StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)
且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。(限定条件)
那么
(仓库ID、存储物品) →(管理员ID、数量)
或
(管理员ID、存储物品) →(仓库ID、数量)
除数量之外都是关键字候选字段,数量为唯一非候选字段所以不存在传递依赖,满足第三范式。
但是,仓库ID和管理员ID相互依赖,所以需要拆分,拆分后的表就满足BC范式。
小结:
第一范式 使表中的每个属性都不可拆分
第二范式 消除表中非主属性的部份依赖
第三范式 消除表中非主属性的传递依赖
BC范式 消除表中主属性的传递依赖 (若只有单个主属性/关键字则不存在该情况)