一、函数依赖
1、完全函数依赖
假设X,Y是关系R的两个属性集合,X’是X的真子集,若存在X->Y,对于每个X’都有X’!->Y,则称Y完全函数依赖于X。
即:通过AB能得出C,但是A或B单独得不出C,那么说C完全依赖于AB。
举例:在上图中,通过学号和课程可以确定成绩,但是单用学号和课程无法确定成绩,也就是说成绩完全依赖于学号和课程
2、部分函数依赖
假设Y函数依赖于X,但不是完全函数依赖于X,则称Y部分函数依赖于X。
即:通过AB能得出C,但是只通过A也能得出C,或者只通过B也能得出C,则称C部分函数依赖于AB。
举例:在上图中,通过学号和课程可以得出姓名,而只通过学号也可以得出姓名,所以姓名部分函数依赖于学号和课程
3、传递函数依赖
假设X,Y,Z是关系R中互不相同的属性集合,存在X->Y(Y!->X),Y->Z,则称Z传递函数依赖于X。
即:通过A得出B,通过B得出C,但是C得不出A,则称C传递函数依赖于A。
举例:通过学号可得出学院,通过学院可得出院长,但是院长得不出学号,院长要依赖于学院,也就是院长传递函数依赖于学号
二、三大范式
1、第一范式(1NF)
数据库表中的每一列都是不可分割的原子数据项
上图商品列中的数据2个风扇,既包含了数量2,又包含了商品名称风扇,不是原子项,需对此列进行拆分:
2、第二范式(2NF)
在1NF的基础上,实体的属性完全函数依赖于主关键字,不能存在部分函数依赖于主关键字
上图中的主关键字是学号和课名,成绩完全函数依赖于学号和课名,但是姓名部分函数依赖于学号和课名,即通过学号就可以得出姓名,因此需对表进行拆分:
3、第三范式(3NF)
在2NF的基础上,任何非主属性不传递函数依赖于其它非主属性
在上图中,由学号可以得出学院,由学院可以得出院长,但是院长得不出学号,即存在传递函数依赖,需对表进行进一步拆分: