MySQL的三大范式

简介

在MySQL的使用中, 要根据实际灵活设计表,一般来说我们通常遵循三大范式(啥是范式:是一些约束、规范、规则, 来优化数据库表的设计和存储),三大范式之间是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上。

第一范式

第一范式:列不可再分

第一范式遵循原子性:数据表中的列数据都像原子一样不可再分
举例子理解:

姓名爱好
明星蔡徐坤打篮球
网红童锦程开法拉利SF90
程序员分才996

里面的数据还可以再分吗?

从数据中可以看出姓名列的数据可以明显分为职务和姓名,分好后:

姓名爱好职务
蔡徐坤打篮球明星
童锦程开法拉利SF90网红
分才996程序员

这样改是不是好多了。。。。

第二范式

行可以唯一区分

第二范式遵循唯一性:在第一范式的基础上,数据表的主键行的数据可以确定其他所有行的数据,满足主键约束。

姓名爱好职务
蔡徐坤打篮球明星
童锦程开法拉利SF90网红
分才996程序员
分才开法拉利程序员

我们开始按照第二范式开始分析:
如果以姓名作为主键,我们可以确定职务,但是无法确定爱好,就像不知道分才到底爱996还是爱开法拉利(SF90)。

如果以姓名,爱好作为联合主键,我们可以才确定职务。

  1. 第二范式要求表中的所有非主键列必须完全依赖于全部主键,而不是部分依赖。这意味着每个非主键列必须直接依赖于整个主键,而不是只依赖于主键的一部分。

  2. 第二范式的主要目标是消除部分依赖,确保表中的所有非主键属性都完全依赖于主键,从而避免数据冗余和更新异常。

根据第二范式,我们可以将表拆分成两个表:

表1: 人员信息表 (Person)

姓名(主键)职务
蔡徐坤明星
童锦程网红
分才程序员

表2: 爱好表 (Hobby)

爱好(主键)姓名(外键)
打篮球蔡徐坤
开法拉利SF90童锦程
996分才
开法拉利分才

第三范式:

表的非主键属性不能依赖与其他表的非主属性 ,满足外键约束

  1. 第三范式要求表中的所有列只依赖于主键,而不依赖于其他非主键列。换句话说,任何非主键列之间不应该存在传递依赖关系。
  2. 第三范式的主要目标是消除传递依赖,确保表中的每个非主键列都直接依赖于主键,而不是依赖于其他非主键列。

开始有点难度了

在这里插入图片描述

举个例子来说明第三范式的概念:

假设我们有一个学生信息表(Students),其中包含以下字段:

  • 学生ID(StudentID,主键)
  • 学生姓名(StudentName)
  • 学生年龄(StudentAge)
  • 班级(Class)
  • 班级老师(Teacher)

如果我们设计的表结构中存在这样的依赖关系:班级依赖于班级老师,即一个班级只能有一个班级老师,那么这个设计就不符合第三范式。

在这种情况下,应该将班级和班级老师分开成两个表,如下所示:

Students表

  • 学生ID(StudentID,主键)
  • 学生姓名(StudentName)
  • 学生年龄(StudentAge)
  • 班级ID(ClassID,外键,关联Classes表)

Classes表

  • 班级ID(ClassID,主键)
  • 班级(Class)
  • 班级老师(Teacher)

通过将班级和班级老师分开成两个表,我们遵循了第三范式,确保了数据的一致性和避免了数据冗余。

当然在实际生活中我们要灵活应用,不是非要硬套公式。

建了一个公众号(名字叫音耀),后续会在上面更新一些有用资源和笔记,大家有兴趣的话可以加一下谢谢了。

在这里插入图片描述

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

分才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值