最近本人在准备软考,所以不得不拿起大一大二时的书本,再次复习一遍。在做软考的试题中遇到了几个常遇到的问题,在这里就讨论一下关系型数据库规范化的问题。关系型数据库设计的理论核心是数据间的函数依赖问题,衡量的标准是关系规范化的程度及分解的无损连接和保持函数的依赖性。函数依赖是最重要的数据依赖。函数依赖又可分为一下几种情况。
1)非平凡的函数依赖
如果X->Y,但是Y不属于X,那么称X->Y是非平凡的函数依赖。
2)平凡的函数依赖
如果X->Y,而Y属于X,那么称X->Y是平凡的函数依赖。
3)完全函数依赖
在R(U)中,如果X->Y,对于任何一个X的任何真子集X',都有X‘不能决定Y,则称Y对X完全函数依赖。
4)部分函数依赖
如果X->Y,但Y不完全依赖于X,则称Y对X部分函数依赖。
5)传递依赖
在R(U,F),中如果X->Y, Y不属于X,Y->Z,则称Z对X传递函数依赖。
-> 符号表示 XX决定XX
规范化
关系型数据库的设计方法之一就是要满足范式的模式。主要的范式有 1NF、2NF、3NF、BCNF、4NF、5NF。在一般的项目中做到3NF就可以了。下面列举 前3个范式的例子,以及他们存在的问题,来帮助大家更好的理解,数据库范式的实现。
1NF(第一范式)
根据第一范式的定义,如果关系模式中R的每个分量是不可再分的数据项,即满足原子性,每一列都不允许再次拆分,则关系模式R属于第一范式。举个例子,供应者和它所提供的零件信息。
FIRST(SNo,SName,Status,City,Pno,Qty)
F = {Sno->Sname,Sno->Status,Status->City,(Sno,Pno)->Qty} ,从上面可以看出每个数据项都是不可以再分的,所以是第一范式。
下面举一个不是1NF的例子,方便大家进行对比。
如果上面的上述R中有Address的数据项,它又可以分为Province,City,County etc.所以他不满足第一范式。
2NF(第二范式)
2NF是在1NF的基础上进行扩展的,在满足1NF的基础上,每一个非主属性完全依赖于码(码即能够唯一确定该数据行的标识属性)。
FIRST关系中的码是Sno,Pno,而Sno->Status,因此非主属性Status部分依赖于码,因此不是2NF。
如果上述的FIRST关系进一步分解FIRST1(Sno,Sname,Status,City)和FIRST(Sno,Pno,Qty).可以看出FIRST1的码为SNo,非主属性完全依赖于Sno,所以属于2NF。FIRST2的码为SNo、Pno,非主属性Qty完全依赖于Sno、Pno,所以也属于2NF。
3NF(第三范式)
第三范式是在2NF的基础上,当消除了非主属性的传递函数依赖,则成为第三范式。由于Sno->Status,Status->City,所以关系模式存在传递函数依赖,不满足3NF。
如果在2NF的基础上再次进行划分FIRST1(Sno,Sname,Status) FIRST2(Status,City) FIRST3(Sno,Pno,Qty),关系模式不再存在传递函数依赖。所以符合第三范式的定义。要注意的是多个范式之间存在包含关系 5NF ∈4NF ∈BCNF ∈3NF∈ 2NF∈ 1NF,范围越来越小,划分越来越细,数据冗余和修改操作不一致、插入异常、删除异常的现象也在也来越少。但是带来的工作量也越来越大,所以推荐大家一般将关系模式划分到3NF就可以了。考虑到复杂度和性能之间的平衡度。这也非常符合中国传统文化中的中庸思想,其实你会越发感觉,你并不是在编程,而是在做一名高级翻译,把世界中的自然语言翻译成计算机可以运行的代码。今天的总结就到这吧。也祝自己能够在软考中取得满意的成绩