数据库三大范式
第一范式 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。
可能产生的问题:
- 数据冗余:记录相同学院的学生都必须重复记录他们的学院院长
- 更新异常:更新某学院院长时需要所有属于该院的学生的相关记录都更新。