范式
范式(Normal format) ,是一种离散数学的知识,是为了解决数据的存储与优化的问题:保存数据以后,凡是能通过关系寻找出来的数据,坚决不再重复存储;终极目标是:减少一切冗余数据 ;
范式:是一种分层结构的规范,分为六层,每一层都比上一层更加严格;若要满足下一层范式,则必须满足上一层范式;
六层范式:1NF、2NF、3NF、4NF、5NF、6NF;其中 1NF 是最底层,要求最低 ;
Mysql 属于关系型数据库,有空间浪费,也致力于解决空间浪费的问题,这一条与范式不谋而合;因此,在设计数据库的时候,会利用范式来指导设计;
但是数据库不仅仅只关注数据冗余问题,也要保证效率问题;但是范式只是为了解决数据冗余问题, 所以数据库的设计也不能完全按照范式的要求实现:一般情况下,只满足前三种范式 ;
总之,范式在数据库的设计中,具有指导意义,但不是强制规范;
1NF(第一范式)
在设计表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前,还需要进行额外的操作(拆分),那么该表的设计就不满足第一范式;
第一范式,要求字段的数据具有原子性,不可拆分 ;
可以通过将数据,拆分为两个字段解决 ;
2NF(第二范式)
在数据表的设计过程中,如果有复合主键(多字段主键),且表中字段并不是都依赖整个复合主键,可以有的字段,只依赖复合主键中的部分字段,这将导致部分依赖,则该表的设计不满足第二范式 ;
第二范式,要求表中的字段对主键绝对依赖,不允许出现部分依赖 ;
可以使用逻辑主键替代业务主键,解决部分依赖问题;亦可以使用多张表,将部分依赖的字段与其所依赖的部分主键单独成表;
3NF(第三范式)
在设计表的时候,如果一张表的某个字段,并不是直接依赖主键,而是依赖其他字段,然后其他字段依赖主键,则改表的设计不满足第三范式 ;
第三范式,要求表中的字段都应该直接依赖主键,而不应该出现传递依赖(间接依赖) ;
可以将存在传递依赖的字段与其所依赖的字段,抽取出来形成单表,然后在原表中,将单独表的主键添加进来,这样达到消除掉传递依赖的问题 ;
逆范式化
上面的第三范式,我们那样做以后,我们在查询数据的时候,需要多表查表,会减低我们的效率;
因此有时候,会故意的逆范式,不将它们抽取成单表,而是让他们存在传递依赖,来提高查询效率,以牺牲数据冗余为资本;
我们可以看出范式一层一层的往上,对数据冗余的要求要来越高,到第三范式的时候,为了达到数据不冗余,已经对我们的数据查询效率有影响了;
因此,我们一般也只做到第三范式,就不再继续做下去了,比较我们不是只一昧的追求消除数据冗余,有时候,我们更需要查询效率 ;