数据库三大范式(通俗易懂)

五分钟,带你理解数据库三大范式

概述

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列
第二范式(2NF):在1NF的基础上,所有非主键属性必须全部依赖主键
第三范式(3NF):在2NF的基础上,所有非主键属性必须直接依赖主键,即不能存在传递依赖

第一范式(1NF)举例

用户ID用户名性别个人信息
zhangSan张三手机号:18xxx; 职务:蓝领
wangWu王五手机号:15xxx;职务:白领

上表中,个人信息字段就不满足第一范式,还可以拆分成手机号职务,可调整如下

用户ID用户名性别手机号职务
zhangSan张三18xxx蓝领
wangWu王五15xxx白领

调整后每列不可再拆分,满足第一范式

第二范式(2NF)举例

满足1NF的前提下,所有非主键属性必须全部依赖主键

用户ID用户名性别手机号角色ID角色名称角色说明部门ID部门名称
zhangSan张三18xxxR001PM项目经理角色BM001研发部
zhangSan张三18xxxR002开发研发角色BM001研发部
zhangSan张三18xxxR003测试测试角色BM001研发部
liSi李四18xxxR002开发开发角色BM001研发部
wangWu王五15xxxR004HR人力资源角色BM002人力资源部

上表中, 由于一个用户可能有多个角色,所以要用【用户ID,角色ID】作为主键,该表存在以下依赖关系:

  • (用户名,性别,手机号,部门ID,部门名称) 依赖 用户ID
  • (角色名称,角色说明) 依赖 角色ID

虽然表中每列属性不可再分割,但是非主键属性没有全部依赖主键属性,这将存在以下问题:

  • 数据冗余:
    • 当一个角色被n个人选择,角色说明冗余了n次;
    • 当一个人拥有m个角色,用户名,性别,手机号,部门ID,部门名称字段冗余了m-1次;
  • 更新复杂:
    • 当一个角色被n个人选择,如果要调整角色说明字段,表中的多行数据要进行更新
    • 当一个人拥有m个角色,如果要更新用户手机号,表中的多行数据要进行更新
  • 删除异常
    • 当某个用户注销了,删除用户时,如果角色ID只被一个用户使用,角色信息也一并被删除了。

综上,不满足第二范式的情况一般是同张表中存在一对多的数据,此时需要复合主键,造成数据冗余,比如用户有多个角色,学生选多个课程

解决办法: 增加子表,维护数据间的关系

上述例子中,可以增加角色表,用户角色表,调整后如下

  • 用户表
用户ID用户名性别手机号部门ID部门名称
zhangSan张三18xxxBM001研发部
liSi李四18xxxBM001研发部
wangWu王五15xxxBM002人力资源部
  • 角色表
角色ID角色名称角色说明
R001PM项目经理角色
R002开发研发角色
R003测试测试角色
R004HR人力资源角色
  • 用户角色表
用户ID角色ID
zhangSanR001
zhangSanR002
zhangSanR003
liSiR001
wangWuR004

第三范式(3NF)举例

满足2NF的前提下,所有非主键属性必须直接依赖主键,即不能存在传递依赖

  • 用户表
用户ID用户名性别手机号部门ID部门名称
zhangSan张三18xxxBM001研发部
liSi李四18xxxBM001研发部
wangWu王五15xxxBM002人力资源部

接第二范式举例中调整后的用户表,上表中还存在如下依赖关系:

  • (用户名,性别,手机号,部门ID) 直接依赖 用户ID
  • (部门名称) 直接依赖 部门ID
  • 由于部门ID 依赖 用户 ID部门名称 依赖 部门ID, 所以 部门名称 间接依赖 用户ID

这将存在以下问题:

  • 数据冗余:
    • 当多个人属于同一个部门,部门名称字段冗余了多次;
  • 更新复杂:
    • 当多个人属于同一个部门,如果要更新部门名称,表中的多行数据要进行更新
  • 删除异常
    • 当上表中wangWu用户注销了,删除用户时,部门BM002信息也被删除。

不满足第三范式,一般是表中冗余了基础表(表之间的数据关系是一对一的)的非主键信息,造成部分字段冗余。

解决办法: 增加基础表,在基础表中维护部门名称等信息

上述例子中,可以增加部门表,调整后如下

  • 用户表
用户ID用户名性别手机号部门ID
zhangSan张三18xxxBM001
liSi李四18xxxBM001
wangWu王五15xxxBM002
  • 部门表
部门ID部门名称
BM001研发部
BM002人力资源部

结语

实际应用场景中,一般满足第二范式即可,没必要生搬硬套满足所有范式要求;是否要满足第三范式应根据实际业务以及性能效率方面去综合考虑。比如对一些几乎不会修改的基础表数据字段,那完全可以进行冗余,减少表关联,提高查询效率。

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值