MySQL 数据库规范化

MySQL 数据库规范化

MySQL是一种非常流行的开源关系型数据库管理系统,用于管理和存储各种数据。在实际应用中,需要注意到数据库的规范化,以提高数据的一致性、规范性和可维护性。

阅读更多:MySQL 教程

什么是数据库规范化

数据库规范化是一种规范数据库模式设计的方法,目的是减少数据冗余并确保数据的一致性。它将数据分解为多个表,每个表只包含一个相关数据类别,并建立表之间的关系。具体而言,数据库规范化核心思想是将一个大的表(或多个表)分解为多个小的表,通过添加外键来建立表与表之间的关系。

数据库规范化的几个范式

数据库规范化基于几个著名的规范化范式,下面分别介绍。

第一范式

第一范式(1NF)指的是每个表每个字段都是原子的,即不可再次分解,因为在一个数据库中同一字段的属性不能相同。例如,如果我们有一个表“学生”,其中包含一个名为“电话”的字段,它将包含两个值:家庭电话和移动电话,无法在设计的表中分解。我们可以将其分解为两个表,一个是“学生”,一个是“电话”,然后使用外键建立“学生”和“电话”表之间的联系。

例如,以下是不符合第一范式的的表:

分类 描述
书名 第一个作者
爱好 第二个作者
日期 出版日期

通过规范化可以将其分解为三个表:

处理前:

书名 作者 爱好 出版日期
鲁滨逊漂流记 王苏 / 李芳 篮球 / 足球 2015-01-01
疯狂Java讲义 李从阳 / 陶澍 游泳 / 钓鱼 2016-01-02

处理后:

  • 书表:
书名 出版日期
鲁滨逊漂流记 2016-01-01
疯狂Java讲义 2016-01-02
  • 作者表:
ID 作者
1 王苏
2 李芳
3 李从阳
4 陶澍
  • 书-作者表:
书ID 作者ID
1 1
1 2
2 3
2 4

可以看到,在将原表分解为三个表后,每个表的复杂度都降低了,数据也变得更易维护。

第二范式

第二范式(2NF)是指表必须满足第一范式,同时不存在非关键字依赖性,即表的属性必须完全依赖于该表的候选键。换句话说,每张表必须至少有一个组合主键,每张表内所有非主键属性都必须依赖于这个组合主键。如果存在属性只依赖于部分组合主键,那么需要把这部分属性分离到一个新的表中,使得每个表的属性都完全依赖于主键。

例如,以下是不符合第二范式的表:

订单号 商品编号 商品名称 供应商名称
1001 001 iPhone 6 Apple
1001 002 MacBook Apple
1002 001 iPhone 6S Apple
1002 003 Galaxy S8 Samsung

这个表中,订单号和商品编号构成了组合主键,但是商品名称和供应商名称依赖于商品编号而不是组合主键。因此,我们需要将商品名称和供应商名称放入到一个新表中,并用商品编号和供应商名称作为主键。

处理后:

  • 订单表
订单号 商品编号
1001 001
1001 002
1002 001
1002 003
  • 商品表
商品编号 商品名称
001 iPhone 6
002 MacBook
003 Galaxy S8
  • 供应商表
商品编号 供应商名称
001 Apple
002 Apple
003 Samsung

这样,每个表都符合第二范式。

第三范式

第三范式(3NF)指的是表必须满足第二范式,并且不存在传递依赖。即每张表都应该只描述一个独立数据集,而不能插入其他非关键属性。如果存在这种情况,需要将这些非关键属性分离到另一个表中,每个表都只描述一个独立数据集。

例如,以下是不符合第三范式的表:

订单编号 顾客手机号 顾客姓名 顾客居住地址
1001 12345678901 张三 北京市朝阳区某个路段
1002 12345678902 李四 上海市浦东新区某个路段

这个表中,顾客相关的信息依赖于顾客手机号而不是订单编号,因此需要将顾客信息存储到一个新的表中,并使用手机号作为主键。

处理后:

  • 订单表
订单编号 顾客手机号
1001 12345678901
1002 12345678902
  • 顾客表
顾客手机号 顾客姓名 顾客居住地址
12345678901 张三 北京市朝阳区某个路段
12345678902 李四 上海市浦东新区某个路段

这样,每个表都符合第三范式。

总结

MySQL数据库规范化是一项非常重要的工作,在实践中需要仔细分析和评估是否有必要对数据库进行规范化。如果数据库规范化得当,可以提高数据的可维护性、一致性和规范性,同时也可以减少数据出错的风险。在设计数据库时,应该尽可能地遵循规范化原则,以确保数据库的有效性和可靠性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程