前言
“学长,SqlServer数据库三范式可以简单帮我理解一下吗?”。
学妹的一句话把我问蒙了,因为三范式的概念早就丢到外太空去了。
但是呢,我不能直接说我忘记了,为了不影响在学妹心目中的形象(你懂的),我还特意去百度查了一下。
然后整理了一下,大家如果有和我一样忘记了的可以看一下(概念+举例),浅显易懂。
数据库三范式
- 第一范式(1NF):第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
- 第二范式(2NF):第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一的区分。
- 第三范式(3NF):满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分;
第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系,也就是完全依赖;
第三范式确保主键列之间没有传递函数依赖关系,也就是消除传递依赖。
1. 必须保证数据库设计的合理性
- 数据库设计关系整个系统的架构,关系到后续的开发效率和运行效率
- 数据库的设计主要包含了设计表结构和表之间的联系
2. 如何是合理的数据库
- 结构合理
- 冗余较小
- 尽量避免插入删除修改异常
3. 如何才能保证数据库设计水平
- 遵循一定的规则
- 在关系型数据库中这种规则就称为范式
4. 什么是范式(NF,NormalForm)
- 范式是符合某一种设计要求的总结
- 要想设计一个结构合理的关系型数据库,必须满足一定的范式
- 各个范式是依次嵌套包含的
- 范式超高,设计质量超高,在现实设计中也越难实现
- 一般数据库设计,只要达到第三范式,即可避免异常的出现
举例说明
第一范式(概念+举例)
1. 要求
- 最基本的范式
- 数据库表每一列都是不可分割的基本数据,同一列中不能有多个值
- 简单说就是要确保每列保持原子性
- 第一范式的合理遵循需要根据系统的实际需求来定
2. 示例
第二范式(概念+举例)
1. 要求
- 第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)
- 即在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
2. 示例
在上面第一范式示例表中的数据看出,这不符合第二范式,所以进行拆分如下,
第一张主键相关为(学号、课程名称),第二张表为(学号),它们都是完全依赖的,因此符合第二范式。
第三范式(概念+举例)
1. 要求
- 确保数据表中的每一列数据都和主键直接相关,而不能间接相关
- 属性不依赖于其他非主属性(消除依赖)
2. 示例
注意看第二范式的学生表:存在系主任依赖于系名 (系名---> 系主任),所以不符合第三范式,继续进行拆分如下:
总结
我们看到,第三范式规则查找以消除没有直接依赖于第一范式和第二范式形成的表的主键的属性。
我们为没有与表的主键关联的所有信息建立了一张新表。
每张新表保存了来自源表的信息和它们所依赖的主键。
数据库设计规范化能让我们更好地适应变化,使你能够改变业务规则、需求和数据而不需要重新构造整个系统。
参考文献
三大范式:https://zhuanlan.zhihu.com/p/28528655
数据库设计三大范式:https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html#undefined