第一范式:数据不再分
例:不允许这样
第二范式:有(组合)主键可以唯一标识一行
所有非主属性都要和该数据表的主键有完全依赖关系
如果有哪些非主属性只和主键的一部份有关的话,它就不符合第二范式。
完全依赖:AB->C,仅凭单个A或单个B无法决定C
部分依赖:AB->C,单个A或单个B也能决定C
Ps:如果主键只有一个属性的话,那就不用纠结这里的条件了,肯定是第二范式
第三范式:不存在传递依赖
首先!! 并不是A->B,B->C,A->C就算传递依赖!!
传递依赖:
在关系模式中,如果Y→X,X→A,且X不决定Y,和A不属于X(A不是X的子集),那么称Y→A是传递依赖。
再看第三范式的判定:
关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z,使得X→Y,Y→Z,成立,Y→X不成立,则称R<U,F> ∈ 3NF。
百度百科
Ps:是不存在,才判定为3NF
若有上面的关系,则不是3NF
不要怕看不懂!看不懂都是因为你对一些定义不熟,查它!
可以参考:数据库的一些名词
再看看第三范式要消除的对象:
对于一个满足2nd NF 的数据结构来说,表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。
这里要消除的其实就是上面定义的Y->Z的情况(非主属性Z依赖于不是主键的Y)
Ps:如果表不存在非主属性,都是主属性,那么可以直接3NF起步
因为前面的1~3NF都主要是对非主属性进行约束
BC范式:非平凡函数依赖X->Y中X都是超键
还有一个标准:不允许主属性决定主属性
Ps:一般判断到BC范式就ok了
第四范式:属性项不允许多值
例:(用户id,手机号码)
id 手机号码
10 157************66
10 138************65
存在一个用户拥有多个手机号码的情况,则不满足第四范式
第五范式:消除了4NF中的连接依赖
例:(销售人员,供货商,产品)
把上表拆解成三个小表:
(销售人员,供货商)(销售人员,产品)(供货商,产品)