MySQL中数据中设计中的范式与反范式

设计关系数据库时,听从不一样的规范要求,设计出合理的关系型数据库,这些不一样的规范要求被称为不一样的范式,各类范式呈递次规范,越高的范式数据库冗余越小。可是有些时候一昧的追求范式减小冗余,反而会下降数据读写的效率,这个时候就要反范式,利用空间来换时间。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(特色是面向文档)数据库

第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。第二范式(2NF)要求数据库表中的每一个实例或行必须能够被唯一地区分。为实现区分一般须要咱们设计一个主键来实现(这里的主键不包含业务逻辑)oracle

第三范式(3NF)

知足第三范式(3NF)必须先知足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主键字段。就是说,表的信息,若是可以被推导出来,就不该该单独的设计一个字段来存放(能尽可能外键join就用外键join)。不少时候,咱们为了知足第三范式每每会把一张表分红多张表数据库设计

反三范式

没有冗余的数据库未必是最好的数据库,有时为了提升运行效率,就必须下降范式标准,适当保留冗余数据。具体作法是: 在概念数据模型设计时遵照第三范式,下降范式标准的工做放到物理数据模型设计时考虑。下降范式就是增长字段,减小了查询时的关联,提升查询效率,由于在数据库的操做中查询的比例要远远大于DML的比例。可是反范式化必定要适度,而且在本来已知足三范式的基础上再作调整的。spa

 

知乎上对范式和反范式的理解设计

摘自 https://www.zhihu.com/question/19900437
著做权归做者全部。 商业转载请联系做者得到受权,非商业转载请注明出处。 做者:孙文亮 连接:https://www.zhihu.com/question/19900437/answer/14089402 来源:知乎 数据库设计应该也是分为三个境界的:
第一个境界,刚入门数据库设计,范式的重要性还未深入理解。这时候出现的反范式设计,通常会出问题。
第二个境界,随着遇到问题解决问题,渐渐了解到范式的真正好处,从而能快速设计出低冗余、高效率的数据库。
第三个境界,再通过N年的锻炼,是必定会发觉范式的局限性的。此时再去打破范式,设计更合理的反范式部分。
范式就像武侠里面的招数,初学者妄想不按招数来,只能死的很难堪。毕竟招数都是高手总结概括的精华。而随着武功提升,招数熟练以后,必然是发现招数的局限性,要么忘掉招数,要么自创招数。只要努力,加上多熬几年,总能达到第二个境界,总会以为范式是经典。此时能不过度依赖范式,快速突破范式局限性的人,天然是高手。
相关文章
相关标签/搜索