在设计数据库时,范式化设计是一种常用的理论和方法。其目的是消除冗余数据,提高数据库的完整性和规范性。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 数据库范式化设计理论总结
基础教程推荐
- 详解Python定时器Timer的使用及示例 2023-07-28
- 基于redis分布式锁实现“秒杀” 2023-09-11
- 盘点SqlServer 分页方式和拉姆达表达式分页 2023-07-28
- MySQL之JSON类型字段的使用技巧分享 2022-10-23
- 一文搞懂MySQL索引特性(清晰明了) 2023-12-28
- 数据库连接池以及sequelize实现增删改查等操作指 2022-08-31
- Ubuntu搭建Mysql+Keepalived高可用的实现(双主热备) 2023-08-09
- Postgresql数据库中的json类型字段使用示例详解 2023-07-21
- Oracle DML触发器和DDL触发器实例详解 2023-07-24
- Intellij IDEA连接Navicat数据库的方法 2023-12-07