范式:
Normal Format 是一种离散数学中的知识,是为了决绝一种数据的存储与优化的问题;保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储了终极目标是为了减少数据的冗余;
范式是一种分层结构的规范,分为六层;每一层都比上一层更加的严格;若要满足下一层范式,前提是满足上一层范式
六层范式:1NF 2NF 3NF 4NF 5NF 6NF
1NF 是最低层 要求最低 6NF是最高层 要求最高
mysql属于关系型数据库,有空间浪费,也是致力于节省存储空间,与范式解决的问题不谋而合,再设计数据库的时候,会利用范式来指导设计;
但是数据库不单是要解决空间问题,要保证效率问题;
范式只为解决空间问题,所以数据库的设计又不可能完全按照范式的要求实现;一般情况下,只有前三种范式需要满足;
范式在数据库的设计当中是有指导意义 但是不是强制规范;
1NF:
第一范式:在设计表存储数据的时候,如果表中设计的字段存储的数据在取出来使用之前还需要额外的处理(拆分),那么说表的设计不满足第一范式;第一范式要求字段的数据具有原子性:不可再分;
比如我们存储的字段
time 存储了一个 2017-9-19,2017-9-30
表示开始时间和结束时间 我们在使用的时候还要进行拆分 这就不符合1NF;
本身表结构是没有问题的 但是在读取使用数据的时候 不符合1NF;
2NF:
第二范式:
在数据表设计的过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖主键中的某个字段(主键的部分);存在字段依赖主键的部分的问题称之为部分依赖;
第二范式就是要解决表设计不允许出现部分依赖的问题;
比如上边是一个复合主键(讲师P 和 班级P 共同组成复合主键) 性别依赖于讲师 教师依赖于班级 只是部分的依赖 性别并不依赖班级 也就是说所有的字段并不是围绕一个主键来进行的,比如在一个普通的表里面 name为主键 那么其他的字段都是围绕这个name = 胡绍良 来进行的 如果不是那就是称之为部分依赖 2NF 就是来解决这类部分依赖问题的!
2NF 的解决方法是:
讲师是一个实体单独一张表 班级是一个实体 单独一张表
或者
单独创建一个逻辑主键id
不存在复合主键 那么我们永远就会满足2NF;
3NF:
本身讲师id = 1 代替 讲师表当中的讲师名称就是一种剔除冗余的方法 如果把 讲师 名称直接放到第一张表当中 其实就是一种数据的冗余 因为不符合3NF;