第一范式 1NF

属性/字段有原子性,不可再分。

例如表:字段1--学号 | 字段2 --姓名(字段2.1--姓,字段2.2--名,字段2.3--曾用名) | 字段3--性别

这样就不符合第一范式

第二范式 2NF

在满足1NF的基础上。要求所有属性都必须完全依赖于主键。

例如表:学号 | 姓名 | 课程号 | 学分

这里课程号和学分与学号没有依赖关系,主键和属性不相关,所以不符合2NF。

可能产生的问题:

  • 数据冗余:例如一个学生选了多门课,本只需要记录学生id,课程id即可,但是此时要多次姓名和课程学分。
  • 删除异常:例如删除学生的选课记录,则学生信息和课程信息都删了
  • 插入异常:一个没选课的学生无法被记录在表中
  • 更新异常:调整课程的学分,则所有选了这门课的记录都要修改

2NF还要求属性完全依赖于主键,而不是部分依赖。这是对于联合主键而言的。 例如订单表:订单id | 商品id | 商品信息 因为一个订单可能有多个商品,因此把(订单id,商品id)作为联合主键。而此时商品信息和主键并不是完全依赖关系,只是部分依赖关系。因此不符合2NF。

第三范式 3NF

在2NF基础上,要求所有属性必须直接依赖与主键,非主键属性之间不能存在传递依赖。

例如表:学生id | 学院id | 学院院长

上表记录了学生所在学院的关系,学生id是主键。这是符合2NF的,因为学生id可以完全决定学院id和学院院长。但是学院院长也依赖于学院id。所以这不属于3NF。

可能产生的问题:

  • 数据冗余:记录相同学院的学生都必须重复记录他们的学院院长
  • 更新异常:更新某学院院长时需要所有属于该院的学生的相关记录都更新。