http://jacki6.iteye.com/blog/774866

数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入( insert )、删除( delete )和更新( update )操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。

范式说明

1.1 第一范式( 1NF )无重复的列

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

说明:在任何一个关系数据库中,第一范式( 1NF )是对关系模式的基本要求,不满足第一范式( 1NF )的数据库就不是关系数据库。

例如,如下的数据库表是符合第一范式的:

字段 1

字段 2

字段 3

字段 4

而这样的数据库表是不符合第一范式的:

字段 1

字段 2

字段 3

字段 4

字段 3.1

字段 3.2

         

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。很显然,在当前的任何关系数据库管理系统( DBMS )中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS 不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的 DBMS 中设计出不符合第一范式的数据库都是不可能的。

1.2 第二范式( 2NF )属性完全依赖于主键 [ 消除部分子函数依赖 ]

如果关系模式 R 为第一范式,并且 R 中每一个非主属性完全函数依赖于 R 的某个候选键, 则称为第二范式模式。

第二范式( 2NF )是在第一范式( 1NF )的基础上建立起来的,即满足第二范式( 2NF )必须先满足第一范式( 1NF)。第二范式( 2NF )要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。

例如员工信息表中加上了员工编号( emp_id )列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。

简而言之,第二范式( 2NF )就是非主属性完全依赖于主关键字。

所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖 W→A ,若存在 XW ,有 X→A 成立,那么称W→A 是局部依赖,否则就称 W→A 是完全函数依赖)。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。

假定选课关系表为 SelectCourse( 学号 , 姓名 , 年龄 , 课程名称 , 成绩 , 学分 ) ,关键字为组合关键字 ( 学号 , 课程名称 ) ,因为存在如下决定关系:

( 学号 , 课程名称 ) → ( 姓名 , 年龄 , 成绩 , 学分 )

这个数据库表不满足第二范式,因为存在如下决定关系:

( 课程名称 ) → ( 学分 )

( 学号 ) → ( 姓名 , 年龄 )

即存在组合关键字中的字段决定非关键字的情况。

由于不符合 2NF ,这个选课关系表会存在如下问题:

(1) 数据冗余:

同一门课程由 n 个学生选修, " 学分 " 就重复 n-1 次;同一个学生选修了 m 门课程,姓名和年龄就重复了 m-1 次。

(2) 更新异常:

若调整了某门课程的学分,数据表中所有行的 " 学分 " 值都要更新,否则会出现同一门课程学分不同的情况。

(3) 插入异常:

假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有 " 学号 " 关键字,课程名称和学分也无法记录入数据库。

(4) 删除异常:

假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

把选课关系表 SelectCourse 改为如下三个表:

学生: Student( 学号 , 姓名 , 年龄 ) ;

课程: Course( 课程名称 , 学分 ) ;

选课关系: SelectCourse( 学号 , 课程名称 , 成绩 ) 。

这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。

另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

1.3 第三范式( 3NF )属性不依赖于其它非主属性 [ 消除传递依赖 ]

如果关系模式 R 是第二范式,且每个非主属性都不传递依赖于 R 的候选键,则称 R 为第三范式模式。

满足第三范式( 3NF )必须先满足第二范式( 2NF )。第三范式( 3NF )要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

例如,存在一个部门信息表,其中每个部门有部门编号( dept_id )、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式( 3NF )也应该构建它,否则就会有大量的数据冗余。

第三范式( 3NF ):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。简而言之,第三范式就是属性不依赖于其它非主属性。

所谓传递函数依赖,指的是如果存在 "A → B → C" 的决定关系,则 C 传递函数依赖于 A 。

因此,满足第三范式的数据库表应该不存在如下依赖关系:

关键字段 → 非关键字段 x → 非关键字段 y

假定学生关系表为 Student( 学号 , 姓名 , 年龄 , 所在学院 , 学院地点 , 学院电话 ) ,关键字为单一关键字 " 学号 " ,因为存在如下决定关系:

( 学号 ) → ( 姓名 , 年龄 , 所在学院 , 学院地点 , 学院电话 )

这个数据库是符合 2NF 的,但是不符合 3NF ,因为存在如下决定关系:

( 学号 ) → ( 所在学院 ) → ( 学院地点 , 学院电话 )

即存在非关键字段 " 学院地点 " 、 " 学院电话 " 对关键字段 " 学号 " 的传递函数依赖。

它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。

把学生关系表分为如下两个表:

学生: ( 学号 , 姓名 , 年龄 , 所在学院 ) ;

学院: ( 学院 , 地点 , 电话 ) 。

这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

1.4 鲍依斯 - 科得范式( BCNF 是 3NF 的改进形式)

若关系模式 R 是第一范式,且每个属性都不传递依赖于 R 的候选键。这种关系模式就是 BCNF 模式。即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合鲍依斯 - 科得范式。

假设仓库管理关系表为 StorehouseManage( 仓库 ID, 存储物品 ID, 管理员 ID, 数量 ) ,且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

( 仓库 ID, 存储物品 ID) → ( 管理员 ID, 数量 )

( 管理员 ID, 存储物品 ID) → ( 仓库 ID, 数量 )

所以, ( 仓库 ID, 存储物品 ID) 和 ( 管理员 ID, 存储物品 ID) 都是 StorehouseManage 的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

