设计关系数据库时,听从不一样的规范要求,设计出合理的关系型数据库,这些不一样的规范要求被称为不一样的范式,各类范式呈递次规范,越高的范式数据库冗余越小。可是有些时候一昧的追求范式减小冗余,反而会下降数据读写的效率,这个时候就要反范式,利用空间来换时间。mysql
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。知足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步知足更多规范要求的称为第二范式(2NF),其他范式以次类推。通常说来,数据库只需知足第三范式(3NF)就好了。redis
第一范式(1NF)
即表的列的具备原子性,不可再分解,即列的信息,不能分解, 只要数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的知足1NF。sql
关系型数据库: mysql/oracle/db2/informix/sysbase/sql server数据库
非关系型数据库: (特色: 面向对象或者集合)
NoSql数据库: MongoDB/redis(特色是面向文档)oracle
第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。第二范式(2NF)要求数据库表中的每一个实例或行必须能够被唯一地区分。为实现区分一般须要咱们设计一个主键来实现(这里的主键不包含业务逻辑)spa
第三范式(3NF)
知足第三范式(3NF)必须先知足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说,表的信息,若是可以被推导出来,就不该该单独的设计一个字段来存放(能尽可能外键join就用外键join)。不少时候,咱们为了知足第三范式每每会把一张表分红多张表设计
没有冗余的数据库未必是最好的数据库,有时为了提升运行效率,就必须下降范式标准,适当保留冗余数据。具体作法是: 在概念数据模型设计时遵照第三范式,下降范式标准的工做放到物理数据模型设计时考虑。下降范式就是增长字段,减小了查询时的关联,提升查询效率,由于在数据库的操做中查询的比例要远远大于DML的比例。可是反范式化必定要适度,而且在本来已知足三范式的基础上再作调整的。orm