三大范式与总结

三大范式

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。而通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讲的“三大范式”。

第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。

简单来说:原子性保证每一列不可再分。

下面先看两个表来对比

这是不符合第一范式的(红色代表主键)——专业信息列可以再分
在这里插入图片描述
这是符合第一范式的不可再分的,因此满足第一范式(1NF);
在这里插入图片描述
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

简要说明:在满足第一范式的前提上,每张表只描述一件事情。

举例说明:
在这里插入图片描述
在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,

但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,

这样就不满足第二范式的要求,调整如下,需分成两个表:
在这里插入图片描述
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

简要说明:在满足第一范式和第二范式的前提上,第三范式需要确保数据表中的每一列数据都和主键直接相关, 而不能间接相关。

举例说明:
在这里插入图片描述
上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,

而不是主键“学号”,所以需做如下调整:
在这里插入图片描述

简而言之:范式就是用来规范数据库的设计。 数据规范设计之后从而带来的弊端就是会影响性能。 所以关联查询的表不得超过三张表(大厂认为)。
●考虑商业化的需求和目标,(成本,用户体验! )数据库的性能更加重要
●在规范性能的问题的时候,需要适当的考虑一下 规范性!
●故意给某些表增加一些冗余的字段。 (从多表查询中变为单表查询)
●故意增加一些计算列 (从大数据量降低为小数据量的查询:索引)

猜你喜欢

转载自blog.csdn.net/weixin_45662838/article/details/116672883