什么是第二范式?
一个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 --> teacher
的functional 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。