数据库 之 范式浅析

原创 2015年11月20日 16:18:09

简介

     数据库范式在数据库设计中的地位一直很暧昧,教科书中对于数据库范式倒是都给出了学术性的定义,但实际应用中范式的应用却不甚乐观,这篇文章会用简单的语言和一个简单的数据库DEMO将一个不符合范式的数据库一步步从第一范式实现到第四范式。 

范式的目标

     应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:

     1.减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)

     2.消除异常(插入异常,更新异常,删除异常)

     3.让数据组织的更加和谐…    

      但剑是双刃的,应用数据库范式同样也会带来弊端,这会在文章后面说到。 

什么是范式

     简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准,满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf)。 

DEMO

     让我们先从一个未经范式化的表看起,表如下:

先对表做一个简单说明,employeeId是员工id,departmentName是部门名称,job代表岗位,jobDescription是岗位说明,skill是员工技能,departmentDescription是部门说明,address是员工住址

对表进行第一范式(1NF)

    如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。

    简单的说,第一范式就是每一个属性都不可再分。不符合第一范式则不能称为关系数据库。对于上表,不难看出Address是可以再分的,比如”北京市XX路XX小区XX号”,着显然不符合第一范式,对其应用第一范式则需要将此属性分解到另一个表,如下:

对表进行第二范式(2NF)

若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF

简单的说,是表中的属性必须完全依赖于全部主键,而不是部分主键.所以只有一个主键的表如果符合第一范式,那一定是第二范式。这样做的目的是进一步减少插入异常和更新异常。在上表中,departmentDescription是由主键DepartmentName所决定,但却不是由主键EmployeeID决定,所以departmentDescription只依赖于两个主键中的一个,故要departmentDescription对主键是部分依赖,对其应用第二范式如下表:

对表进行第三范式(3NF)

关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z  Y), 使得X→Y,Y→Z,成立,则称R<U,F> ∈ 3NF。

简单的说,第三范式是为了消除数据库中关键字之间的依赖关系,在上面经过第二范式化的表中,可以看出jobDescription(岗位职责)是由job(岗位)所决定,则jobDescription依赖于job,可以看出这不符合第三范式,对表进行第三范式后的关系图为:

上表中,已经不存在数据库属性互相依赖的问题,所以符合第三范式

 

对表进行BC范式(BCNF)

关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。

简单的说,bc范式是在第三范式的基础上的一种特殊情况,既每个表中只有一个候选键(在一个数据库中每行的值都不相同,则可称为候选键),在上面第三范式的noNf表中可以看出,每一个员工的email都是唯一的(难道两个人用同一个email??)则,此表不符合bc范式,对其进行bc范式化后的关系图为:

对表进行第四范式(4NF)

关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y  X),X都含有候选码,则R∈4NF。

简单的说,第四范式是消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。对于上面bc范式化的表中,对于员工的skill,两个可能的值是”C#,sql,javascript”和“C#,UML,Ruby”,可以看出,这个数据库属性存在多个值,这就可能造成数据库内容不一致的问题,比如第一个值写的是”C#”,而第二个值写的是”C#.net”,解决办法是将多值属性放入一个新表,则第四范式化后的关系图如下:

而对于skill表则可能的值为:

 

总结

    上面对于数据库范式进行分解的过程中不难看出,应用的范式登记越高,则表越多。表多会带来很多问题

查询时要连接多个表,增加了查询的复杂度

查询时需要连接多个表,降低了数据库查询性能

而现在的情况,磁盘空间成本基本可以忽略不计,所以数据冗余所造成的问题也并不是应用数据库范式的理由。

因此,并不是应用的范式越高越好,要看实际情况而定。第三范式已经很大程度上减少了数据冗余,并且减少了造成插入异常,更新异常,和删除异常了。我个人观点认为,大多数情况应用到第三范式已经足够,在一定情况下第二范式也是可以的。

数据库四大范式整理

引言  数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟...
  • hyqsong
  • hyqsong
  • 2016年08月18日 21:43
  • 2694

数据库的六种范式

设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则 就是范式。关系数据库中的关系必须满足一定的要求,即满足不同...
  • c5153000
  • c5153000
  • 2011年03月23日 20:13
  • 1220

简述数据库设计中的五大范式

数据库的五大范式具体内容如下: 第一范式:无重复列 即在一行中的每一列仅有唯一的值并且具有原子性 第二范式:任意一个字段都只依赖表中的同一字段,或者说,属性完全依赖于主键 即非主键列的活动必须完全依赖...
  • CNYYGJ
  • CNYYGJ
  • 2016年12月06日 11:10
  • 764

数据库三大范式和反范式

后一个范式都是在满足前一个范式的基础上建立的. 1NF:无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库. 如联系人表(姓名,电话),一个联系人有家庭电话和...
  • prstaxy
  • prstaxy
  • 2014年08月07日 14:04
  • 5266

“Ceph浅析”系列之四Ceph的结构

本文将从逻辑结构的角度对Ceph进行分析。 4.1    Ceph系统的层次结构         Ceph存储系统的逻辑层次结构如下图所示[1]。         自下向上,可以将Ceph系统...
  • qq_24916117
  • qq_24916117
  • 2015年12月30日 20:42
  • 542

对关系型数据库五个范式的理解

复习了一下数据库的五个范式,这里不用公式,用尽可能少的术语说说理解。 之所以使用范式,往往是设计不规范的数据库表可能造成大量的数据冗余,也可能在发生插入、删除、修改操作后出现各种各样的不合理的问题。...
  • huzhaomu945
  • huzhaomu945
  • 2016年10月15日 10:56
  • 2140

数据库的四个范式之间的区别

在创建一个数据库的过程中,必须依照一定的准则,这些准则被称为范式,从第一到第六共六个范式,一般数据库设计只要遵循第一范式,第二范式,和第三范式就足够了。满足这些规范的数据库是简洁的、结构明晰的,同时,...
  • hsd2012
  • hsd2012
  • 2016年03月30日 19:47
  • 2280

数据库三大范式最简单的解释

关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)...
  • andywuchuanlong
  • andywuchuanlong
  • 2014年05月15日 20:33
  • 4100

数据库设计三大范式应用实例剖析(讲得比较清楚)

转贴地址:http://blog.csdn.net/songkexin/archive/2007/01/18/1486289.aspx先说几句:        首先作者的劳动果实,让我对这个比较模糊到...
  • fenglibing
  • fenglibing
  • 2007年07月16日 21:03
  • 9173

数据库中各种范式有什么区别

范式是在识别数据库中的数据元素,关系,以及定义所需的表和各表中的项目这些处事工作之后的一个细化的过程。常见的范式有INF,2NF,3NF,BCNF,以及4NF。 1>  1NF。第一范式是指数据库表...
  • uniquewonderq
  • uniquewonderq
  • 2015年10月21日 17:12
  • 2430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库 之 范式浅析
举报原因:
原因补充:

(最多只允许输入30个字)