Qiuck Ref

  • 1NF
    • 原子性
  • 2NF
    • 部分依赖
  • 3NF
    • 传递依赖
  • BCNF
    • 部分与传递依赖
  • 4NF
    • 多值依赖

第一范式

需要满足原子性

比如说下面这个:

不满足的情况

学生编号学生姓名选课列表
1小明语文, 数学, 英语
2小红数学, 物理
3小李英语, 历史

修改使满足范式

学生表(Student):

学生编号学生姓名
1小明
2小红
3小李

选课表(CourseSelection):

学生编号选课名称
1语文
1数学
1英语
2数学
2物理
3英语
3历史

第二范式

将耦合的数据拆开,打散。

非主键属性完全依赖于候选键(Candidate Key)

第二范式判断方法

  1. 找到所有候选键
  2. 找出所有主属性、非主属性
  3. 判断非主属性对候选键的依赖

第三范式

第二范式的基础上,要求非主键属性不传递依赖于候选键。就是需要消除传递依赖。 优点:消除了CRUD异常数据冗余

BCNF

消除主属性对主键的部分与传递依赖

BCNF 例子

学生表(Student):

学生编号学生姓名课程编号课程名称教师编号教师姓名
1小明1数学1张老师
1小明2英语2王老师
2小红1数学1张老师
3小李2英语3李老师

在上述设计中,存在两个候选键:{学生编号, 课程编号}和{学生编号, 教师编号}。而学生表中的非主属性 “课程名称” 只依赖于 “课程编号”,并未依赖于所有的候选键。这违反了BCNF的要求。

为了符合BCNF,我们需要将非主属性 “课程名称” 从学生表中移动到课程表中,并通过关联表建立它们之间的关系。重新设计后的数据库表可能如下所示:

简单来说就是 课程名称教师姓名多余

学生表(Student):

学生编号学生姓名课程编号教师编号
1小明11
1小明22
2小红11
3小李23

课程表(Course):

课程编号课程名称
1数学
2英语

教师表(Teacher):

教师编号教师姓名
1张老师
2王老师
3李老师

4NF

消除多值依赖,就是要达到一对一的关系。