一直对数据库原理的各种概念不是很清楚,最近正好做题看到三大范式这块,看了看大家的总结,于是自己也出一版自己对三大范式的理解:
1.先说说为什么出现三大范式:
一句话—为了避免数据冗余;
2.第一范式:
存在非主属性对码的部分依赖关系 R(A,B,C) AB是码 C是非主属性 B-->C,B决定C,C部分依赖于B;
简述就是:主属性(存在主键)不为空且不重复,不可再分(存在非主属性对主属性的部分依赖)
例如:(借用人家的例子)
StudyNo | Name | Sex | Contact
20040101 john Male email:kkkk@ee.net,phone:222456
20040201 mary Famale email:kkk@fff.net phone:123455
以上的表就不符合,第一范式:主键重复(实际中数据库不允许重复的),而且Contact字段可以再分
所以变更为正确的是
StudyNo | Name | Sex | Email | Phone
20040101 john Male kkkk@ee.net 222456
20040201 mary Famale kkk@fff.net 123455
3.第二范式
存在非主属性对码的传递性依赖 R(A,B,C) A是码 A -->B ,B-->C
简述:如果关系范式是第一范式,每个非主属性都没有对主键的部分依赖,那么此关系范式是第二范式
所以第二范式的主要任务就是
满足第一范式的前提下,消除部分函数依赖。
StudyNo | Name | Sex | Email | Phone | ClassNo | ClassAddress
01 john Male kkkk@ee.net 222456 200401 A楼2
01 mary Famale kkk@fff.net 123455 200402 A楼3
这个表完全满足于第一范式,
主键由StudyNo和ClassNo组成,这样才能定位到指定行
但是,ClassAddress部分依赖于关键字(ClassNo-〉ClassAddress),
所以要变为两个表
表一
StudyNo | Name | Sex | Email | Phone | ClassNo
01 john Male kkkk@ee.net 222456 200401
01 mary Famale kkk@fff.net 123455 200402
表二
ClassNo | ClassAddress
200401 A楼2
200402 A楼3
第三范式
简述:没有非主属性对主键的传递依赖和部分依赖属性。
StudyNo | Name | Sex | Email | bounsLevel | bouns
20040101 john Male kkkk@ee.net 优秀 $1000
20040201 mary Famale kkk@fff.net 良 $600
这个完全满足了第二范式,但是bounsLevel和bouns存在传递依赖
更改为:
StudyNo | Name | Sex | Email | bouunsNo
20040101 john Male kkkk@ee.net 1
20040201 mary Famale kkk@fff.net 2
bounsNo | bounsLevel | bouns
1 优秀 $1000
2 良 $600
再次总结:
1.第一范式:有主键,主键不为空、不重复,列不可再分;
2.第二范式:在第一范式的基础上,非主键的属性对主键没有部分依赖;
3.第三范式:没有非主属性对主键的传递依赖(例如C依赖于B,B又依赖于主键A)和部分依赖属性;
参考: