作者:知乎用户
链接:https://www.zhihu.com/question/24696366/answer/29189700
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。
符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。
1NF的定义为:符合1NF的关系中的每个属性都不可再分。
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
第二范式有什么意义?
私是为了消除冗余信息,若存在部分函数依赖,那么该属性是没必要存在这张表的,确定了被依赖的那个属性,就确定了该属性,没必要反复存在这张表中,新建一张表来存具有依赖关系的这两个属性就好了。
完全函数依赖
在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X 完全函数依赖,记作 X F→ Y。(那个F应该写在箭头的正上方,没办法打出来……,正确的写法如图1)
<img src="https://pic2.zhimg.com/50/12513de20079d12b99d946072df7311a_hd.jpg" data-caption="" data-rawwidth="98" data-rawheight="53" class="content_image" width="98">
假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记作 X P→ Y,如图2。
传递函数依赖
假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (感谢
包含在任何一个码中的属性成为主属性。
第三范式(3NF) 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
第三范式的意义?
私以为,若存在非主属性对于码的传递函数依赖,也就是非主属性之间具有依赖关系,则会导致大量冗余信息,因为依赖于别的非主属性的属性完全是多余的,确定了被依赖的属性,也就确定了它,所以完全可以新建一个表来表示它们的关系就好了。
符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。
根据实体完整性的要求,主属性不能为空。
BCNF:在 3NF 的基础上消除主属性对于码的部分与传递函数依赖,个人理解是为了应对存在多个码时,主属性之间的冗余问题。
总结:
1NF: 字段是最小的的单元不可再分
2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键 (一般我们都会做到)
3NF:满足2NF,非主键外的所有字段必须互不依赖
4NF:满足3NF,消除表中的多值依赖
总的来说,我自己的理解,BCNF即以下的范式,目前看来主要都还是为了减少数据冗余的。这种思想不光是数据库,甚至可以应用到很多程序设计,类的设计中去。