(依赖 就是 关系)

第一范式

定义

定义:字段不可再分

举例:

  • 我们要存储体检者的双眼视力
  • 那么应该存为左眼视力和右眼视力两个字段
  • 即user表里面应该有left_eye和right_eye
  • 而不能把他们存放在一个字段

第一范式缺点

image.png
这是一个学生选课表,没有违反第一范式,但是存在如下问题:
数据冗余、创建系时插入异常、删除学生会导致系消失、学生转系时改动多处。

比如:
把高芳芳这个同学删除了,那么法学基础这门课就没有了,从数据库消失了,法律系也消失了。
如果高芳芳转系了,要改两处地方 两个法律系都要修改。

结论

第一范式是非常弱的,不够强。

第二范式

定义(不标准)

  • 在1NF的基础上,要有键(键可由多个字段组成)
  • 所有字段分别完全依赖于键
  • 如果键是多个字段组合,则不允许部分依赖于该键

键:通过键可以找到其他的数据。

依赖关系

  • 给出键,就能唯一确定字段的值
  • 如 给出学号,就能唯一确定姓名,反之则不行
  • 则称姓名依赖学号

不满足第二范式的地方

关键点在于:第二范式不允许部分依赖

  • 上表(第一范式的表)的键为(学号,课名)
  • 但存在部分依赖:姓名依赖学号

将上表改进为第二范式

  • 选课表(学号,课名,分数)
  • 学生表(学号,姓名,系名,系主任)

image.png
选课表有两个键:学号和课名,因为只有学号加课名 才能唯一确定分数

学生表有一个键: 学号,拿到学号就可以确定其他的所有字段

所以一个表可以有多个键,一般我们把最重要的键称为主键(main key),
选课表的主键是 学号+课名
学生表的主键是 学号

第三范式

第二范式的表有些问题:
学生表:
如果经济系的主任换了,就要修改两个地方。那如果有一百个学生,就要改100个地方。
如果把李小明和张莉莉删了,那么经济系就不存在了

第三范式可以解决上面的问题

定义

  • 一个表里不能有两层依赖

上面的表:
第一层依赖:系名依赖于学号,系主任依赖于学号
第二层依赖:系主任依赖于系名。 (给出系名,就能确定系主任)
所以系主任又间接依赖于学号

  • 简单来说:

给出学号,就能确定系名:系名依赖于学号
给出系名,就能确定系主任:系主任依赖于系名
所以,系主任间接依赖于学号

但是第三范式不允许间接依赖(两层依赖)

解决办法

  • 把系名和系主任单独建表

image.png
倒数第二个可以忽略,因为重复了

总结

  • 第一范式

属性不可分割

  • 第二范式

字段完全依赖于键,不准部分依赖

  • 第三范式

字段没有间接依赖于键

  • BC范式

BC是一个人的名字
键中的属性也不存在间接依赖(就是一个表里有多个键,键与键之间 也不能存在依赖)