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