原文地址:https://blog.csdn.net/g_beginner/article/details/6789308

1. 定义

当下面性质成立时,一个数据库模式中的表T及函数依赖集F被称为符合Boyce-Codd范式(BCNF):任何F可推导出的函数依赖X->A都在T中,这里A是不在X中的单一属性,X必须是T的一个超键。当一个数据库模式包含的所有表都符合BCNF时,这个数据库被称为符合BCNF.

2. 说明

BCNF是比第三范式更严格一个范式。它要求关系模型中所有的属性(包括主属性和非主属性)都不传递依赖于任何候选关键字。也就是说,当关系型表中功能上互相依赖的那些列的每一列都是一个候选关键字时候,该满足BCNF。

BCNF实际上是在第三范式的基础上,进一步消除了主属性的传递依赖。

3. 举例

有这样一个配件管理表WPE(WNO,PNO,ENO,QNT),其中WNO表示仓库号,PNO表示配件号,ENO表示职工号,QNT表示数量。

有以下约束要求:

(1)       一个仓库有多名职工;

(2)       一个职工仅在一个仓库工作;

(3)       每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件;

(4)       同一种型号的配件可以分放在几个仓库中。

分析表中的函数依赖关系,可以得到:

(1)       ENO->WNO;

(2)       (WNO,PNO)->QNT

(3)       (WNO,PNO)->ENO

(4)       (ENO,PNO)->QNT

可以看到,候选键有:(ENO,PNO);(WNO,PNO)。所以,ENO,PNO,WNO均为主属性,QNT为非主属性。显然,非主属性是直接依赖于候选键的。所以此表满足第三范式。

而我们观察一下主属性:(WNO,PNO)->ENO;ENO->WNO。显然WNO对于候选键(WNO,PNO)存在传递依赖,所以不符合BCNF.

解决这个问题的办法是分拆为两个表:管理表EP(ENO,PNO,QNT);工作表EW(ENO,WNO)。但这样做会导致函数依赖(WNO,PNO)->ENO丢失。

4. 应用

虽然,不满足BCNF,也会导致一些冗余和一致性的问题。但是,将表分解成满足BCNF的表又可能丢失一些函数依赖。所以,一般情况下不会强制要求关系表要满足BCNF。

5.第四范式(4NF)

1. 定义

第四范式需要满足以下要求:

(1)       必须满足第三范式

(2)       表中不能包含一个实体的两个或多个互相独立的多值因子。

2. 说明

显然,第四范式也是一个比第三范式严格的范式。

第四范式的意思是:当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值。若有多值就违反了第四范式。定义比较抽象,可以参照下面的例子理解。

3. 举例

有这样一个用户联系方式表TELEPHONE(CUSTOMERID,PHONE,CELL)。 CUSTOMERID为用户ID,PHONE为用户的固定电话,CELL为用户的移动电话。

本来,这是一个非常简单的第3范式表。主键为CUSTOMERID,不存在传递依赖。但在某些情况下,这样的表还是不合理的。比如说,用户有两个固定电话,两个移动电话。这时,表的具体表示如下:

CUSTOMERID

PHONE

CELL

1000

8828-1234

149088888888

1000

8838-1234

149099999999

由于PHONE和CELL是互相独立的,而有些用户又有两个和多个值。这时此表就违反第四范式。

在这种情况下,此表的设计就会带来很多维护上的麻烦。例如,如果用户放弃第一行的固定电话和第二行的移动电话,那么这两行会合并吗?等等

解决问题的方法为,设计一个新表NEW_PHONE(CUSTOMERID,NUMBER,TYPE).这样就可以对每个用户处理不同类型的多个电话号码,而不会违反第四范式。

4. 应用

显然,第四范式的应用范围比较小,因为只有在某些特殊情况下,要考虑将表规范到第四范式。所以在实际应用中,一般不要求表满足第四范式。

六.第五范式(5NF)

1. 定义

第五范式有以下要求:

(1)       必须满足第四范式

(2)       表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。

2. 说明

第五范式是在第四范式的基础上做的进一步规范化。

第四范式处理的是相互独立的多值情况,而第五范式则处理相互依赖的多值情况。

3. 举例

有一个销售信息表SALES(SALEPERSON,VENDOR,PRODUCT)。SALEPERSON代表销售人员,VENDOR代表供和商,PRODUCT则代表产品。

在某些情况下,这个表中会产生一些冗余。可以将表分解为PERSON_VENDOR表(SALEPERSON,VENDOR);PERSON_PRODUCT表(SALEPERSON,PRODUCT);VENDOR­_PRODICT表(VENDOR,PRODUCT)。

4. 应用

第五范式的应用就更少了,很多时候,我认为分解为第五范式是完全没必要的。可能在某些情况下会有意义吧。不懂。。。

总结:

总之,规范化的过程就是在数据库表设计时移除数据冗余的过程。随着规范化的进行,数据冗余越来越少,但数据库的效率也越来越低。

