一、简而言之
1、是什么?
三大范式是针对
关系型数据库
的一种数据库
设计规范
,使数据库设计符合约定的规范要求。
2、为什么要符合该规范?
为了建立
冗余较小、结构合理
的数据库。
3、三大范式内容的简单理解
(
Normal Form)
第一范式(1NF):字段(列)不可分;
第二范式(2NF):唯一性,一个表只说明一个事物;
第三范式(3NF):每
列
都与主键有直接关系,不存在传递依赖。侧重的
是
直接关系
。任何非主属性不依赖其它非主属性。
二、详细分析
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
最常见的设计范式有三种:第一范式、第二范式、第三范式。
一般来说,数据库只需满足第三范式(3NF)就行了。
1、第一范式
确保每
列
保持
原子性
,不能再分啦。第一范式是
最基本
的范式,数据库表的
每一列
都是不可分割的原子数据项才是符合第一范式的。
举例:
数据库表中有
“地址”
这个属性,本来直接将
“地址”
属性设计成一个数据库表的字段就行。但是如果系统经常会访问
“地址”
属性中的
“城市”
部分,那么就要将
“地址”
这个属性重新拆分为
省份、城市、详细地址
等多个部分进行存储。这样在对地址中某一部分操作的时候将非常方便,提高了数据库的性能。这样设计才算满足了数据库的第一范式。
如下表所示:
2、第二范式
第二范式需要确保数据库表中的
每一列
都和
主键
相关,而不能只与主键的某一部分相关(主要针对联合主键而言),即在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
在第一范式的基础上,非码属性必须完全依赖于候选码(在第一范式基础上消除非主属性对主码的部分函数依赖)。
举例:
要设计一个
订单信息表
,因为订单中可能会有多种商品,所以要将
订单编号
和
商品编号
作为数据库表的
联合主键
,如下表所示:订单信息表
![]()
这样就产生一个问题:这个表中是以
订单编号
和
商品编号
作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关,违反了第二范式的设计原则。
改进:
把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中。如下:
![]()
这样设计才符合第二范式,减小了数据库的冗余。
3、第三范式
确保
每列
都和
主键列直接相关
,
而不是间接相关,在第二范式的基础上消除传递依赖。
举例:
在设计一个
订单数据表
的时候,可以将
客户编号
作为一个外键和
订单表
建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表:
![]()
这样在查询
订单信息
的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。
本文参考:
https://blog.csdn.net/weixin_41181778/article/details/103758279