数据库设计的三大范式

数据库设计的三大范式(1NF、2NF、3NF)是为了减少数据冗余、避免数据异常(插入、更新、删除异常)而提出的规范化规则,它们是递进关系(后续范式建立在前置范式满足的基础上)。

一、第一范式(1NF:First Normal Form)

1、定义

第一范式是最基本的范式,数据表中的每一列(属性)必须是不可再分的原子值(即 “列不可拆”),且每个字段只能包含单一的值。

2、核心要求

消除 “复合属性”,确保属性的原子性。

3、不满足 1NF 的例子

表1、 联系方式 同时存储 电话 和 邮箱

学号姓名联系方式
1张三电话:123456; 邮箱:abc@gmail,com

表2、列重复,课程1课程2课程3

学号姓名课程1课程2课程3
1张三语文数学
2李四数学英语
3王五语文英语
4宋六语文数学英语

表3、每列含重复数据

学号姓名课程
1张三语文
2张三数学
3李四数学
4李四英语
5王五语文
6王五英语
7宋六语文
8宋六数学
9宋六英语

4、存在问题

  • 解析复杂:复合属性查询时需拆分(如表1中单独获取 邮箱

  • 数据冗余:新增操作会产生大量无效数据(如表2增加新课程,就需要在增加一列,导致大量无效数据)

  • 更新复杂:更新数据时需要更新所有相关内容(如表1更新 电话,还需要带上 邮箱、表3更新宋六 姓名,需要更新所有数据行)

5、满足 1NF 的修正

联系方式 拆分为 电话 和 邮箱 两个原子列:

学号姓名电话邮箱
1张三123456abc@gmail.com

二、第二范式(2NF:Second Normal Form)

1、定义

在满足 1NF 的基础上,数据表中所有非主属性(非主键的列)必须完全依赖于主键,而非仅依赖主键的一部分(主要针对联合主键而言)。简而言之就是:一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

2、核心要求

消除 “部分依赖”(非主属性仅依赖复合主键的某一部分)。

3、关键概念

  • 主键:唯一标识记录的列(可能是单一列,也可能是多列组合的 “复合主键”)。

  • 完全依赖:非主属性必须依赖于主键的所有字段(若主键是复合的,缺一不可)。

  • 部分依赖:非主属性仅依赖复合主键中的某一个或几个字段(而非全部)。

4、不满足 2NF 的例子

表1、订单明细表

订单 ID商品 ID订单日期商品名称数量单价
001p12025-10-01面包110
001p22025-10-01牛奶26
002p12025-10-02面包220

订单 ID 与 商品 ID 组成联合主键,订单 ID 商品 ID订单日期 是一一对应的,商品名称商品ID 是一一对应的,违反了第二范式。

非主属性 订单日期 仅依赖 订单 ID,与 商品 ID 无关,为部分依赖。

非主属性 商品名称单价 仅依赖 商品 ID、与 订单 ID 无关,为部分依赖。

5、存在问题

  • 数据冗余订单日期 随同一订单的每个商品重复存储,如 001 的订单日期在两条记录中重复,商品名称、单价 随同一商品的每个订单重复存储。

  • 插入异常:若新增一个订单(如 003),但尚未添加商品(无商品 ID),因主键不完整(缺少商品 ID),无法插入订单信息(如订单日期)。

  • 更新异常:若 001 的订单日期改为 2025-10-02,需修改该订单下所有商品的记录,否则部分记录日期错误,易遗漏。

  • 删除异常:若删除 001 的所有商品记录(如 p1 和 p2),订单 001 的日期信息也会被同时删除,导致订单历史丢失。

6、满足 2NF 的修正

拆分为三张表:

  • 订单表(主键:订单 ID):订单 ID、订单日期。

    订单 ID订单日期
    0012025-10-01
    0012025-10-01
    0022025-10-02
  • 商品表(主键:商品 ID):商品 ID、商品名称、单价。

    商品 ID商品名称单价
    p1面包10
    p2牛奶6
    p1面包20
  • 订单明细表(主键:订单 ID + 商品 ID):订单 ID、商品 ID、数量。

    订单 ID商品 ID数量
    001p11
    001p22
    002p12

三、第三范式(3NF:Third Normal Form)

1、定义

在满足 2NF 的基础上,数据表中所有非主属性不依赖于其他非主属性,都和主键直接相关,即非主属性之间不能存在依赖关系,消除 “传递依赖”。

2、核心要求

非主属性只能直接依赖于主键,不能通过其他非主属性间接依赖于主键(即不允许 A 依赖主键,B 依赖 A)。

3、不满足 3NF 的例子

表1、学生信息表

学号姓名班级班主任
001张三一班王老师
002李四一班王老师
003王五二班赵老师

主键是 学号。非主属性 班级 依赖于 学号,符合2NF,但是非主属性 班主任 依赖于 班级,而非直接依赖于 学号,及 班主任班级学号 存在依赖传递,不符合3NF。

5、存在问题

  • 数据冗余班级 和 班主任 随同学生重复存储(如 一班王老师 在两条记录中重复)。

  • 插入异常:若新增一个 班级(三班、尚未有学生),因缺少 学号(主键),无法插入 班级 和 班主任 的信息。

  • 更新异常:若将 一班班主任 更换为 宋老师,需修改所有一班学生的 班主任 字段,易遗漏。

  • 删除异常:若删除 一班 的所有学生记录,一班王老师 的信息也会被删除,导致信息丢失。

6、满足 3NF 的修正

拆分表以消除传递依赖:

  • 学生表(主键:学号):学号、姓名、班级。

    学号姓名班级
    001张三一班
    002李四一班
    003王五二班
  • 班级表(主键:班级):班级、班主任。

    班级班主任
    一班王老师
    二班赵老师

四、总结

三大范式的核心目标是通过消除数据冗余(重复存储),避免插入 / 更新 / 删除异常。实际设计中需平衡规范化与查询效率(过度规范化可能导致多表关联查询复杂),但基础的三大范式是数据库设计的重要原则。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

siriuuus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值