这就要求你在数据库设计中,能结合实际应用的性能要求,规范到合适的范式。一般情况下,如何性能允许的话,都要求规范到第三范式的。

===================================================

例子:STC(Sid,Tid,Cid) 学生选课m:n,老师授课m:1, 
有以下函数依赖:(Sid,Cid)->Tid;(Sid,Tid)->Cid;Tid->Cid

这个表不符合BCNF但符合第三范式。 
改为:ST(Sid,Tid);TC(Tid,Cid)。现在就符合BCNF了。

3NF->BCNF 需要消除主属性对键的部分和传递函数依赖。

BCNF范式、第四范式和第五范式相关推荐

  1. 数据库设计范式(二)之巴斯范式第四范式第五范式以及域键范式

    目录 概述 巴斯范式 1.案例 2.是否符合三范式 3.存在的问题 4.问题解决 第四范式(了解即可) 第五范式.域键范式(了解即可) 小结 概述 之前我们讲过数据库设计范式的第一范式,第二范式以及第 ...

  2. mysql中bcnf_请问数据库设计中BCNF范式是什么意思?

    展开全部 BCNF范式在3NF基础上消除对主码子集的62616964757a686964616fe78988e69d8331333431373230依赖. 以仓库管理关系表为例:仓库号,存储物品号,管 ...

  3. 第一范式,第二范式,第三范式,BCNF范式理解

    基础知识 实体:现实世界中客观存在并可以被区别的事物.比如"一个学生"."一本书"."一门课"等等.值得强调的是这里所说的"事物& ...

  4. 关于1NF、2NF、3NF、BCNF范式

    首先要明白"范式(NF)"是什么意思.按照教材中的定义,范式是"符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度".很晦涩吧?实际上 ...

  5. 数据库第一范式、第二范式、第三范式、BCNF范式

    文章目录 什么是"范式(NF)" 1. 第一范式(1NF) 2. 第二范式(2NF) 2.1 函数依赖 2.1.1完全函数依赖 2.1.2 部分函数依赖 2.2 码 2.3 非主属 ...

  6. 数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别

    数据库 部分函数依赖 完全函数依赖  传递函数依赖  第一范式.第二范式.第三范式.BCNF范式区别 在理解函数依赖之前,先来看一下函数依赖分析: 在关系中,包括在任何候选码中的属性称为主属性:不包括 ...

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

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

  8. 数据库建立遵循的三大范式

    数据库建立遵循的三大范式 数据库设计深刻影响着存储性能和数据的操作效率,为了避免操作异常,在设计数据库的时候需要满足一定的规范要求,这里就引入了范式. 范式有多种级别:第一范式,第二范式,第三范式,b ...

  9. mysql 事物状态有几种_MySQL知识点汇总:亿级高并发数据库运转原理大公开!

    - 点击上方"中国统计网"订阅我吧!- 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对 ...

  10. 数据库 (学习笔记)

    一. 绪论 1.1 数据库系统概论 1.1.1 数据库的4个基本概念 数据(Date) 数据库(DB) 数据库管理系统(DBMS) 数据库系统(DBS) 1. 数据(Date) 定义:是数据库存储的基 ...

最新文章

  1. Shell+Linux命令实现日志分析
  2. ROW_NUMBER() OVER (PARTITION BY 字段1 ORDER BY 字段2 DESC)
  3. “+=”消除格式的强转问题
  4. HDU3113(工科数学分析之分解)
  5. elasticsearch安装与基础用法
  6. 如何使用插件生成自定义Java 8代码
  7. 解决虚拟机 正在决定eht0 的ip信息失败 无链接-- 添加虚拟网卡
  8. html 文件域变滑块,小巧的jQuery区域范围滑块插件noUiSlider
  9. LeetCode 116. 填充每个节点的下一个右侧节点指针
  10. [转] 面向对象编程 - 类和实例
  11. python多线程守护线程_Python守护程序线程
  12. PS——图像合成与渐变工具
  13. cpm,cpc,cps和cpa分别是什么意思
  14. 鸡尾酒会问题(Cocktail Party Problem)和程序实现
  15. 架构重构:通过以任务为中心的视角看软件的进化
  16. 随手笔记(九)———类型装换技巧
  17. linux i2c模型 rtc模型 详细分析,Linux RTC驱动分析(一)----pcf8563驱动和class.c
  18. 《人人都是产品经理》之我也是产品经理
  19. zzuli oj 1016:银行利率(java)
  20. vue+element如何一键换肤和保存换肤

热门文章

  1. 魔兽世界服务器 运行状态,服务器状态查询,魔兽怀旧服务器状态查询
  2. MySQL 分页查询
  3. 微信小程序tabbar 小程序自定义 tabbar怎么做
  4. 最新遇到的产品经理面试题
  5. pr踩点插件beat edit安装教程
  6. mbedtls基础及其应用
  7. 如何通过stm32驱动电源检测芯片cs5463
  8. k3 Bos开发百问百答
  9. 小程序 tab 切换点击无效
  10. 深度学习优化策略---权重、权重初始化与权重衰减