动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.Oracle Fast-Start Fault Recove.
.深入了解缓冲日志文件I/O重要性能.
.常见数据库系统之比较 - Oracle数.
.在Flashback数据库上获得较高可用.
.ORACLE性能调整.
.oracle管理PPT深入分析.
.checkpoint小议.
.不能启动 Easy Config时如何创建.
.Oracle和DB2间基本架构和管理的差.
.管理Oracle OLAP时清除通往OLAP的.
.Oracle数据库中存在默认密码威胁.
.Oracle 9i跳跃式索引扫描的小测试.
.Oracle数据库10g环境下修改VIP地.
.Oracle缓冲区忙等待的识别和解决.
.Oracle在数据转储时的字符集问题.
.Oracle精髓之ORACLE简介及常见错.
.SQL PLUS编辑器的一些常用设置.
.如何解决ora-600 12700错误问题.
.什么是备份、恢复,它们的关系是.
.过程,函数,程序包.

关系型数据库:实现正规化

发表日期:2008-2-9 |



  设计阶段,花在数据正规化上的时间可能比花上其他任何任务上的时间都要多。而且数据越多,这个过程所花的时间更长。根据以往的经验,你可能发现最困难的就是满足第一范式(1NF)的所有要求,因为将重复的值移动到另一个表时,经常会消除不恰当的依靠。
  
  完成最困难的部分后,你可能选择在1NF之后就停止了,但不要这样做。请继续对数据进行正规化,尽可能地通过第二范式(2NF),第三范式(3NF),甚至通过Boyce-Codd范式(BCNF)。这样就能找出那些具有依靠性的数据元素,否则它们会在设计过程中静静地溜走,并在以后造成问题。最好在设计期间就发现这些问题——不要等到用户发现自己的工作无法完成,或者等到你开始损失金钱的时候。
  
  系列文章简介
  你现在正在阅读的是Builder.com Relational Database Design系列中的一篇文章。假如错过了前3篇文章,请首先阅读它们:
   《关系型数据库:理论背后的灵感》
   《关系型数据库:使用范式创建数据库》
   《关系型数据库:应用第一范式》
  
  在该系列的上一篇文章中,我们已经从一个表着手,并对其进行了处理,使其符合1NF的要求。该表最终变成了4个表。现在,让我们通过应用2NF、3NF和BCNF来完成正规化过程。
  
  继续未完的工作
  我们的示范数据库在完工以后,将用来存储和书籍有关的数据;这是一个非常简单的目的,所以只需要一个简单的数据库。我们现在已经有4个表,而且全部正规化为1NF(记住,要害字段是用星号表示的):
  
  Books: {*Title, *ISBN, Price}
  Authors: {*FirstName, *LastName, *State, *ZIP}
  Categories: {*Category, Description}
  Publishers: {*Publisher}
  应用2NF
  
  
  
  为了满足2NF的要求,表首先必须正规化成1NF,也就是其中没有多值项,没有重复的组,每个字段都只能包含原子值,而且每个表都必须包含一个键。迄今为止,似乎所有表都满足这个要求。2NF的第二个要求是所有字段(在设计阶段通常称为“属性”)都必须依靠于主键,而且只能依靠于主键。就目前来看,似乎所有属性都满足2NF的要求,无需采取进一步的操作。
  
  另一方面,假定Books表中还存储着用于描述借阅者的大量属性。有的属性不会违反2NF的要求,例如Books表中的一个lent date(借阅日期)属性。然而,其他数据(比如借阅者的姓名、地址等等)就会违反2NF,因为和借阅有关的信息不能完全地支持或描述书籍本身。
  
  应用3NF
  
  一个表在完成了2NF正规化后,可开始检查它是否违反3NF。3NF要求所有字段都相互独立。任何字段假如依靠于一个非要害字段,都必须转移到另一个表中。为了找出违反3NF的地方,最简单的方式就是修改每个属性的值,看它是否立即使其他属性所包含的数据无效。这种简单测试虽然不能找出违反3NF的所有地方,但却是一个不错的开端。
  
  Authors表存在一个可能违反3NF的地方:假如更改State值,那么可能同时还要更新ZIP;反之亦然。例如,假如作者移居另外一个州,那么上述两个值都需要修改。为了避免这种形式的依靠性,你需要将State属性转移到一个新表中,如下所示:
  
  Authors: {*FirstName, *LastName, *ZIP}
  States: {*State}
  
  上述修改的结果就是,每个作者都有了一个ZIP值,其中部分值可能重复,但在States表中,每个州只占用一条记录。假如某个作者移居到其他某个州,你虽然需要更新ZIP值,但只需将记录与一个不同的州联系起来就可以了。假如是一个新出现的州,就可能需要输入一个新的州值,但至少州值不会重复。
  
  就目前来说,感觉是在创建一个查找表(lookup table)。以后,这些表会通过它们的主键和外键值相互联系,但在正式建立联系之前,按上述逻辑进行操作可能显得比较困难。不过,假如搞不清楚当前的状况,请不要担心。目前只需将注重力集中在规则上就可以了。
  
  
  现在已经有了5个表,全部正规化成3NF:
  
  Books: {*Title, *ISBN, Price}
  Authors: {*FirstName, *LastName, *ZIP}
  Categories: {*Category, Description}
  Publishers: {*Publisher}
  States: {*State}
  
  有人会对此产生疑问,因为有一个属性似乎没有考虑到,也就是 Authors表中的ZIP。前面说过,ZIP值是有可能重复的。在这个简单的应用程序中,将ZIP留在Authors表中似乎是可以接受的;无论如何,数据库都应该能高效地运行。不过,这个表并没有充分地正规化,所以下面尝试将ZIP转移到一个新表中。在移动了ZIP之后,我们就有了6个表:
  
  Books: {*Title, *ISBN, Price}
  Authors: {*FirstName, *LastName}
  ZIPCodes: {*ZIP}
  Categories: {*Category, Description}
  Publishers: {*Publisher}
  States: {*State}
  
  正规化不一定能保证效率
  
  并非每个表都必须在完全正规化后才能获得高效率。换言之,假如你发现能使数据库变得更高效,那么完全可以对一个表进行反正规化处理。

  
  应用BCNF
  
  BCNF本质上是3NF的一个子规则,许多开发者认为它完全没有必要,所以在3NF之后就停止正规化了。有人认为假如强制遵循这一规则,反而会降低性能。但对于目前通常都很强大的系统来说,性能恐怕不是一个大问题,除非你试图操纵数百万条记录。当然,你不一定非要包括BCNF,必须权衡在进行了BCNF正规化之后,对性能造成的影响是否值得一个完全正规化的数据库在灵活性上的好处。
  
  BCNF要求任何属性都绝对没有机会依靠一个非要害字段。就目前来说,我们的表似乎能满足这一要求。所以,让我们在States表中添加一个City属性,使局面变得复杂一些:
  
  States: {*City, *State}
  
  每个城市和州记录都是惟一的,而且与一个ZIP值相关。但是,州值现在展示了一个重复的组,因为每个州都可能有多个城市。解决方案是将City属性转移到它自己的表中,如下所示:
  
  Cities: {*City}
  States: {*State}
  
  虽然City和State属性是一种不恰当的依靠,但实际是因为存在重复的值,所以才需要新建Cities表。这种问题通常在强制1NF时就能捕捉,但只有通过强制BCNF,才能最终完全捕捉到造成重复值的错误。通常,虽然一个依靠性问题会暂时迷惑你的眼睛,但只有在强迫了BCNF之后,才能彻底消除依靠非要害字段的问题。
  
  对最初通过BCNF创建的表进行了正规化之后,表的总数就增加到了7个:
  
  Books: {*Title, *ISBN, Price}
  Authors: {*FirstName, *LastName}
  ZIPCodes: {*ZIP}
  Categories: {*Category, Description}
  Publishers: {*Publisher}
  States: {*State}
  Cities: {*City}
  
  表的数量虽然在快速增加,但请不要担心。事实上,我们尚未完工。在本系列的下一篇文章中,甚至可能出现更多的表。届时,我们将讨论主键和外键字段,并解释如何用它们在多个表之间建立关系。
