数据库的三大范式
数据库的三大范式
一、介绍#
没有规矩,不成方圆。这句话在数据库的规范中同样适用,所以就有了这几项规定,数据库的三大范式。
我相信很多人都听过三大范式,面试题中也经常会问到,什么是数据库三大范式,这太常见了。
以前我只是机械式的回复面试官,但以后不会,不仅要学会说概念说规范,还能从实际出发,要不要严格遵守三大范式。
二、概念#
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入门到入土 |
三、最后#
在项目开发中,一定要严格遵循三范式的原则设计库表结构吗?
这个肯定不是,如果完全按照三范式进行设计,那么数据查询就一定需要大量的表关联,这样就会造成查询性能上的问题。
所以,冗余一部分常用的查询字段,避免表关联,这对我们的项目最有帮助。
我是半月,祝你幸福!!!
作者: 半月无霜
出处:https://www.cnblogs.com/banmoon/p/16407556.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!