目录

范式

1.第一范式(1NF):列不可再分

2.第二范式(2NF)属性完全依赖于主键

3.第三范式(3NF)属性不依赖于其它非主属性    属性直接依赖于主键

4.BCNF(Boyce Codd Normal Form)是由Boyce与Codd提出的,比上述的3NF又进了一步,所以通常认为BCNF是修正的第三范式,有时也成为扩充的第三范式

5.第四范式(4NF)-限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖

6.第五范式(5NF)

多值依赖

传递函数依赖

多值依赖


范式

1.第一范式(1NF):列不可再分

1.每一列属性都是不可再分的属性值,确保每一列的原子性

2.两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

例:

有一个学生表,假设有两个字段分别是 name,address,而address内容写的是:江苏省南京市浦口区xxx街道xxx小区。如果这时来一个需求,需要按省市区分类,显然不符需求,这样的表结构也不是符合第一范式的。

应该设计成 name,province(省),city(市),area(区),address

2.第二范式(2NF)属性完全依赖于主键

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主键

每一行的数据只能与其中一列相关,即一行数据只做一件事,只要数据列中出现重复的数据,那么就要把表拆分开来。

例:

有一个订单表如下:

orderId(订单编号),roomId(房间号), name(联系人), phone(联系电话),idn(身份证)

如果这时候一个人同时订了好几个房间,就会变成一个订单编号对应多条数据,这样子联系人都是重复的,就会造成数据冗余,这时我们应该把拆分开来。

如:

订单表:

orderId(订单编号),roomId(房间号), peoId(联系人编号)

联系人表:

peoId(联系人编号),name(联系人), phone(联系电话),idn(身份证)

3.第三范式(3NF)属性不依赖于其它非主属性    属性直接依赖于主键

第二范式(3NF)是在第一范式(2NF)的基础上建立起来的,即满足第三范式(3NF)必须先满足第二范式(2NF)。

简单点意思就是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

例:

假设有一个员工(employee)表,它有九个属性:id(员工编号)、name(员工名称)、mobile(电话)、zip(邮编)、province(省份)、city(城市)、district(区县)、deptNo(所属部门编号)、deptName(所属部门名称)

员工表的province、city、district依赖于zip,而zip依赖于id,换句话说,province、city、district传递依赖于id,违反了 3NF 规则。为了满足第三范式的条件,可以将这个表拆分成employee和zip两个表,如下:

employee

id name zip
101 张三 100001
102 李四 200001
103 王五 510001

地区表area

zip province city district
100001 北京 北京 海淀区
200001 上海 上海 静安区
51000 广东省 广州 白云区

4.BCNF(Boyce Codd Normal Form)是由Boyce与Codd提出的,比上述的3NF又进了一步,所以通常认为BCNF是修正的第三范式,有时也成为扩充的第三范式

如果关系模式R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或是关系模式R,如果每个决定因素都包含关键字(而不是被关键字所包含),则BCNF的关系模式。 例:配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件 a.一个仓库有多个职工。 b.一个职工仅在一个仓库工作。 c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。 d.同一种型号的配件可以分放在几个仓库中。 分析:

  • (1)由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。
  • (2)由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)-> ENO。

