数据库的三大范式

一、介绍

没有规矩,不成方圆。这句话在数据库的规范中同样适用,所以就有了这几项规定,数据库的三大范式

我相信很多人都听过三大范式,面试题中也经常会问到,什么是数据库三大范式,这太常见了。

以前我只是机械式的回复面试官,但以后不会,不仅要学会说概念说规范,还能从实际出发,要不要严格遵守三大范式。

二、概念

1)第一范式

概念每一个列都是不可再分的列

例如下面这张表,由于region字段可以再细分为省份province和城市city,所以此表将不满足第一范式

name sex region
半月无霜 广东省广州市

region字段拆分后,满足了第一范式

name sex province city
半月无霜 广东省 广州市

2)第二范式

概念:在满足第一范式后,消除非主属性对主属性的部分函数依赖

先看看这张订单表,订单编号商品ID用户ID作为联合主键

每一个字段本身都不可再分,满足第一范式。

但其中有个字段用户名称,它依赖于用户ID,所以此表并不满足第二范式

订单编号 商品ID 用户ID 数量 金额 用户名称
1001 1 1 1 9.9 半月无霜
1002 1 2 1 9.9 阿超

在修改后,将变成两张表,分别为订单表和用户表

订单编号 商品ID 用户ID 数量 金额
1001 1 1 1 9.9
1002 1 2 1 9.9
用户ID 用户名称
1 半月无霜
2 阿超

什么是部分函数依赖?

对于数据库主键而言,其他的字段需要完全依赖于主键,而不能依赖主键中的部分。

上面这张表而言,正式因为有用户名称依赖于主键中的其中一个用户ID,所以不满足第二范式

3)第三范式

概念:在第二范式的基础上,进一步消除非主属性对主属性的传递函数依赖

先来看这样一张订单表,订单ID是主键字段

订单ID 订单编号 商品ID 商品名称 用户ID 数量 金额
1 1001 1 java入门到入土 1 1 9.9

由于,商品ID依赖于订单ID,而商品名称又依赖于订单ID,所以造成了间接依赖,也就是传递函数依赖。

修改成以下两张表,消除他们的依赖关系,将满足第三范式

订单ID 订单编号 商品ID 用户ID 数量 金额
1 1001 1 1 1 9.9
商品ID 商品名称
1 java入门到入土

三、最后

在项目开发中,一定要严格遵循三范式的原则设计库表结构吗?

这个肯定不是,如果完全按照三范式进行设计,那么数据查询就一定需要大量的表关联,这样就会造成查询性能上的问题。

所以,冗余一部分常用的查询字段,避免表关联,这对我们的项目最有帮助。

我是半月,祝你幸福!!!