type
Post
status
Published
date
Jul 18, 2022
slug
article-5
summary
MySql 三大范式讲解
tags
mysql
编程思想
category
技术分享
icon
password
Property
Jul 28, 2022 10:25 AM
三大范式是一种sql设计约束,用于解决数据字段冗余问题,使表设计清晰明了。

第一范式
概念:每一列属性都是不可分解的原子值
错误范例❌
姓名 | 年龄 | 地址 |
张三 | 21 | 中国浙江 |
李四 | 22 | 中国江苏 |
正确范例✅
姓名 | 年龄 | 国家 | 省份 |
张三 | 21 | 中国 | 浙江 |
李四 | 22 | 中国 | 江苏 |
此范例中,地址属性还可拆分为国家,身份,甚至还可再分为地区等,将表中属性拆分到不可拆分为止即可满足第一范式
第二范式
概念:在第一范式的基础上,消除了非主属性对主属性的部分函数依赖
简言之:每一列都需与主键有关,而非与主键的一部分有关
错误范例❌
订单id | 商品id | 用户id | 商品名称 | 商品数量 | 用户名 | 用户电话 |
1 | 1 | 1 | JavaEE精品课 | 1 | mushan | 666 |
2 | 2 | 2 | C++入门到精通 | 2 | 木杉 | 999 |
2 | 2 | 3 | 算法提高课 | 1 | 夫子 | 888 |
范例设定主键为:
订单id + 商品id (当然这是不合理的,此处只做假设)
此时由于 商品名称 和 商品数量 两个字段只与字段 商品id 有关,与 订单id 没有关联,因此不满足第二范式,需将商品id,商品名称,商品数量单独拆分出一个表,以此满足第二范式正确范例 ✅
订单表
订单id | 商品id | 用户id | 用户名 | 用户电话 |
1 | 1 | 1 | mushan | 666 |
1 | 2 | 2 | 木杉 | 999 |
2 | 3 | 3 | 夫子 | 888 |
商品表
商品id | 商品名称 | 商品数量 |
1 | JavaEE精品课 | 1 |
2 | C++入门到精通 | 2 |
3 | 算法提高课 | 1 |
第三范式
概念:在第二范式的基础上,消除非主属性对主属性的传递函数依赖
简言之:每一列数据都与主键直接相关而不能间接相关
我们将第二范式中的正确案例针对第三范式再次优化
错误范例❌
订单表
订单id | 商品id | 用户id | 用户名 | 用户电话 |
1 | 1 | 1 | mushan | 666 |
1 | 2 | 2 | 木杉 | 999 |
2 | 3 | 3 | 夫子 | 888 |
商品表
商品id | 商品名称 | 商品数量 |
1 | JavaEE精品课 | 1 |
2 | C++入门到精通 | 2 |
3 | 算法提高课 | 1 |
由于订单表中的
用户id依赖于订单id ,但是 用户地址 和 用户电话 依赖于用户id ,因此不满足第三范式,由此将表拆分出用户表正确范例✅
订单表
订单id | 商品id | 用户id |
1 | 1 | 1 |
1 | 2 | 1 |
2 | 3 | 3 |
用户表
用户id | 用户名 | 用户电话 |
1 | mushan | 666 |
2 | 木杉 | 999 |
3 | 夫子 | 888 |
商品表
商品id | 商品名称 | 商品数量 |
1 | JavaEE精品课 | 1 |
2 | C++入门到精通 | 2 |
3 | 算法提高课 | 1 |
总结
在开发中是否应该完全遵循三范式? 答案:❌
优点:表结构清晰明了,几乎没有冗余
缺点:数据查询一定会需要大量的表关联,将会造成性能缺陷

阿里巴巴开发规约中也明确规定禁止超过三表关联。
所以在实际开发中,允许适当的增加冗余字段,解决过多表关联查询问题
对于冗余字段数量的限制,需根据业务情况分析。
- Author:mushan
- URL:https://blog.mushan.xyz/article/article-5
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts