标准化表示从你的数据存储中移去数据冗余(redundancy)的过程。如果数据库设计达到了完全的标准化,则把所有的表通过关键字连接在一起时,不会出现任何数据的复本(repetition)。标准化的优点是明显的,它避免了数据冗余,自然就节省了空间,也对数据的一致性(consistency) 提供了根本的保障,杜绝了数据不一致的现象,同时也提高了效率。

第一范式(1NF; The First Normal Form)

第一范式是最低的规范化要求,第一范式要求数据表不能存在重复的记录,即存在一个关键字。1NF的第二个要求是每个字段都不可再分,即已经分到最小,关系数据库的定义就决定了数据库满足这一条。主关键字达到下面几个条件:
1. 主关键字段在表中是唯一的;
2. 主关键字段中没有复本;
3. 主关键字段不能存在空值;
4. 每条记录都必须有一个主关键字;
5. 主关键字是关键字的最小子集;

满足1NF的关系模式有许多不必要的重复值,并且增加了修改其数据时疏漏的可能性。为了避免这种数据冗余和更新数据的遗漏,就引出了第二范式(2NF)。

第二范式(2NF; The Second Normal Form)

定义:如果一个关系属于1NF,且所有的非主关键字段都完全地依赖于主关键字,则称之为第二范式,简记为2NF
为了说明问题现举一个例子来说明:

有一个库房存储的库有四个字段(零件号码,仓库号码,零件数量,仓库地址),这个库符合1NF,其中“零件号码”和“仓库号码”构成主关键字。
但是因为“仓库地址”只完全依赖与“仓库号码”,即只依赖于主关键字的一部分,所以它不符合2NF,这样首先存在数据冗余,因为仓库数量可能不多。
其次,存在如果更改仓库地址时,如果漏改了某一记录,存在数据不一致性。
再次,如果某个仓库的零件出完了,那么这个仓库地址就丢失了,即这种关系不允许存在某个仓库中不放零件的情况。
我们可以用投影分解的方法消除部分依赖的情况,而使关系达到2NF的标准。
方法是从关系中分解出新的二维表,是每个二维表中所有的非关键字都完全依赖于各自的主关键字。我们可以如下分解:分解成两个表(零件号码,仓库号码,零件数量)和(仓库号码,仓库地址)。这样就完全符合2NF了。

第三范式(3NF; The Third Normal Form)

定义:如果一个关系属于2NF,且每个非关键字不传递依赖于主关键字,这种关系是3NF
从2NF中消除传递依赖,就是3NF。

比如有一个表(姓名,工资等级,工资额),其中姓名是关键字,此关系符合2NF,但是因为工资等级决定工资额,这就叫传递依赖,它不符合3NF,我们同样可以使用投影分解的办法分解成两个表:(姓名,工资等级),(工资等级,工资额)。

一般情况,规范化到3NF就满足需要了,规范化程度更高的还有BCNF,4NF,5NF,因为不常用,不作解释和讨论。它们下层都是上层的子集,规范办法是:

1NF(消除非主属性对关键字的部分函数依赖)=>

2NF(消除非主属性对关键字的传递函数依赖)=>

3NF (消除主属性对关键字的部分和传递依赖)=>

BCNF (消除非平凡且非函数依赖的多值依赖)=>

4NF(消除不为候选关键字所隐含的连接依赖)=>

5NF。

投影分解
上面提到了投影分解方法,关系模式的规范化过程是通过投影分解来实现的。这种把低一级关系模式分解成若干高一级关系模式的投影分解不是唯一的,应在分解中注意满足三个条件:
1. 无损连接分解,分解后不丢失信息;
2. 分解后得的每一关系都是高一级范式,不要同级甚至低级分解;
3. 分解的个数最少,这是完美要求,应做到尽量少。

规范化的利弊
有一利必有一弊。规范化的优点是明显的。避免了大量的数据冗余,节省了空间,保持了数据的一致性,如果完全达到3NF,你不会在超过一个地方更改同一个值。如果你的记录经常的改变,这个优点回超过所有可能的缺点!
它最大的不利是,你把信息放置在不同的表中,增加了操作的难度,同时把多个表连接在一起的花费也是巨大的(节省了时间必然付出空间的代价,反之,节省了空间也必然付出时间的代价,时间和空间在计算机领域中是一个矛盾统一体,它们互相作用,对立统一)。因为表和表的连接操作是做两个关系的笛卡儿积(如果表一有n条记录,表二有m条记录,如果没有任何连接条件的话,连接在一起就是n*m条记录,其数量是不可承受的,毋宁说大量的表连接在一起了),必然会产生大量无用甚至无效的记录,性能的代价是巨大的。

非规范化(Denormalization)
即使你花费你所有的午休时间,作出一个完全规范化的数据库(你的大学教授可以证明),它仍然不是完美的。规范化设计所带来的性能问题可能你无法承受。如果出现这种情况,你就要准备进行非规范化了。非规范化就是你为了获得性能上的利益所进行的违反规范化规则的操作,并没有什么魔法在里面。它是一个性能利益分析,尝试和再尝试和不断的再评估过程。它也有很多方法,不过大部分都与实际应用有关系,包括复制属性,复制外来关键字,表合并,表重新组合等等,你可以根据实际的应用选择最有效的方法。

