数据库的三个范式

总结:

  • 1NF 列的原子性
  • 2NF 包含1NF,且非主键列依赖主键所有内容
  • 3NF 包含 2NF,且非主键列直接依赖主键,不能间接依赖

第一范式(1NF)

强调列的原子性,即列不能够再分成其他几列。

考虑有这样一个表:【联系人】(姓名、性别、电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构就不符合1NF,应把电话列拆分成家庭电话和公司电话。

第二范式(2NF)

首先是1NF,另外还有两部分内容。
1. 一个表必须有一个主键。
2. 不在主键里的列必须依赖主键的所有内容,而不能只依赖主键的一部分。
例如有一个【选课系统表】:

学号学生课程教材上课地点
001张三高等数学高等数学(第七版)701
001张三大学英语大学英语(第一版)702
001张三大学物理大学物理第二版703
002李四高等数学高等数学(第七版)704

只考虑同一门课只用一本教材的情况

主键为【学号】【学生】【课程】,上课地点完全依赖于【学号】【学生】【课程】,但【教材】列中的只依赖于课程,所以不符合2NF。易产生数据冗余。
应把数据库拆分成【选课系统】(学号、学生、课程)和【课程教材】(课程、教材)。来消除教材多次重复的情况。

表1

学号学生课程上课地点
001张三高等数学701
001张三大学英语702
001张三大学物理703
002李四高等数学704

表2

课程教材
高等数学高等数学(第七版)
大学英语大学英语(第一版)
大学物理大学物理(第二版)

不符合 2NF 的情况只会出现在主键由超过一个字段构成的表中,因为对单单主键不存在部分依赖问题。

第三范式(3NF)

首先是2NF。另外非主键必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键A依赖于非主键B,非主键B依赖于主键的情况。

订单号购买日期顾客ID顾客姓名消费地点顾客住址
00001201704091001张三深圳上海
00002201705011003李四广州深圳
00003201705021009王五香港北京
00004201705051003李四新加坡深圳

上述表格中,主键为订单号,其他列完全依赖于订单号,符合第二范式。但是顾客姓名和顾客住址直接依赖顾客ID(非主键列),而不是直接依赖于主键,所以不符合3NF。应把该表拆分成:

表1

订单号购买日期顾客ID消费地点
00001201704091001深圳
00002201705011003广州
00003201705051009香港
00004201705051003新加坡

表2

顾客ID顾客姓名顾客住址
1001张三上海
1003李四深圳
1009王五北京
  • 总结:第二范式和第三范式的区别在于:
    • 2NF 要求非主键列依赖于主键的所有列,而不能只依赖于主键的一部分。
    • 3NF 要求非主键列直接依赖于主键列,而不是直接依赖于非主键列。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值