第一范式
定义
定义:字段不可再分
举例:
- 我们要存储体检者的双眼视力
- 那么应该存为左眼视力和右眼视力两个字段
- 即user表里面应该有left_eye和right_eye
- 而不能把他们存放在一个字段
第一范式缺点
这是一个学生选课表,没有违反第一范式,但是存在如下问题:
数据冗余、创建系时插入异常、删除学生会导致系消失、学生转系时改动多处。
比如:
把高芳芳这个同学删除了,那么法学基础这门课就没有了,从数据库消失了,法律系也消失了。
如果高芳芳转系了,要改两处地方 两个法律系都要修改。
结论
第一范式是非常弱的,不够强。
第二范式
定义(不标准)
- 在1NF的基础上,要有键(键可由多个字段组成)
- 所有字段分别完全依赖于键
- 如果键是多个字段组合,则不允许部分依赖于该键
键:通过键可以找到其他的数据。
依赖关系
- 给出键,就能唯一确定字段的值
- 如 给出学号,就能唯一确定姓名,反之则不行
- 则称姓名依赖学号
不满足第二范式的地方
关键点在于:第二范式不允许部分依赖
- 上表(第一范式的表)的键为(学号,课名)
- 但存在部分依赖:姓名依赖学号
将上表改进为第二范式
- 选课表(学号,课名,分数)
- 学生表(学号,姓名,系名,系主任)
选课表有两个键:学号和课名,因为只有学号加课名 才能唯一确定分数
学生表有一个键: 学号,拿到学号就可以确定其他的所有字段
所以一个表可以有多个键,一般我们把最重要的键称为主键(main key),
选课表的主键是 学号+课名
学生表的主键是 学号
第三范式
第二范式的表有些问题:
学生表:
如果经济系的主任换了,就要修改两个地方。那如果有一百个学生,就要改100个地方。
如果把李小明和张莉莉删了,那么经济系就不存在了
定义
- 一个表里不能有两层依赖
上面的表:
第一层依赖:系名依赖于学号,系主任依赖于学号
第二层依赖:系主任依赖于系名。 (给出系名,就能确定系主任)
所以系主任又间接依赖于学号
- 简单来说:
给出学号,就能确定系名:系名依赖于学号
给出系名,就能确定系主任:系主任依赖于系名
所以,系主任间接依赖于学号
但是第三范式不允许间接依赖(两层依赖)
解决办法
- 把系名和系主任单独建表
倒数第二个可以忽略,因为重复了
总结
- 第一范式
属性不可分割
- 第二范式
字段完全依赖于键,不准部分依赖
- 第三范式
字段没有间接依赖于键
- BC范式
BC是一个人的名字
键中的属性也不存在间接依赖(就是一个表里有多个键,键与键之间 也不能存在依赖)