( 仓库 ID) → ( 管理员 ID)

( 管理员 ID) → ( 仓库 ID)

即存在关键字段决定关键字段的情况,所以其不符合 BCNF 范式。它会出现如下异常情况:

(1) 删除异常:

当仓库被清空后,所有 " 存储物品 ID" 和 " 数量 " 信息被删除的同时, " 仓库 ID" 和 " 管理员 ID" 信息也被删除了。

(2) 插入异常:

当仓库没有存储任何物品时,无法给仓库分配管理员。

(3) 更新异常:

如果仓库换了管理员,则表中所有行的管理员 ID 都要修改。

把仓库管理关系表分解为二个关系表:

仓库管理: StorehouseManage( 仓库 ID, 管理员 ID) ;

仓库: Storehouse( 仓库 ID, 存储物品 ID, 数量 ) 。

这样的数据库表是符合 BCNF 范式的,消除了删除异常、插入异常和更新异常。

四种范式之间存在如下关系:

 
 
                     

1NF 2NF 3NF BCNF相关推荐

  1. 数据库范式解析(1NF 2NF 3NF BCNF)

    数据库设计范式是关系型数据库的设计准则.其目的在于通过规划设计使得数据库结构合理,尽量减少数据冗余,消除存储异常,方便数据的插入.更新和删除操作.目前常用范式包括1NF(第一范式).2NF(第二范式) ...

  2. 【数据库】范式理解:1NF,2NF,3NF,BCNF,4NF详析

    数据库入门(一)范式理解:1NF,2NF,3NF,BCNF,4NF详析 引言 范式种类 第一范式(1NF) 符合1NF的关系中的每个属性都不可再分 存在问题 第二范式(2NF) 在1NF基础上消除了非 ...

  3. 数据库规范化 (1NF, 2NF, 3NF, BCNF)

    先记录几个概念 超键: 超键类似主键, 通过"超键", 我们可以一次性定位到某一条准确的数据上; 候选键: 候选, 即"主键"的候选; 超键是可以由多个属性来组 ...

  4. 1NF,2NF,3NF,BCNF

    消除部分依赖,可以从1NF转换为2NF 消除函数依赖,可以从2NF转换为3NF BCNF 在3NF基础上,消除主属性对键的部分依赖,传递依赖,则称它符合BCNF 关系模式R<U,F>中,对 ...

  5. 数据库范式1NF 2NF 3NF BCNF

    设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合.构造数据库必须遵循一定的规则.在关系数据库中,这种规则就是范式.关系数据库中的关系必须满足一定的要求,即满足不同的范 ...

  6. 数据库范式(1NF 2NF 3NF BCNF)详解

    数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不仅给 ...

  7. 数据库六种范式详解(1NF/2NF/3NF/BCNF/4NF/5NF)

    目录 数据库的基本概念 函数依赖 函数依赖的定义 函数依赖与属性的关系 六种范式 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) 巴斯-科德范式(BCNF,Boyce-Codd Norma ...

  8. 1NF,2NF,3NF,BCNF范式(学习笔记)

    前言:2NF必须在1NF的前提下,3NF必须在2NF的前提下,如果前提都不满足当然不是此阶级范式 1NF 只需要满足:在数据库表中每一个属性(列)都不可以再进行拆分(记住它就行) 例如 学生姓名就不可 ...

  9. 数据库范式1NF 2NF 3NF BCNF通俗讲解

    1NF(第一范式) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数 ...

最新文章

  1. https 页面中引入 http 资源的解决方式
  2. java uml聚合代码_UML类图(下):关联、聚合、组合、依赖
  3. .jsp后缀语言_ARM汇编语言入门(三)
  4. python雷达图怎么做_PYTHON绘制雷达图代码实例
  5. extjs Grid (二)
  6. 红旗6.0SP2发布啦!
  7. 二叉树相关面试题(二)
  8. Linux Shell编程(25)——I/O 重定向
  9. 雨林木风GhostXPSP3装机版YN9.9_09.11更新
  10. Rtools下载与安装(win10)
  11. 【微积分的本质|笔记】指数函数求导
  12. python中如何使用云片网发送短信验证码
  13. 【Web技术】1477- Tauri:下一代桌面应用开发框架?
  14. Docker基础笔记
  15. 从此就学会了...笑着哭......
  16. JAVA方法3-方法的重载
  17. android web3j 代币查询_ERC20代币转账以及余额查询--java(web3j)
  18. Oracle通过SPOOL导出数据Excel、CSV、TXT格式
  19. 用户标签体系的设计和效果评估
  20. 360与腾讯骂战升级

热门文章

  1. asp.net程序中最常用的三十三种编程代码标签
  2. 一篇文章,带你见证编程语言的诞生!
  3. 局域网即时通讯的可管理性
  4. 雷,大学教科书竟然使用番茄花园盗版系统
  5. 苦逼了6年,我今天终于把老板开了!哼!
  6. BATJ一线大公司需要什么样的前端
  7. 【福利】3980元的web前端视频教程限量领取!!!
  8. 性能优化篇(1):原来罪魁祸首的是http请求数
  9. php识别html5,CSS_在IE6/7/8下识别html5标签(让老式浏览器识别html5),识别html5标签: html5添加了许 - phpStudy...
  10. linux性能调优干货,【干货分享】详解Linux性能调优之tuned特性