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