上一篇:关系型数据库:使用范式创建数据库 人气:618
下一篇:关系型数据库:应用第一范式 人气:648
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-8-19 久溜溜电影系统(免维护+小偷) v5
2008-8-19 晴天免费电影系统完整版(带迅雷采
2008-8-19 Twinklous File Manager v1.5
2008-8-19 千米旅游网站管理系统 v2.0
2008-8-19 资阳人才网 v2.0
2008-8-19 全球商务B2B网站系统 v1.0 asp版
2008-8-19 动域网主机代理管理系统 v1.0
2008-8-19 JH2008-企业网站(全站生成html)
2008-8-19 GlobalEC C2C管理系统 v1.0
2008-8-16 iLaba Player(小喇叭播放器) v2.
2008-8-16 DoubleClickFix 鼠标双击修正工具
2008-8-16 CrystalCPUID 4.15.2.451
2008-8-16 VeryCD 电驴(easyMule) 1.0.4 Bu
2008-8-16 uTorrent 1.8 Build 11813 - Sta
2008-8-16 比特精灵(BitSpirit) v3.3.2.287
2008-8-16 StayInTune音叉 v1.0 破解版
2008-8-16 iChing《周易》汉化补丁 v1.0
2008-8-16 Starmap星空图v1.0汉化破解版
  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