在上学的时候,数据库之中就讲过数据库范式,现在突然想复习下,就上网查了下发现还是自己亲自理一遍比较清晰
先引用百度百科中的一段话:
关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
好家伙,竟然一共有6种范式- -汗,以前只知道第一第二第三范式,好吧,貌似一二三也足够解决问题了,那也就从一二三开始吧:
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
从上面这句话可以看出只要是能存进关系型数据库的关系都算是满足第一范式,比方说有个字段是地址,网上很多人说这就不满足数据库第一范式,我觉得这是曲解了第一范式的原意,那究竟是什么样的情况下会违反这神奇的第一范式呢?
id |
name |
address |
|
1 |
Jim |
上海市虹口区XX号 |
|
2 |
Hanson |
北京市 |
朝阳区XX号 |
能把以上的表存入关系型数据库中吗?显然不行,所以第一范式是防范以上情况的
完全依赖于主键 [消除非主属性对主码的部分函数依赖]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键。
从上面可以看出来如果你的表如果只有一个主键的话,那就一定满足第二范式,因为不存在部分函数依赖的限制
假设有如下的实体表:
此中DepartmentDescription字段只是依赖与DepartmentName字段,跟EmployeeId字段没啥关系,所以违反了第二范式,那么怎么改呢?
不依赖于其它非主属性[消除传递依赖]
满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其它非主属性。
在上面的Employee表中还有JobDescription依赖于Job字段,所以不满足第三范式,应作如下改变:
好了 数据库三大范式大功告成。至于剩下的第四第五第六那都是浮云……
说一下,范式的好处还是减少数据冗余,并使结构更加清晰,以至于后期维护起来很容易,这我感觉是最重要的,因为如果你的数据库设计得很烂的话,一些轻微的改动都没法完成或付出很大的代价,那是很不值得的
至于到底要采用哪种范式,我觉得还是得看业务需求,如果比较严谨的系统,对数据要求比较高,那么相应的提高范式的等级,但是如果是一些小系统,其实第二范式就可以了,没必要非要追求高范式,因为企业还是得考虑成本等等因素,特别是如上面例子中仅仅是有一个字段传递依赖,在不重要的情况下完全可以忽略。