在理解这几个范式之前最好先理解下三种函数依赖,分别是:
(1)平凡和非平凡依赖
(2)部分与完全依赖
(3)传递函数依赖
平凡依赖简单说就是一个函数x在决定y的同时,y还是x的子集,而反之就是非平凡依赖。
而完全依赖则是指x决定y,并且这个x已经是最小的了,不能在划分了,任何的划分都会导致不能在决定y。反之就是部分依赖
传递函数依赖很好理解,就是x决定y,y决定z,则x间接决定z。
第一范式(1NF)
第一范式是最基础的,它仅仅要求每个属性都不可以再分,即要保证原子性。
比如中国江苏就不是原子的,它还能分成国家:中国, 省份:江苏。
第二范式(2NF)
第二范式则是在第一范式的基础上消除非主属性对于码的部分函数依赖,即不能出现部分依赖,只能都是完全依赖,这里可能又要问了,什么是非主属性,什么是码?
码的定义如下:
(1)这些属性函数决定该关系模式的所有属性。
(2)属性组合的任何真子集都不能决定R的所有属性。
简单来说就是能决定所有的属性同时它要为最小的,不能分解出更小的集合来决定所有属性。
如 R = {A,B,C,D} , F:{B->D, AB->C}
它就不是第二范式(2NF),因为这里D只依赖了B而没有依赖A,而这个关系的关键字为{A,B},所以存在部分依赖。
第三范式(3NF)
第三范式消除了非主属性对于码的传递函数依赖,即关系中不存在类似 x->y, y->z的情况。如果出现了就不是第三范式。另外要注意,这边如果是主属性出现传递依赖的话依然属于第三范式。
BCNF
它就是消除了主属性对于码的部分函数依赖与传递函数依赖。