1NF,2NF,3NF,BCNF

用最直白最人类的话来解释1NF,2NF,3NF,BCNF.

第一范式

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式1NF中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列  。(摘自百度百科)

解释:1NF是指数据库每一列都是不能再拆分的,比如说表示性别,姓名等,而学生成绩则是可以再拆分的,比如说语文成绩、数学成绩、英语成绩。如表一,当数据库列为学号、姓名、语文成绩、数学成绩、英语成绩、性别这样不能再次拆分的列,则达到1NF。家里的每个人都是独立的,不可再分的。

表一
学号姓名成绩性别
语文数学英语
001张三909593

第二范式

第二范式(Second Normal Form,2nd NF)是指每个表必须有主关键字(Primary key),其他数据元素与主关键字一一对应。通常称这种关系为函数依赖(Functional dependence)关系,即表中其他数据元素都依赖于主关键字,或称该数据元素惟一地被主关键字所标识。第二范式是数据库规范化中所使用的一种正规形式。它的规则是要求数据表里的所有非主属性都要和该数据表的主键有完全依赖关系;如果有哪些非主属性只和主键的一部份有关的话,它就不符合第二范式。同时可以得出:如果一个数据表的主键只有单一一个字段的话,它就一定符合第二范式(前提是该数据表符合第一范式)。(摘自百度百科)

解释:这句话很好理解,首先,2NF肯定是满足1NF的。2NF就是表里的所有列和表的全部主键都有关系,如果只有一个主键,且符合第一范式,则肯定是第二范式;如果有两个以上的主键,某些列只和其中一些主键有关系,则不符合第二范式要求。如下表:学号和课程作为主键,可以得到成绩(学号,课程)=>(成绩),学号为主键,可以推出姓名(学号)=>(姓名);这里的学号和课程为主键,姓名只和学号有关,不符合第二范式要求。姓名是学号(你)自己的,成绩(儿子)是学号(你)和课程(你老婆)一起造的, 这两个就不应该放一起。

表二
学号姓名课程成绩
001张三语文90
001张三数学95

正确做法应该是这样,属于你自己的私人财产,放一张表,你和你老婆的共有财产,放另一张表:

表三
学号姓名
001张三
表四
学号课程成绩
001语文90
001数学95

第三范式

第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系。也就是说,对于一个满足2nd NF 的数据结构来说,表中有可能存在某些数据元素依赖于其他非关键字数据元素的现象,必须消除。(摘自百度百科)

解释:3NF先满足2NF。然后,不存在非主属性对码的部分函数依赖和传递函数依赖。关系不能隔代,A->B,B->C,这样AC是有关系的,但就是隔代了,举个栗子,看表五,学号是主键,学号->(姓名,院系名称),院系名称->院系地址,学号和院系名称,院系地址有关系吗,有!通过学号推出院系名称,再通过院系名称推出了院系地址,所以这是符合第二范式的,但是这有点象爸爸、儿子、女儿、外孙的关系了,所以不符合第三范式

表五
学号姓名院系名称院系地址身份证号
001张三文学系A3楼1234567890

正确做法应该是这样,儿子和女儿是爸爸家,外孙则是女儿家的人,他们不应该存放在一起,那女儿和外孙要搬出去了,但是女儿始终是家里的一份子,于是乎:

表六
学号姓名院系名称身份证号
001张三文学系1234567890
表七
院系名称院系地址
文学系A3楼

BC范式

对于关系模式R,若 R为第一范式,且每个属性都部分依赖于候选键也传递依赖于候选键,那么称R是BC范式。

相对于第三范式,BC范式的要求更加严格。第三范式只是要求R为第二范式且非键属性不传递依赖于R的候选键,而BC范式则是对R的每个属性都做要求。

解释:BCNF先满足1NF。然后,1NF 的基础上消除每个属性对于码的部分与传递函数依赖,也可以说是在3NF的基础上消除主属性对对于码的部分与传递函数依赖。不恰当的解释就是主码=候选码,看表六,每个人的学号和身份证号都是唯一的,学号可以得到身份证号,身份号也可以得到学号,候选码是学号和身份证号,而主码则是学号或身份证号,所以应该把它们分开:

表八
学号姓名院系名称
001张三文学系
表九
学号身份证号
0011234567890

候选码:可以代表整个元组的一个属性或者多个属性,根据候选码可以找到唯一对应的这个元组。候选码可以有多个,在上面的例子中,学号就是一个候选码,身份证号也是一个候选码,学号+姓名也可以是一个候选码(超码)。

主码:从候选码里面选一个,则称为主码。

主属性:如果某个属性在所有的候选码里都有出现,那么这个属性就是主属性。

非主属性:如果某个属性不包含在任意的一个候选码里,那么这个属性就是非主属性。

完全依赖:以表四举例:学号和课程可以得到成绩,但是单独学号或者单独课程都不能得到成绩,那么成绩完全依赖于学号和课程。

部分依赖:以表二举例:同样学号和课程为主属性,学号和课程可以得到姓名,学号也可以得到姓名,那么姓名就是部分依赖学号和课程。

传递依赖:看表五:从学号可以得到院系名称,院系名称可以得到院系地址,但从院系名称得不到学号,于是院系地址传递依赖于学号。

2NF是解决属性的部分依赖问题,3NF解决非主属性的传递依赖问题, BCNF则是解决了主属性的传递依赖问题。

最后,其实在真正做的时候,设置成唯一主键,尽量分开存一般都可以做到第三范式了,没必要特地追求高范式,数据库有一定的冗余可以减少数据库的多表查询,提高查询数据的速度。

最后的最后,因为不是很懂,所以是写给自己看的,也希望能得到大家的指正,谢谢。

本文参考了数据库范式那些事数据库的部分依赖,完全依赖,传递依赖以及三种范式

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值