Second Normal Form(2NF)

版权声明:本文为博主原创文章,如需转载,请注明出处。 https://blog.csdn.net/qq_37174526/article/details/84107366

什么是第二范式?

一个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_id student_id subject_id marks teacher
1 10 1 70 Java Teacher
2 10 2 75 C++ Teacher
3 11 1 80 Java 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_id subject_name teacher
1 Java Java Teacher
2 C++ C++ Teacher
3 Php Php Teacher
score_id student_id subject_id marks
1 10 1 70
2 10 2 75
3 11 1 80

so easy。

猜你喜欢

转载自blog.csdn.net/qq_37174526/article/details/84107366