面试中经常被问到,哎看你简历上数据库用的比较多,那你给我说说三大范式是什么?我就懵逼了,虽说我自己思考过如何根据需求设计一个或者几个表之间的依赖,但是对于这样系统专业的学习还是没有深入了解过的,今天,我决定较为简单得了解学习一下,方便自己三月份或者四月份的跳槽;
那么首先我们来了解一下,什么是三大范式?
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
这段是我从其他地方摘抄的,会比较难以理解,那么我就根据我看了那么多文章后对这段话做一个属于我自己的理解总结:
一、第一范式:表中每一列都是不可分割的,也就是说确保每一列的原子性;
这个怎么理解呢?举个栗子:
譬如我有这么一张表:
id 地址
1 中国江西
2 中国深圳
那么其实这个表的地址这个字段是可以拆分的,拆分成:
id 国家 省份
1 中国 江西
2 中国 深圳
这就符合了第一范式,保证了每一列或者说每一个字段都是原子的,不可分割的;
这样做有什么好处呢?它可以满足一些比如要区分国家省份的需求,还可以减少在查询的时候的冗余(我可以专门查国家或者省份)
二、第二范式:一条数据只做一件事,或者专业点说,非主键字段必须依赖主键字段,即是一个表只做一个事情
这个我们怎么理解呢?就比如我有如下的一张表:
订单编号 房间号 联系人编号 联系人 联系人电话 身份证号
这里会有一个问题,我可以一个人定多个房间,那么我就会产生多条数据,并且多条数据中的联系人的信息都是一样的,这里表现为一对多关系,这里我们就可以把联系人后的三个字段单独为一张表,用中间表进行一对多,减少冗余;
当然你也可以这么理解:联系人电话以及身份证号并不依赖于主键订单编号,它们是依赖于联系人编号的,然而联系人编号和订单编号没有必然关系,在这个表内做了两个事情,所以就可以分为两张表:
订单编号 房间号
联系人编号 联系人 联系人电话 身份证号
三、第三范式:字段和主键不能有传递依赖关系
这个我们这样理解:
有如下表:
学号 姓名 院校编号 院校地址
这个表的问题在于,院校地址和学号是没有关系的,他必须依赖院校编号,就存在了层次依赖的情况,这种时候我们应该分开两个表,一个专门存放学生信息,另外一个表存放院校信息;
以上就是好我所理解的三大范式,欢迎大神批评指正。