详解MySQL 数据库范式
什么是数据范式
数据范式是一种设计数据库表的标准,它能够减少数据冗余,提高数据管理的效率,降低了数据修改所造成的风险。
数据范式根据数据之间的关系,分为不同级别。较低级别的范式被包含在较高级别的范式之中。
目前最广泛使用的范式有6个级别,分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,也叫做完全性范式)。
为什么要使用数据范式
当设计数据库表时,数据冗余的存在会带来以下问题:
- 数据修改异常:如果数据的多个实例之间存在不一致性,进行修改时需要在多处修改,容易造成错误。
- 数据插入异常:由于表中某些数据需要依赖于其它数据,如果某些数据未插入,会导致不能插入它依赖的数据的问题。
- 数据删除异常:如果删除某个数据会导致其它数据无法被检索到的问题。
使用数据范式能够有效的避免这些冗余和异常。
常见的数据范式
第一范式(1NF)
第一范式就是指要求数据库表的所有字段都是不可分割的原子值。
举例来说,存在以下一张 Order 表:
| 订单ID | 顾客信息 | 订单日期 | 金额 |
|-------|---------|--------|------|
| 1 | {"姓名":"Tom", "手机号":"12345678"} | 2020-12-01 | 100 |
| 2 | {"姓名":"Jerry", "手机号":"87654321"} | 2020-12-02 | 200 |
顾客信息这个字段不是原子值,而且存在多个信息项,应该拆分为两个字段:姓名和手机号。修改后的表结构如下:
| 订单ID | 姓名 | 手机号 | 订单日期 | 金额 |
|-------|------|-------|--------|------|
| 1 | Tom | 12345678 | 2020-12-01 | 100 |
| 2 | Jerry | 87654321 | 2020-12-02 | 200 |
第二范式(2NF)
第二范式是在第一范式的基础上,要求表中的非主键列完全依赖于主键。
举例说明,以下是一张班级成绩表:
| 班级ID | 学生ID | 学生姓名 | 课程名称 | 成绩 |
|-------|---------|--------|--------|-----|
| 1 | 1001 | Tom | 语文 | 80 |
| 1 | 1002 | Jerry | 语文 | 90 |
| 1 | 1003 | Mary | 数学 | 70 |
| 2 | 1004 | Peter | 语文 | 85 |
在该表中,主键是由班级ID和学生ID构成的联合主键,但是存在非主键列课程名称和成绩仅依赖于班级ID,裂解该表为两张表:
班级信息表:
| 班级ID | 学生ID | 学生姓名 |
|-------|---------|--------|
| 1 | 1001 | Tom |
| 1 | 1002 | Jerry |
| 1 | 1003 | Mary |
| 2 | 1004 | Peter |
成绩信息表:
| 班级ID | 学生ID | 课程名称 | 成绩 |
|-------|--------|--------|-----|
| 1 | 1001 | 语文 | 80 |
| 1 | 1002 | 语文 | 90 |
| 1 | 1003 | 数学 | 70 |
| 2 | 1004 | 语文 | 85 |
第三范式(3NF)
第三范式是在第二范式的基础上,要求表中的所有非主键列都不传递依赖于主键。
举例说明,以下是一张订单详情表:
| 订单ID | 商品ID | 商品名称 | 商品价格 | 商品品牌 | 供应商ID | 供应商名称 |
|-------|-------|--------|-------|-------|-------|-------|
| 1 | 1001 | 红富士 | 5.5 | 优选 | 2001 | 陈糖糖 |
| 2 | 1002 | 二哥 | 2.5 | 好吃 | 2002 | 宋老板 |
| 3 | 1003 | 福建石油茶 | 15 | 贵 | 2003 | 马金翠 |
在该表中,商品品牌和供应商名称对于商品和供应商来说不是原子值。商品品牌和供应商名称依赖于供应商ID,而商品品牌同时还依赖于商品ID,因此需拆分为多个表:
商品信息表:
| 商品ID | 商品名称 | 商品价格 | 供应商ID |
|--------|-------|--------|-------|
| 1001 | 红富士 | 5.5 | 2001 |
| 1002 | 二哥 | 2.5 | 2002 |
| 1003 | 福建石油茶 | 15 | 2003 |
供应商信息表:
| 供应商ID | 供应商名称 |
|--------|-------|
| 2001 | 陈糖糖 |
| 2002 | 宋老板 |
| 2003 | 马金翠 |
商品与供应商关系表:
| 商品ID | 供应商ID | 商品品牌 |
|--------|-------|-------|
| 1001 | 2001 | 优选 |
| 1002 | 2002 | 好吃 |
| 1003 | 2003 | 贵 |
总结
通过使用数据范式可以有效的规避数据冗余和异常,提高了数据库管理的效率和安全性。在设计数据表时,要根据实际需求和数据之间关系确定适用的范式。
以上就是关于MySQL数据库范式的简要介绍,还有其他更高级别的数据范式需要读者自行了解与实践。
如果您对数据范式有进一步的问题或者需要更详细的介绍,可以参考MySQL 官方文档或者其他相关资料。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MySQL 数据库范式 - Python技术站