Panda
发布于 2025-04-14 / 7 阅读
0
0

数据库三范式

第一范式(1NF)​​

​定义​​:数据库表中的每一列都是​​不可分割的原子值​​,即同一列中不能包含多个值或重复属性。
​核心要求​​:

  • 每一列都是单一数据项,例如电话号码字段不能存储多个号码(需拆分为单独记录)。

​示例​​:

  • ​原始表(违反1NF)​​:

学生ID

姓名

选课

1

张三

语文, 数学, 英语

2

李四

化学

问题​​:【选课】列包含多个值,违反了原子性。也就是选课列的值是可以拆分的:数学, 英语, 物理可以拆分成【数学】、【英语】、【物理】

  • ​修正后(满足1NF)​​:

效果​​:拆分多值字段为独立记录,确保原子性。

学生ID

姓名

选课ID

1

张三

语文

1

张三

数学

1

张三

英语

2

李四

化学


​​第二范式(2NF)​​

​定义​​:在满足1NF的基础上,​​非主属性完全依赖于主键​​,而非主键的一部分(针对复合主键)。
​核心要求​​:

消除部分依赖,例如订单详情表中商品名称仅依赖【商品ID】,而非主键【订单ID+商品ID】。

​示例​​:

  • ​原始表(违反2NF)​​:

问题​​:【商品名称】仅依赖商品ID(部分依赖主键)

订单ID

商品ID

商品名称

数量

1001

A01

苹果

10

1001

A02

橙子

5

  • ​修正后(满足2NF)​​:

订单详情表​​:

订单ID

商品ID

数量

1001

A01

10

1001

A02

5

商品表​​:

商品ID

商品名称

A01

苹果

A02

橙子

修改后,商品属性信息单独成表,订单表只保留商品id。这样做的目的是减少冗余。


​​第三范式(3NF)​​

​定义​​:在满足2NF的基础上,​​非主属性不传递依赖于主键​​,即非主键字段之间无依赖关系。
​核心要求​​:

消除传递依赖,例如员工表中部门名称通过部门ID间接依赖员工ID。

​示例​​:

  • ​原始表(违反3NF)​​:

问题​​:部门名称通过部门ID传递依赖员工ID。

员工ID

姓名

部门ID

部门名称

E01

王五

D01

销售部

E02

赵六

D02

技术部

  • ​修正后(满足3NF)​​:

效果​​:消除传递依赖,数据一致性更高
​员工表​​:

员工ID

姓名

部门ID

E01

王五

D01

E02

赵六

D02

部门表:

部门ID

部门名称

D01

销售部

D02

技术部


​​总结​​

范式

核心目标

好处

适用场景

1NF

确保字段原子性

使数据结构清晰,每列数据都不可再分,便于数据的存储和操作

所有关系型数据库

2NF

消除部分依赖

减少数据冗余,避免数据的不一致性。

高频更新、数据一致性要求高的场景

3NF

消除传递依赖

减少数据冗余,提高数据的一致性和可维护性。

复杂查询、避免冗余更新

​注意​​:实际开发中,过度规范化可能影响性能,需根据业务需求灵。


评论