文章目录
- 1.概念
- 2.第一范式(1NF)
- 3.第二范式(2NF)
- 4.第三范式(3NF)
- 5.反范式
1.概念
范式(数据库设计范式,数据库的设计范式)是数据库规范化的一个手段,是数据库设计中的一系列原理和技术,用于减少数据库中的数据冗余,并增进数据的一致性。
数据规范化通常是将大表分成较小的表,并且定义它们之间的关系。这样做的目的是为了避免冗余存放数据,并确保数据的⼀致性。添加、删除和修改数据等操作可能需要修改多个表,但只需要修改⼀个地方即可保证所有表中相关数据的⼀致性。由于数据分布在多个表之间,因此检索信息可能需要根据表之间的关系联合查询多个表。
数据规范化的实质是简单写、复杂读。写入操作比较简单,对于不同的信息,分别修改不同的表即可;而读取数据则相对复杂,检索数据的时候,可能需要编写复杂的SQL来联合查询多个表。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
2.第一范式(1NF)
第一范式是指数据库表的每一列(属性)都是不可分割的基本数据项,这就要求数据库的每一列都只能存放单一值,即实体中某一个属性不能有多个值或不能有重复的属性。
第一范式是对关系模式的基本要求。
关键点:每一列都只能存放单一值。

3.第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,一个数据表符合第二范式的前提是该数据表符合第一范式。
它的规则是要求数据表里的所有数据都要和该数据表的主键有完全相依的关系;如果有哪些数据只和主键的一部分有关的话,就得把它们独立出来变成另一个数据表。当存在多个主键的时候,才会发生不符合第二范式的情况。
关键点:非主键字段完全依赖于主键
错误范例:
⼀个微博表,content 字段依赖 wb_id,而不依赖主键 user_id

4.第三范式(3NF)
第三范式要求所有非主键属性都只和主键有相关性,而非主键属性之间应该是独立无关的。
更通俗点讲:非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列A依赖于非主键列B,非主键列 B 依赖于主键的情况。
第三范式(3NF)是第⼆范式(2NF)的⼀个子集,即满足第三范式(3NF)必须满足第⼆范式(2NF)。
关键点:消除传递依赖(非主字段不依赖于其他非主字段)
错误范例:
⼀个订单表,总价字段 total 依赖另外两个字段,所以应该去掉。

5.反范式
反范式是试图通过增加冗余数据或通过分组数据来优化数据库读取性能的过程。在某些情况下,反范式是解决数据库性能和可伸缩性的极佳策略。
范式化的设计是在不同的有关系的表中存储不同的信息,如果需要查询信息往往需要连接多个表,如果连接的表很多,将会导致很多随机I/O,那么查询可能会非常慢。
⼀种做法是反范式的数据表设计。由于多了冗余数据,因此数据的⼀致性需要靠数据库约束或应用程序来保证。传统商业数据库⼀般通过施加数据库约束来确保数据的⼀致性,而互联网数据库⼀般靠应用程序来确保数据的⼀致性。
例如,在微博表中,除了增加作者 id 外,也可以添加作者名,还可以添加点赞数量。
















