沃梦达 / 编程技术 / 数据库 / 正文

MySQL 数据库范式化设计理论总结

在设计数据库时,范式化设计是一种常用的理论和方法。其目的是消除冗余数据,提高数据库的完整性和规范性。MySQL 范式化设计理论主要包括 1NF、2NF、3NF、BCNF 等范式,下面详细讲述其概念及实际应用。

MySQL 数据库范式化设计理论总结

在设计数据库时,范式化设计是一种常用的理论和方法。其目的是消除冗余数据,提高数据库的完整性和规范性。MySQL 范式化设计理论主要包括 1NF、2NF、3NF、BCNF 等范式,下面详细讲述其概念及实际应用。

1NF

1NF(第一范式)指的是数据表中的每一列都是不可再分的原子数据项。每个数据项必须只有一个属性或字段,且该属性或字段对于这个记录有唯一的值。

例如,下面的 student 数据表符合 1NF:

id name gender age
1 Tom M 20
2 Lily F 18

2NF

2NF(第二范式)在 1NF 的基础上,要求非主键列必须完全依赖于主键而非部分依赖。即非主键的所有属性必须与主键有关系,不存在仅与主键的一部分有关系的情况。

例如,下面的 course 数据表符合 2NF:

id name teacher_id teacher_name
1 Math 101 Mike
2 Eng 102 Lucy

3NF

3NF(第三范式)在 2NF 的基础上,要求非主键列不存在传递依赖。如果非主键列 A 依赖于非主键列 B,而非主键列 B 又依赖于主键,则需要拆分成两张表。

例如,下面的 student_course 数据表符合 3NF:

id student_id course_id score
1 001 1 80
2 002 2 90

BCNF

BCNF(巴斯 - 科德范式)是一种更高级的范式,在 3NF 的基础上规定如果一个关系中的所有非主属性都对于主关键字是完全函数依赖的,那么它就符合 BCNF,在这种情况下,需要将表拆分。

例如,下面的员工部门关系表不符合 BCNF:

员工编号 员工姓名 部门编号 部门名称
001 Tom 101 财务部
002 Lily 102 研发部

因为部门名称和部门编号的关系并不是完全函数依赖于主键,所以需要拆分成两张表:

员工表:

员工编号 员工姓名 部门编号
001 Tom 101
002 Lily 102

部门表:

部门编号 部门名称
101 财务部
102 研发部

实例说明

以一个销售系统为例演示 MySQL 数据库如何进行范式化设计。

案例背景

我们要设计一个销售系统,有客户、订单、产品等三个数据表,其中客户表含有客户信息,订单表包含订单信息,产品表包含产品信息。

第一范式设计

首先对客户、订单和产品数据表进行第一范式设计,将数据表中的重复数据分离,保证每一列都是不可再分的原子数据项。

客户表设计如下:

客户ID 客户姓名 地址 电话
1 Tom 北京 12345678
2 Lily 上海 98765432

订单表设计如下:

订单ID 客户ID 订购时间 产品ID 数量 价格
001 1 2019-01-01 101 2 200
002 2 2019-01-02 102 3 300

产品表设计如下:

产品ID 产品名称 类别 厂家 价格
101 产品1 类别1 厂家A 100
102 产品2 类别2 厂家B 200

第二、第三范式设计

在第一范式设计的基础上,对订单表进行第二范式及第三范式设计。

订单表设计如下:

订单ID 客户ID 订购时间
001 1 2019-01-01
002 2 2019-01-02

订单详情表设计如下:

订单ID 产品ID 数量 价格
001 101 2 200
002 102 3 300

BCNF设计

在第二、第三范式设计的基础上,对产品表进行 BCNF 设计。

产品表设计如下:

产品ID 产品名称
101 产品1
102 产品2

产品信息表设计如下:

产品ID 类别 厂家 价格
101 类别1 厂家A 100
102 类别2 厂家B 200

以上就是 MySQL 数据库范式化设计理论的总结及其实际应用示例,通过范式化设计可以规范数据库的存储结构,降低数据冗余,提高数据库查询效率和数据的维护性。

本文标题为:MySQL 数据库范式化设计理论总结

基础教程推荐