目录
数据库三大范式是指数据库设计中的规范化原则,它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF);当然 Mysql 数据库的范式不止三大范式,除了三大范式,还有巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称“完美范式")。今天我们就来谈谈三大范式
总的来说可以这么理解:
- 列不可再分:为了应对需求的变化
- 主键约束:避免数据不统一
- 外键约束:为了后期的维护
不满足第一范式
学号 | 姓名 | 性别 | 学校信息 |
---|---|---|---|
001 | 张三 | 男 | 本科,大三 |
002 | 李四 | 女 | 研究生,研二 |
学校信息不满足原子性的要求,故不满足第一范式,修改后
满足第一范式
学号 | 姓名 | 性别 | 学历 | 年级 |
---|---|---|---|---|
001 | 张三 | 男 | 本科 | 大三 |
002 | 李四 | 女 | 研究生 | 研二 |
调整后的列不能再分,所以满足第一范式
不满足第二范式
学号 | 姓名 | 年龄 | 课程名称 | 成绩 |
---|---|---|---|---|
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 |
这样我们就遵循了第二范式
以这个不满足第二范式为例
学号 | 姓名 | 年龄 | 课程名称 | 成绩 |
---|---|---|---|---|
001 | 张三 | 28 | 语文 | 90 |
001 | 张三 | 28 | 数学 | 90 |
002 | 小黄 | 25 | 语文 | 90 |
002 | 小黄 | 25 | 数学 | 90 |
我们修改成符合第三范式的样子
学号 | 姓名 | 年龄 | 课程名称 |
---|---|---|---|
001 | 张三 | 28 | 语文 |
001 | 张三 | 28 | 数学 |
002 | 小黄 | 25 | 英语 |
002 | 小黄 | 25 | 化学 |
课程名称 | 成绩 |
---|---|
语文 | 90 |
数学 | 90 |
英语 | 90 |
化学 | 90 |
当然我这个写的不完善,但是意思就是这样的
三大范式的作用是保证数据库的结构合理、数据一致性和准确性高,并提高数据库的性能存储效率、查询性能和可维护性,从而更好地满足用户的需求。
反范式设计是一种与传统规范化设计相对的数据库设计方法,它允许在数据库中引入冗余数据以提高查询性能或简化查询操作。反范式设计的主要思想是通过增加冗余数据来消除关系型数据库中的连接操作,从而提高查询性能。
反范式设计在某些特定场景下可以提供较高的性能和简化查询操作,例如大型数据仓库、报表生成和实时大数据处理等情况。然而,需要注意的是,反范式设计也带来了数据冗余和更新复杂性的问题,需要在权衡性能和数据一致性之间进行合理的选择。
在实际应用中,需要根据具体的业务需求和性能要求来判断是否采用反范式设计,以及何时采用反范式设计。同时,反范式设计应慎重使用,并且需要进行适当的维护和管理,以确保数据的一致性和正确性。
【注意】反范式设计并非适用于所有情况,而且使用反范式设计可能会带来数据冗余和更新复杂性的问题。在应用反范式设计时,需要仔细评估具体的业务需求、性能要求和数据一致性需求,并根据实际情况做出合理的设计决策。
总结就是一句话,为什么要使用反范式设计:为了方便自己的效率而不遵循三大范式,使用反范式设计