数据库的三大范式

数据库技术
328
0
0
2023-03-28

数据库的三大范式

一、介绍

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

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

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

二、概念

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入门到入土

三、最后

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

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

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

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