MySQL数据库的三种范式重复性最小化,数据结构优化,数据处理灵活性,提升数据质量与维护效率

MySQL数据库的三种范式:重复性最小化,数据结构优化,数据处理灵活性,提升数据质量与维护效率。

MySQL作为关系型数据库管理系统,其设计的核心思想就是三种范式。三种范式是数据库设计过程中非常基本和重要的概念,它们可以最大程度地减少数据冗余,提升数据处理灵活性,和数据维护效率。在本文中,我们将会详细探讨MySQL中的这三种范式。

1. 第一范式(1NF)

第一范式是最基本的,它对数据的重复性做了最基本的限制。在第一范式中,每个表格必须具有唯一的主键。每个数据项都应该是原子性的,不可再分的最小单元,即每一个数据表在任何字段(column)中都不能有多个值,即不能存在重复的数据。否则,它就不符合第一范式要求。

示例:

下面是一个简单的表格,其中包含一些客户的数据及其订单信息。

| CustomerID | CustomerName | OrderDate | OrderNo | Item | Qty |

|————|————–|———–|———|———-|——-|

| 1001 | Peter | 2018-01-01 | A001 | Apple | 10 |

| 1001 | Peter | 2018-01-01 | A001 | Banana | 20 |

| 1002 | Alice | 2018-01-02 | A002 | Orange | 30 |

| 1002 | Alice | 2018-01-02 | A002 | Pear | 5 |

| 1003 | Bill | 2018-01-02 | A003 | Pineapple| 15 |

在上述表中存在重复的数据,比如第一条和第二条,两行数据中的客户编号,客户名称,订单日期和订单编号都重复了。这样的数据对于数据处理和数据库维护都是非常低效的。

对比:

如果符合第一范式的数据表的话,这张表格将会被分成两个表格:一个存储客户信息,一个存储订单数据。

客户信息表:

| CustomerID | CustomerName |

|————|————–|

| 1001 | Peter |

| 1002 | Alice |

| 1003 | Bill |

订单数据表:

| OrderDate | OrderNo | CustomerID | Item | Qty |

|———–|———|————|———-|——-|

| 2018-01-01| A001 | 1001 | Apple | 10 |

| 2018-01-01| A001 | 1001 | Banana | 20 |

| 2018-01-02| A002 | 1002 | Orange | 30 |

| 2018-01-02| A002 | 1002 | Pear | 5 |

| 2018-01-02| A003 | 1003 | Pineapple| 15 |

这样,我们就去掉了冗余数据,变成了两个符合第一范式的表。

2. 第二范式(2NF)

在第二范式中,表格要求每个非主键字段都必须与主键有完全依赖关系,而不能依赖于主键的部分属性。

示例:

下面是一个订单表格,在第一范式的基础上,做了一些修改以符合第二范式(订单编号作为唯一标识):

| OrderNo | CustomerID | CustomerName | Item | Qty | UnitPrice |

|———|————|————–|———-|——-|———|

| A001 | 1001 | Peter | Apple | 10 | 1.99 |

| A001 | 1001 | Peter | Banana | 20 | 2.99 |

| A002 | 1002 | Alice | Orange | 30 | 3.99 |

| A002 | 1002 | Alice | Pear | 5 | 5.99 |

| A003 | 1003 | Bill | Pineapple| 15 | 4.99 |

在这个表格中,列CustomerName和UnitPrice都和主键OrderNo的关系是完全依赖的,这意味着它们可以像订单编号、客户编号和数量一样,被单独存储在一个新的表格中。

对比:

这样,我们就可以创建一个新的表格,存储相应的数据:

| OrderNo | CustomerID | Qty |

|———|————|—–|

| A001 | 1001 | 10 |

| A001 | 1001 | 20 |

| A002 | 1002 | 30 |

| A002 | 1002 | 5 |

| A003 | 1003 | 15 |

客户信息表:

| CustomerID | CustomerName |

|————|————–|

| 1001 | Peter |

| 1002 | Alice |

| 1003 | Bill |

单价表格:

| Item | UnitPrice |

|———-|———|

| Apple | 1.99 |

| Banana | 2.99 |

| Orange | 3.99 |

| Pear | 5.99 |

| Pineapple| 4.99 |

通过这样的改动,我们消除了所有的冗余数据,同时每个表格都可以单独操作,数据也更加灵活和易于维护。

3. 第三范式(3NF)

在第三范式中,表格要求每个非主键字段之间没有传递依赖关系。

示例:

下面是一个课程表格,其中包含了有关学院,教师和学生的信息,其中有一个字段被重复地存储了两次:教师的名字。

| CourseID | CourseName | TeacherID | TeacherName | Department | Students |

|———-|—————|———–|————-|—————-|————|

| 001 | Math | 1001 | Tom | Mathematics | 30 |

| 002 | English | 1002 | Sarah | English | 25 |

| 003 | Science | 1003 | Bob | Physics | 20 |

在这个表格中,教师的名字(TeacherName)是在教师编号(TeacherID)和课程号(CourseID)之间传递依赖的,因为一个老师只能负责一门课程,因此每个老师的名字只需存储一次。

对比:

为了去除冗余数据,我们可以创建两个表格:一个课程表格和一个教师表格。

课程表格:

| CourseID | CourseName | TeacherID | Department | Students |

|———-|—————|———–|—————-|————|

| 001 | Math | 1001 | Mathematics | 30 |

| 002 | English | 1002 | English | 25 |

| 003 | Science | 1003 | Physics | 20 |

教师表格:

| TeacherID | TeacherName |

|———–|————-|

| 1001 | Tom |

| 1002 | Sarah |

| 1003 | Bob |

在这个表格中,我们实现了去重和数据不冗余的状态,并且在操作上也更加灵活和灵敏。

结论

MySQL的三种范式:第一、第二、第三范式是MySQL数据库设计的基础。通过这三种规范的约束、最佳实践可以规避许多常见的数据库设计问题。同时,理解这些规则可以大大提高数据的可扩展性、可用性、可读性和可维护性。

附:MySQL SQL例子见参考资料

参考资料

https://www.dofactory.com/sql/normalize-database

http://www.ruanyifeng.com/blog/2019/04/database-normalization.html


数据运维技术 » MySQL数据库的三种范式重复性最小化,数据结构优化,数据处理灵活性,提升数据质量与维护效率