数据库的三大范式
一、介绍
没有规矩,不成方圆。这句话在数据库的规范中同样适用,所以就有了这几项规定,数据库的三大范式。
我相信很多人都听过三大范式,面试题中也经常会问到,什么是数据库三大范式,这太常见了。
以前我只是机械式的回复面试官,但以后不会,不仅要学会说概念说规范,还能从实际出发,要不要严格遵守三大范式。
二、概念
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入门到入土 |
三、最后
在项目开发中,一定要严格遵循三范式的原则设计库表结构吗?
这个肯定不是,如果完全按照三范式进行设计,那么数据查询就一定需要大量的表关联,这样就会造成查询性能上的问题。
所以,冗余一部分常用的查询字段,避免表关联,这对我们的项目最有帮助。
我是半月,祝你幸福!!!