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设计约束,用于解决数据字段冗余问题,使表设计清晰明了。
notion image

第一范式

概念:每一列属性都是不可分解的原子值
错误范例❌
姓名
年龄
地址
张三
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

总结

在开发中是否应该完全遵循三范式? 答案:❌ 优点:表结构清晰明了,几乎没有冗余 缺点:数据查询一定会需要大量的表关联,将会造成性能缺陷
notion image
阿里巴巴开发规约中也明确规定禁止超过三表关联。 所以在实际开发中,允许适当的增加冗余字段,解决过多表关联查询问题 对于冗余字段数量的限制,需根据业务情况分析。
 
 
FFmpegMySql 树形结构表存储方案

  • Valine
  • Giscus