三范式使得数据库的设计变得有据可依,数据库的冗余大大减少。然而,三范式的定义,却不那么让人省心,一堆文字外加数学知识,让人着实有点小蒙。
虽然说完全按照三范式设计数据库并不可取,但是要想设计一个好的数据库,三范式的知识是必不可少的。
要想更好理解三范式的定义,那么了解依赖是必不可少的,了解了这几种依赖,那么理解起来三范式将会变的很容易。
首先,来说下最最基本的概念——函数依赖。
专业术语:若对于R(U)的任意两个可能的关系r1、r2,若r1[x]=r2[x],则r1[y]=r2[y],或者若r1[x]不等于r2[x],则r1[y]不等于r2[y],称X决定Y,或者Y依赖X。
其实很简单,就是说知道X就可以知道Y:
函数依赖的三种类型:
1、平凡与非平凡函数依赖
还是先看专业术语:若属性x->y(决定),但是y不是x的子集(主键的一部分),则称为x->y是非平凡依赖。否则是平凡依赖。(关于一些特性的东西不再多说)
1)非平凡函数依赖
2)平凡函数依赖
2、部分与完全函数依赖
专业术语:属性y依赖属性x中的部分属性x‘,也就是说只要一个x’就可以决定y,那么称为y部分依赖x,否则成为完全依赖。
1)部分依赖
2)完全依赖
3、传递依赖、函数依赖
专业术语:若x->y和y->z,并且x不依赖y,则x->z,这种现象称传递依赖。
若是x->y和y->z,并且y->x,则x->z是直接的函数依赖,而不是传递依赖。
1)传递依赖
2)函数依赖
以上几种依赖的关系:
而第二范式和第三范式分别要求消除部分依赖和传递依赖,因为都用自增id或者uuid这样的来当做主键,那么非平凡函数依赖也可以消除,通过删减,就成了这样的图:
而平凡函数依赖和完全函数依赖的图又是一样一样的,所以最后就成了这样的一个图:
这些图从简单演变到复杂,最后又删减到最简单,我个人感觉通过这些图理解了三种依赖,那么理解三范式就不成什么问题了,因为映像中,三范式的概念貌似就是这几个范式来回倒腾。
最后在恭喜一下你顺利的理解了数据库三范式~~
原文链接:https://www.f2er.com/javaschema/286115.html