一、三大范式
1、什么是数据库三大范式
数据库三大范式是指数据库设计中的规范化原则,它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF);当然 Mysql 数据库的范式不止三大范式,除了三大范式,还有巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称“完美范式")。今天我们就来谈谈三大范式
- 第一范式(1NF)要求数据库表中的每个列都是不可再分的原子值,即每个列都不能包含多个值或值的列表。
- 第二范式(2NF)要求数据库表中的非主键列必须完全依赖于所有主键而非部分主键。换句话说,每个非主键列必须与整个主键相关,而不是只与主键的某个部分相关。
- 第三范式(3NF)要求数据库表中的非主键列之间不能存在传递依赖关系。换句话说,非主键列之间不能相互依赖,而应该直接依赖于主键。
总的来说可以这么理解:
- 列不可再分:为了应对需求的变化
- 主键约束:避免数据不统一
- 外键约束:为了后期的维护
1.1、第一范式(1NF)
不满足第一范式
学生信息表
学号 | 姓名 | 性别 | 学校信息 |
001 | 张三 | 男 | 本科,大三 |
002 | 李四 | 女 | 研究生,研二 |
学校信息不满足原子性的要求,故不满足第一范式,修改后
满足第一范式
学生信息表
学号 | 姓名 | 性别 | 学历 | 年级 |
001 | 张三 | 男 | 本科 | 大三 |
002 | 李四 | 女 | 研究生 | 研二 |
调整后的列不能再分,所以满足第一范式
1.2、第二范式(2NF)
不满足第二范式
学生信息表
学号 | 姓名 | 年龄 | 课程名称 | 成绩 |
001 | 张三 | 28 | 语文 | 90 |
001 | 张三 | 28 | 数学 | 90 |
002 | 小黄 | 25 | 语文 | 90 |
002 | 小黄 | 25 | 数学 | 90 |
修改后
满足第二范式
学生信息表
学号 | 姓名 | 年龄 |
001 | 张三 | 28 |
001 | 张三 | 28 |
002 | 小黄 | 25 |
002 | 小黄 | 25 |
课程表
课程编号 | 课程名称 |
01 | 语文 |
02 | 数学 |
成绩表 - 学号和课程编号称做联合主键
成绩表
学号 | 课程编号 | 成绩 |
001 | 01 | 90 |
001 | 02 | 90 |
002 | 01 | 90 |
002 | 02 | 90 |
这样我们就遵循了第二范式
1.3、第三范式(3NF)
以这个不满足第二范式为例
学生信息表
学号 | 姓名 | 年龄 | 课程名称 | 成绩 |
001 | 张三 | 28 | 语文 | 90 |
001 | 张三 | 28 | 数学 | 90 |
002 | 小黄 | 25 | 语文 | 90 |
002 | 小黄 | 25 | 数学 | 90 |
我们修改成符合第三范式的样子
学生信息表
学号 | 姓名 | 年龄 | 课程名称 |
001 | 张三 | 28 | 语文 |
001 | 张三 | 28 | 数学 |
002 | 小黄 | 25 | 英语 |
002 | 小黄 | 25 | 化学 |
成绩表
课程名称 | 成绩 |
语文 | 90 |
数学 | 90 |
英语 | 90 |
化学 | 90 |
当然我这个写的不完善,但是意思就是这样的
2、为什么要是用三大范式及作用
- 数据的存储和更新更加高效:通过将数据库设计规范化,可以减少冗余数据的存储,节省存储空间,并且更新数据时只需要更新相关的表,而不会造成数据不一致。
- 数据的一致性和准确性更高:通过遵循三大范式,可以避免冗余和不一致的数据,确保数据的一致性和准确性。
- 查询和分析更加方便:规范化的数据库设计可以减少数据冗余,简化数据库查询和分析操作,提高查询性能和数据处理效率。
- 数据结构更清晰、易于理解和维护:三大范式强调将数据拆分为更小的关系表,每个表只包含与之相关的数据,使得数据库结构更加清晰和易于理解。这样可以方便数据库开发人员理解和维护数据库结构,减少开发和维护的困难。
三大范式的作用是保证数据库的结构合理、数据一致性和准确性高,并提高数据库的性能存储效率、查询性能和可维护性,从而更好地满足用户的需求。
二、反范式设计
1、什么是反范式设计
反范式设计是一种与传统规范化设计相对的数据库设计方法,它允许在数据库中引入冗余数据以提高查询性能或简化查询操作。反范式设计的主要思想是通过增加冗余数据来消除关系型数据库中的连接操作,从而提高查询性能。
2、特点
反范式设计在某些特定场景下可以提供较高的性能和简化查询操作,例如大型数据仓库、报表生成和实时大数据处理等情况。然而,需要注意的是,反范式设计也带来了数据冗余和更新复杂性的问题,需要在权衡性能和数据一致性之间进行合理的选择。
- 冗余数据:反范式设计容许在数据库中存储冗余数据,即将数据冗余地存储在多个地方。这可以避免进行复杂的连接操作,减少查询时的表关联数量,从而提高查询性能。
- 数据冗余的更新:由于反范式设计引入了冗余数据,对于数据的更新可能需要在多个位置进行操作,以保持数据的一致性。这对于维护数据的完整性和正确性提出了一定的挑战。
- 查询简化:通过消除连接操作,反范式设计可以简化查询的编写和理解,使得查询操作更加直观和简便。
在实际应用中,需要根据具体的业务需求和性能要求来判断是否采用反范式设计,以及何时采用反范式设计。同时,反范式设计应慎重使用,并且需要进行适当的维护和管理,以确保数据的一致性和正确性。
3、运用场景
- 高频读取、低频更新的情况:当数据被频繁读取而较少更新时,可以通过引入冗余数据来提高读取的性能。因为读取操作的频率远远超过更新操作,而且避免连接操作可以加快读取速度。
- 复杂查询和分析需求:如果业务需要进行复杂的查询和分析操作,而传统的规范化设计会导致繁琐的连接操作,影响查询性能和可读性,那么反范式设计可以简化查询操作,提高查询效率。
- 数据仓库和报表生成:在数据仓库和报表生成场景中,通常需要处理大量的历史数据和统计数据。通过反范式设计,可以将常用的聚合数据冗余存储,加速复杂的报表生成过程。
- 高并发和低延迟要求:对于需要高并发性能和低延迟的应用,如实时大数据处理和高并发系统,通过反范式设计消除连接操作的复杂性,可以提高系统的响应速度和吞吐量。
- 特定优化需求:在某些特定的业务需求下,如针对某类查询或特定数据的查询进行优化,反范式设计可以针对这些特定的优化需求进行设计。
【注意】反范式设计并非适用于所有情况,而且使用反范式设计可能会带来数据冗余和更新复杂性的问题。在应用反范式设计时,需要仔细评估具体的业务需求、性能要求和数据一致性需求,并根据实际情况做出合理的设计决策。
4、总结
总结就是一句话,为什么要使用反范式设计:为了方便自己的效率而不遵循三大范式,使用反范式设计