NF1
每一个属性(每一列)都是不可再拆分的。类似通过json字符串保存一个object/array到一列中,就是很不合理的设计。
NF2
- 完全函数依赖:属性组X确定的情况下,属性y就可以确定,则称y函数依赖于X,如果对于X的任意真子集X1,依赖不成立,则称y完全函数依赖于X,否则称部分函数依赖。
- 码(key):码是属性组(可以多于一列),当一个属性组确定之后,这一行的所有其他属性都可以确定,那这个属性组就是码。
- 主属性:码中的属性就是主属性,其余的就是非主属性。
- NF2:NF1的基础上,没有非主属性对码的部分函数依赖。
- 第一步:找出数据表中所有的码。
- 第二步:根据第一步所得到的码,找出所有的主属性。
- 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
- 第四步:查看是否存在非主属性对码的部分函数依赖。
- 如果不满足NF2,通过拆分表,使之满足NF2的过程,成为模式分解。
NF3
- 在NF2的前提下,消除非主属性对码的传递函数依赖。
BCNF
- 消除主属性对码的部分函数依赖、传递函数依赖。
参考资料
- 解释一下关系数据库的第一第二第三范式? - 回答作者:知乎用户