Ref:

http://mengxiaozhe.javaeye.com/blog/93175

http://dmt.w29.myhostadmin.net/Article/dnwl/200901/20090110210002.html

转载于:https://www.cnblogs.com/emanlee/archive/2011/03/10/1980251.html

关系数据理论中的范式相关推荐

  1. 数据库复习——关系数据理论中的几个重要概念(闭包,逻辑蕴含,覆盖...)

    前言 关系数据理论中几个比较抽象的概念 正文 一.函数依赖 定义 设R(U)是属性集合U={A1,A2,-,An}上的一个关系模式,X, Y是U上的两个子集,若对R(U)的任意一个可能的关系r, r中 ...

  2. 数据库系统概论第六章(关系数据理论)知识点总结(2)—— 码的概念总结

    本专栏收录了数据库的知识点,而从本文起,将讲述有关于关系数据理论中的第一范式.第二范式.第三范式以及BC范式有关知识点,提供给有需要的小伙伴进行学习,本专栏地址可以戳下面链接查看

  3. 【数据库系统设计】关系数据理论(函数依赖、码、范式、模式分解)

    关系数据理论 6.1 为什么要学习关系数据理论 什么是好的数据库逻辑设计 什么是数据依赖 关系模式的简化表示 6.2 规范化 - 关系的规范化理论 6.2.1 函数依赖 1.函数依赖 2.平凡函数依赖 ...

  4. 第6章 关系数据理论—范式的介绍

    第6章 关系数据理论-范式的介绍 本文全部内容来自数据库系统概论(第5版)-王珊.萨师煊著 部分函数依赖图,出于自己的理解,如有错误,请大家评论指正! 范式:关系数据库中需要满足的一定要求的规范形式. ...

  5. 数据库原理与应用(SQL)——3、关系数据理论(函数依赖、闭包、函数依赖集的最小集、规范化---范式 )

    加油! 不要停止奔跑, 不要回顾来路, 来路无可眷顾, 值得期待的只有远方.  关系数据理论是关系数据库的理论基础, 为数据库设计提供了判别标准, 是设计关系数据库的指南. 数据存储异常(因为存在数据 ...

  6. 数据库系统-关系数据理论

    数据库系统-关系数据理论 关系数据库规范化理论 关系数据库规范化是为了告诉你如何才能设计出合适的库和表. 关系模式由五部分组成,即它是一个五元组 ​ R(U,D,DOM,F) R: 关系名 U: 组成 ...

  7. 《数据库系统概论》第六章 关系数据理论

    第六章 关系数据理论 1.函数依赖的定义:设R(U)是属性集U上的关系模式,X,Y是U的子集,且对于R(U)上任意一个可能的关系r,r中不存在两个不同的Y对应于相同的X的情况,则称Y函数依赖于X,记作 ...

  8. 数据库复试--关系数据理论(主观题)

    第五章 关系数据理论 1. 在关系模式R(D,E,G)中,存在函数依赖关系{E→D,(D,G)→E},则候选码是__________,关系模式R(D,E,G)属于____________. 正确答案: ...

  9. (数据库系统概论|王珊)第六章关系数据理论-第一节:为什么要研究关系数据理论

    文章目录 一:概念回顾:关系模式 二:数据依赖 三:一个例子:不遵循关系数据理论导致的问题 一句话,研究关系数据库理论就是为了设计出合适的关系模式,也即合适.高效的表 一:概念回顾:关系模式 相关文章 ...

最新文章

  1. CVPR2020最新论文扫描盘点(下)
  2. 百度地图android室内定位,百度地图4.0正式发布,主打免费语音导航、室内定位、实时公交和生活搜索 (视频)...
  3. 声卡硬件测试软件,RMAA声卡检测(RightMark Audio Analyzer)
  4. arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色
  5. Google和百度 翻译对比
  6. 实体词典 情感词典_基于词典的情感分析——简单实例
  7. 为什么新闻联播的主持人不低头念稿,难道都背下来了?
  8. Org-mode五分钟教程ZZZ
  9. WIZ ConfigTool-批量配置WIZnet S2E模块
  10. 前端工程师的价值体现在哪里?
  11. read函数、write函数
  12. 磁盘列阵 Raid
  13. 每月更新的Mac软件序列号查询小机器人KCNScrew Pack
  14. 亚马逊云科技中国北京区域推出Amazon CloudTrail服务
  15. 如何获得扬声器完美的单位冲激响应?
  16. Kali Linux 简介
  17. Python【pymysql】
  18. 送给女朋友的java程序_情人节写给女朋友Java Swing代码程序
  19. 步步扎进Java-泛型与集合
  20. 各大护肤品牌国内专柜价格大全!!-zz

热门文章

  1. java虚拟机栈帧_Java虚拟机,运行时栈帧结构
  2. JXJJOI2018_T1_market
  3. 深入研究ConcurrentHashMap 源码从7到8的变迁
  4. 2.最详细的WSDD配置文件注释
  5. 《Unity着色器和屏幕特效》——2.2 进阶的透明效果
  6. Linux 小记录!
  7. Linux下SVN服务器支持Apache的http和svnserve独立服务器
  8. 系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常...
  9. Windows Phone 7 不温不火学习之《创建用户控件》
  10. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法