Second Normal Form(2NF)

Posted by 刘知安 on 2018-11-15
文章目录
  1. 什么是第二范式?
  2. 什么是dependency(依赖)?
  3. 什么是 partial dependency(部分依赖)?
  4. 怎么消除部分依赖?

什么是第二范式?

一个relation如果满足第二范式,那么它必定:

  • 满足第一范式
  • 不存在partial dependency(部分依赖)

那什么又是partial dependency呢?别急,我们慢慢道来。


什么是dependency(依赖)?

假设我们有一张Student表,该表包含以下字段student_id, name, reg_no(注册号), branch(专业) 和address(家庭住址)。我们都知道,student_id可以唯一地决定一条学生记录,那么student_id可以做主键。

student_id name reg_no branch address
10 Akon 07-WY CSE Kerala
10 Akon 08-WY IT Gujarat

那么,如果我已经知道了student_id,那我也就知道了他的branch、name等等信息,换句说就是student_id 决定了branch,也决定了name,像这种谁某一列(或多列)决定了其它列(或多列),我们就成之为依赖,也有的地方称为functional dependency(函数依赖)。


什么是 partial dependency(部分依赖)?

假设我们现在有个表Subject,包含subject_id,subject_name
subject_id|subject_name
:—:|:—:
1|Java
2|C++
3|Python
又有一张新的Score表,包含score_id,student_id,subject_id,marks,marks字段

score_idstudent_idsubject_idmarksteacher
110170Java Teacher
210275C++ Teacher
311180Java Teacher

对于Score表来说,student_id + subject_id是该表的candidate Key(候选码),我们就选这个候选码作为主码。

好的,那么看一下teacher这个字段,它的依赖关系应该是,一个课程决定了该课程的老师是谁,也就是说,存在subject_id --> teacherfunctional dependency,但是这个函数依赖的决定因素subject_id只是主键的一部分,并且和主键中的student_id没什么关系,像这样的,我们依赖称之为partial dependency部分依赖。

怎么消除部分依赖?

很简单,只要把存在部分依赖的那一列元素单独拉出来就OK。

在上面的Score表中,我们把teacher列拉出来,刚好它是依赖于subject_id的嘛,所以,就把teacher列拉到Score表中去。操作之后就像下面这样:

subject_idsubject_nameteacher
1JavaJava Teacher
2C++C++ Teacher
3PhpPhp Teacher
score_idstudent_idsubject_idmarks
110170
210275
311180

so easy。