因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (WNO,PNO)-> QNT。 找一下候选关键字,因为(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此 (WNO,PNO)可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO 均为主属性,只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。 分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而PNO->WNO,故(ENO,PNO)-> WNO 是传递依赖。 虽然没有非主属性对候选关键字的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。

  • 解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
  • 缺点:分解后函数依赖的保持性较差。

1NF直到BCNF的四种范式之间有如下关系: **BCNF包含了3NF包含2NF包含1NF **

5.第四范式(4NF)-限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖

定义:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。

理解: 显然一个关系模式是4NF,则必为BCNF。也就是说,当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值,若有多值就违反了4NF。

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

6.第五范式(5NF)

第五范式有以下要求:
(1)必须满足第四范式;
(2)表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。
第五范式是在第四范式的基础上做的进一步规范化。第四范式处理的是相互独立的多值情况,而第五范式则处理相互依赖的多值情况。

多值依赖

提出多值依赖前,我们先提出依赖是什么。

函数依赖

车牌→车

完全函数依赖、平凡函数依赖 

完全函数依赖:( 经 度 , 纬 度 ) → 地 点 (经度,纬度)\to 地点(经度,纬度)→地点

部分函数依赖、完全函数依赖 

传递函数依赖

用户→权限等级,权 限 等 级 → 权 限 权限等级\to权限权限等级→权限
用户⟶传递​权限

 多值依赖

课程→→教师

多值依赖的性质: 

1. 多值依赖具有对称性。即若X → → Y,则X → → Z,其中Z=U-X-Y。

2. 多值依赖具有传递性。即若X → Y,Y → Z,则X → Z。

3. 函数依赖可以看作是多值依赖的特殊情况。即若X → Y,则X → →Y。这就是因为当X →Y时,对X的每一个值x,Y有一个确定的值y与之对应,所以X → →Y。

4. 若X → →Y,X → →Z,则X → →YZ。

5. 若X → →Y,X → →Z,则X → →Y∩Z。

6. 若X → →Y,X → →Z,则X → →Y-Z,X → →Z-Y。

为什么需要范式

数据库范式为数据库的设计、开发提供了一个可参考的典范,在许多教学材料中也是作为关键的课程内容。 那么范式的提出是为了解决什么问题?

  • 第一范式,要求将列尽可能最小的分割,希望消除某个列存储多个值的冗余的行为比如用户表中的地址信息,拆分为省、市这种明确的字段,可以按独立的字段检索、查询
  • 第二范式,要求唯一的主键,且不存在对主键的部分依赖,希望消除表中存在冗余(多余)的列,比如订单表中的商品分类、详情信息,只需要由商品信息表存储一份即可。
  • 第三范式,要求没有间接依赖于主键的列,即仍然是希望消除表中冗余的列比如用户表中不需要存储额外的 其所在城市的人口、城市特点等信息。

很明显,这些范式大都是为了消除冗余而提出的,即尽可能的减少存储成本。

[范式]数据库-范式相关推荐

  1. 什么是数据库范式(NF)?从一范式到五范式分别是什么?

    什么是数据库范式(NF)?从一范式到五范式分别是什么? 什么是数据库范式(NF)? 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某 ...

  2. (转载)数据库范式及宽表窄表理解

    1.数据库设计的三大范式,转载地址:http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html 为了建立冗余较小.结构合理的数据库, ...

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

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

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

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

  5. 【转载】数据库范式那些事

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

  6. 数据库范式的思考以及数据库的设计

    数据库范式--通俗易懂[转] 数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库.甚至设计出错误的数据库.而想要理解并掌握范式却并不是那 么容易.教科书中一般以 ...

  7. 数据库范式5nf_第四范式(4NF)| 数据库管理系统

    数据库范式5nf Fourth normal form (4NF) is a normal form used in database normalization, in which there ar ...

  8. 从第一范式(2nf)到第二范式(3nf)_啥是数据库范式

    前言: 关于数据库范式,时常有听说过,一直没有详细去了解.一般数据库书籍或数据库课程会介绍范式相关内容,范式也经常出现在数据库考试题目中.不清楚你是否对范式有比较清晰的了解呢?本篇文章我们一起来学习下 ...

  9. 【Oracle】数据库范式

    为了规范化关系型数据模型,关系型数据库系统在设计时必须遵循一定的规则,这种规则称为关系型数据库系统范式.范式的主要目的是降低数据冗余,设计结构合理的数据库. 1. 第一范式(1NF):字段必须具有唯一 ...

最新文章

  1. python解析雷达数据_【学习笔记】使用python带时间戳提取rosbag中的图像和雷达数据...
  2. Facebook API使用经验分享
  3. 【转】Java:String、StringBuffer和StringBuilder的区别
  4. C#的多线程机制探索1
  5. java保护表格_读密码保护的工作表(版本 - Excel中95,97-2003)的Java
  6. 【网易游戏面试题】.NET中强引用和弱引用是什么
  7. Solaris 10 x86 Mono 三次折腾准备休战了
  8. 三台服务器的时间同步-Linux
  9. Grails Quartz插件,定时调度任务
  10. FX DocuPrint M268 dw打印机硒鼓清零
  11. 计算机很多文件无法删除,电脑有文件删不掉怎么办?电脑有文件删不掉解决方法介绍...
  12. excel表格怎么画斜线_怎么画出漂亮的Excel表格线?
  13. oracle添加redo,添加redolog组成员
  14. win7怎么更改浏览器主页?win7浏览器主页更改教程
  15. ctfshow-菜狗杯-web(一)
  16. openresty 与 java RSA加解密
  17. 苹果AppStore审核规则标准指南!
  18. 树莓派sd卡格式化_利用树莓派和移动硬盘搭建下载机,常见视频网站都可下载...
  19. 线程分离pthread_detach、pthread_attr_setdetachstate (attr, PTHREAD_CREATE_DETACHED);
  20. 拼多多之所以壮大,在于淘宝对利益过度痴迷

热门文章

  1. 15个精美的 HTML5 单页网站作品欣赏
  2. Flash Decompiler Trillix failed to open
  3. 最新详细版Ubuntu20.04安装教程
  4. 第八届全国大学生GIS技能大赛参赛分享
  5. Ubuntu12.10 安装ATI显卡驱动
  6. C++Builder 资料库 (转载)
  7. C++ Builder 杂项
  8. 130个免费 微信小程序源码分享
  9. 如何利用XMLSpy实现从多个XML实例生成架构
  10. drawio改变图形颜色和背景色制作出炫酷的流程图