函数依赖
X->Y,X决定Y,Y函数依赖于X,y=f(x)。就看成一个函数,如果一个X对应一个Y,那就是X->Y;如果两个X相同,但是Y不同就不是X->Y。
比如:学号和姓名是依赖关系,学号可以决定姓名,姓名依赖于学号
年龄和专业不是依赖关系,两个人都是18岁,一个计算机专业,一个物理专业。
平凡/非平凡函数依赖
非平凡函数依赖:(学号,课程)->课程成绩
平凡函数依赖:(学号,课程)->学号、(学号、课程)->课程
主要讨论的是非平凡的函数依赖。
部分/完全函数依赖
现有三个属性:学号、课程号、课程得分
学号+课程号才能决定课程得分。(单有学号,一个学生选多个课,不知道是那个课的成绩、单有课程号,选这个课的有很多学生,不知道是哪个学生的成绩)
(学号,课程)->课程得分。
从(学号,课程)中任意取出真子集:学号、课程都不能决定课程得分。这种情况就是完全依赖(课程得分完全函数依赖于(学号,课程))。【完全依赖是指不能仅依赖候选键一部分的属性】
假如数据集比较特殊,从(学号,课程)中取出的某一个真子集,比如学号可以决定课程得分了。那这种情况就是部分依赖(课程得分部分函数依赖于(学号,课程))。
传递依赖
A->B->C 可得出A->C
数据库范式
1NF:保证了原子性
2NF:去除非主属性对主属性的部分依赖
3NF:去除非主属性对主属性的传递依赖
BCNF:消除主属性对主键的部分依赖和传递依赖
4NF:消除表中的多值依赖
解决方法:1NF通过拆分列解决;其他通过拆分表解决(拆表解决依赖性)
1NF
第一范式符合数据表的原子性。每一个属性都不可再分。
2NF
在1NF的基础上,表中的非主属性必须完全依赖于主属性。
3NF
表中所有数据元素不但要能唯一的被主关键字标识,他们之间还必须相互独立,不存在其他的函数关系。即在2NF的基础上消除了传递函数依赖。符合第三范式的数据表,消除了数据冗余、更新异常、插入异常和删除异常。
BCNF(3.5NF)
消除主属性对主键的部分与传递依赖。
4NF
消除表中的多值依赖。