原文地址: https://blog.csdn.net/g _ beginner/article/details/6789308
1 .定义如果满足以下条件,则一个数据库架构中的表t和函数依赖集f称为符合Boyce-Codd规范化(BCNF ) : 可以从任何f导出的函数依赖X-A位于t,其中a是x中没有的单个属性,x必须是t的超级密钥。 如果数据库架构中的所有表都符合BCNF,则此数据库称为符合BCNF
表明BCNF是比第三范式更严格的范式。 关系模型中的所有属性(包括主属性和非主属性)都必须不传递依赖于任何候选项的关键字。 即,在关系表内功能上相互依赖的列的各列为关键字候补的情况下,应该满足BCNF。
BCNF实际上是在第三范式的基础上,进一步消除了主属性的传递依赖。
3 .以这种物料管理表wpe(WNO、PNO、ENO、QNT )为例,WnO表示仓库编号,PNO表示部件编号,ENO表示员工编号,QNT表示数量。
有以下限制:
)一个仓库有多名员工
)2)一名员工只在一个仓库工作;
)3)每个仓库一个型号的零部件由专人负责,但可以一个人管理几个零部件;
)4)相同型号的零部件可分为几个仓库。
分析表中函数的依赖关系可以获得以下结果:
)1)无-无;
(2) ) WNO,PNO )-QNT
(3) ) WNO,PNO )-ENO
(4) ) ENO,PNO )-QNT
如所见,候选键可以是(ENO,PNO ); (WNO,PNO )。 因此,ENO、PNO、WNO都是主属性,QNT是非主属性。 很明显,非主属性直接依赖于候选密钥。 因此,该表满足第三范式。
看看主要属性。 (WNO,PNO )-ENO; 无与伦比。 很明显,WNO对候选结合(WNO,PNO )存在传递依赖,因此不符合BCNF。
解决此问题的方法是将其分为两个表:管理表EP(Eno、PNO、QNT )。 工作表ew(Eno,WNO )。 但是,这样会丢失函数相关(WNO,PNO )-ENO。
4 .应用
但是,如果不满足BCNF,也可能引起冗馀和一致性问题。 但是,如果将表分解为满足BCNF的表,则可能会丢失一些函数依赖关系。 因此,一般不会强制关系表满足BCNF。
5. 第四范式(4NF)1 .定义
第四范式必须满足以下要求:
)1)必须满足第三范式
)2)一个实体的两个或多个相互独立的多值因子不能包含在表中。
2 .说明
很明显,第四范式也是比第三范式更严格的范式。
第四范式的含义是,如果某个表的非主属性相互独立(3NF ),则这些非主属性不应该具有多值。 有多值就违反第四范式。 定义是抽象的,请参考以下示例进行理解。
3 .示例
有这样的用户联系表telephone (客户id、phone、CELL )。 客户ID是用户ID,PHONE是用户的固定电话,CELL是用户的手机。
本来,这是非常简单的第三范式表。 主键是CUSTOMERID,没有事务相关性。 但是在某些情况下,这样的表还是不合理的。 例如,用户有两个固定电话和两个手机。 此时,表的具体显示如下。
客户id
手机
单元格
1000
8828-1234
149088888888
1000
8838-1234
149099999999
因为PHONE和CELL是相互独立的,所以一些用户有两个或更多的值。 此时该表违反第四范式。
在这种情况下,该表的设计会带来很多维护上的故障。 例如,如果用户放弃了第一行固定电话和第二行移动电话,这两行是否会合并? 等一下
解决问题的方法是设计新的表new _ phone (客户id、编号、类型)。 这允许每个用户处理不同类型的多个电话号码,而不违反第四规范化。
4 .应用
很明显,第四范式的适用范围比较窄。 因为只有在特定情况下,才能考虑将表格规范为第四范式。 因此,在实际应用中,一般不要求表满足第四范式。
六、第五范式(5NF)1 .定义
第五范式有以下要求。
)1)必须满足第四范式
)2)表必须能够分解为小表,除非在逻辑上与原始表具有相同的主键。
2 .说明
第五范式是根据第四范式制定的进一步规则
范化。第四范式处理的是相互独立的多值情况,而第五范式则处理相互依赖的多值情况。
3. 举例
有一个销售信息表SALES(SALEPERSON,VENDOR,PRODUCT)。SALEPERSON代表销售人员,VENDOR代表供和商,PRODUCT则代表产品。
在某些情况下,这个表中会产生一些冗余。可以将表分解为PERSON_VENDOR表(SALEPERSON,VENDOR);PERSON_PRODUCT表(SALEPERSON,PRODUCT);VENDOR_PRODICT表(VENDOR,PRODUCT)。
4. 应用
第五范式的应用就更少了,很多时候,我认为分解为第五范式是完全没必要的。可能在某些情况下会有意义吧。不懂。。。
总结:
总之,规范化的过程就是在数据库表设计时移除数据冗余的过程。随着规范化的进行,数据冗余越来越少,但数据库的效率也越来越低。
这就要求你在数据库设计中,能结合实际应用的性能要求,规范到合适的范式。一般情况下,如何性能允许的话,都要求规范到第三范式的。
===================================================
例子:STC(Sid,Tid,Cid) 学生选课m:n,老师授课m:1,
有以下函数依赖:(Sid,Cid)->Tid;(Sid,Tid)->Cid;Tid->Cid
这个表不符合BCNF但符合第三范式。
改为:ST(Sid,Tid);TC(Tid,Cid)。现在就符合BCNF了。
3NF->BCNF 需要消除主属性对键的部分和传递函数依赖。