数据库范式(三范式设计)

数据库第一范式原子性:表中每一列都不可以再分割成更小的列
数据库第二范式不产生局部依赖
每张表只描述一件事情
数据库第三范式表中每列都直接依赖于主键,而不是通过其它列间接依赖于主键

1 数据库第一范式

目标

  1. 什么是数据库范式
  2. 学习第一范式的应用

什么是范式


一种规则,指导程序员创建表的规则

程序员在设计表的时候,只需要符合三大范式就可以了

有哪些范式


满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了

满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常

范式特点


原子性:表中每一列都不可以再分割成更小的列

如果一列中包含的数据还可以再拆分,不符合第一范式

案例


班级表

学号姓名班级
1000张三一年级3班
1001李四一年级2班
2001王五二年级1班

解决方案

将班级列拆分成为年纪列和班号列两个字段

学号姓名年级班号
1000张三一年级3

小结

什么是第一范式?

原子性,每一列不可以继续拆分

2 数据库第二范式

目标

什么是第二范式

概念


在满足第一范式的基础上,有更多的要求,才是第二范式。特点是表中每一列都必须完全依赖于主键,而不是局部依赖。

如果主键是复合主键,即有多列做为主键时,表中部分列只依赖主键的一部分,则不符合第二范式。

范式特点

  1. 不产生局部依赖
  2. 每张表只描述一件事情

案例


学生课程表,主键是联合主键:学生id + 课程id

学生id学生姓名学生年龄课程id课程名字课程周期考试成绩
stu001张三22course01语文16周80
stu001张三21course02数学14周90
stu002李四19course01语文16周78
stu003王五20course03英语18周99

解决方案

学生表,主键是学生id

学生id学生姓名学生年龄
stu001张三22

课程表,主键是课程id

课程id课程名字课程周期
course01语文16周

考试成绩表,主键是学生id和课程id

学生id课程id考试成绩
stu001course0180
stu001course0290

小结

第二范式特点?

  1. 不产生局部依赖
  2. 每张表只描述一件事情

3 数据库第三范式

目标

什么是第三范式

范式特点


在满足第二范式的基础上,有更多的要求。 表中每列都直接依赖于主键,而不是通过其它列间接依赖于主键

依赖关系


所谓传递依赖,指的是如果存在"A → B → C"的决定关系,则C传递依赖于A

满足第三范式的数据库表应该不存在如下依赖关系:主键列 → 非主键列X → 非主键列Y

案例


学生信息表 ,主键是学号

学号姓名年龄所在学院学院地点
1000张三20传智专修学院江苏
2000李四19广州美术学院广州
1001王五21传智专修学院江苏
2001赵六20广州美术学院广州
2002小七18广州美术学院广州

存在的传递关系:学号 --> 所在学院 --> 学院地点

当存在大数据量时,会造成数据冗余

解决方案


学生表

学号姓名年龄所在学院ID
1000张三20001

学院表

学院ID学院名字学院地点
001传智专修学院江苏

注:表使用的范式越高级,被拆分的表就越多

​ 如果性能与范式有冲突,优先考虑性能

小结

第三范式特点?

不产生传递依赖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值