资源描述:
《规范化-数据库设计原则》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、规范化-数据库设计原则序言本文的目的就是通过详细的实例来阐述规范化的数据库设计原则。在DB2中,简洁、结构明晰的表结构对数据库的设计是相当重要的。规范化的表结构设计,在以后的数据维护中,不会发生插入(insert)、删除(delete)和更新(update)时的异常。反之,数据库表结构设计不合理,不仅会给数据库的使用和维护带来各种各样的问题,而且可能存储了大量不需要的冗余信息,浪费系统资源。要设计规范化的数据库,就要求我们根据数据库设计范式――也就是数据库设计的规范原则来做。但是一些相关材料上提到的范式设计,往往是给
2、出一大堆的公式,这给设计者的理解和运用造成了一定的困难。因此,本文将结合具体形象的例子,尽可能通俗化地描述三个范式,以及如何在实际工程中加以优化应用。规范化在设计和操作维护数据库时,关键的步骤就是要确保数据正确地分布到数据库的表中。使用正确的数据结构,不仅便于对数据库进行相应的存取操作,而且可以极大地简化应用程序的其他内容(查询、窗体、报表、代码等)。正确进行表设计的正式名称就是"数据库规范化"。后面我们将通过实例来说明具体的规范化的工程。关于什么是范式的定义,请参考附录文章1.数据冗余数据应该尽可能少地冗余,这意味
3、着重复数据应该减少到最少。比如说,一个部门雇员的电话不应该被存储在不同的表中,因为这里的电话号码是雇员的一个属性。如果存在过多的冗余数据,这就意味着要占用了更多的物理空间,同时也对数据的维护和一致性检查带来了问题,当这个员工的电话号码变化时,冗余数据会导致对多个表的更新动作,如果有一个表不幸被忽略了,那么就可能导致数据的不一致性。规范化实例为了说明方便,我们在本文中将使用一个SAMPLE数据表,来一步一步分析规范化的过程。首先,我们先来生成一个的最初始的表。CREATETABLE"SAMPLE"("PRJNUM"IN
4、TEGERNOTNULL,"PRJNAME"VARCHAR(200),"EMYNUM"INTEGERNOTNULL,"EMYNAME"VARCHAR(200),"SALCATEGORY"CHAR(1),"SALPACKAGE"INTEGER)IN"USERSPACE1";ALTERTABLE"SAMPLE"ADDPRIMARYKEY("PRJNUM","EMYNUM");InsertintoSAMPLE(PRJNUM,PRJNAME,EMYNUM,EMYNAME,SALCATEGORY,SALPACKAGE)valu
5、es(100001,'TPMS',200001,'Johnson','A',2000),(100001,'TPMS',200002,'Christine','B',3000),(100001,'TPMS',200003,'Kevin','C',4000),(100002,'TCT',200001,'Johnson','A',2000),(100002,'TCT',200004,'Apple','B',3000);表1-1考察表1-1,我们可以看到,这张表一共有六个字段,分析每个字段都有重复的值出现,也就是说,存在数据
6、冗余问题。这将潜在地造成数据操作(比如删除、更新等操作)时的异常情况,因此,需要进行规范化。第一范式参照范式的定义,考察上表,我们发现,这张表已经满足了第一范式的要求。1、因为这张表中字段都是单一属性的,不可再分;2、而且每一行的记录都是没有重复的;3、存在主属性,而且所有的属性都是依赖于主属性;4、所有的主属性都已经定义事实上在当前所有的关系数据库管理系统(DBMS)中,都已经在建表的时候强制满足第一范式。因此,这张SAMPLE表已经是一张满足第一范式要求的表。考察表1-1,我们首先要找出主键。可以看到,属性对
7、rojectNumber,EmployeeNumber>是主键,其他所有的属性都依赖于该主键。从一范式转化到二范式根据第二范式的定义,转化为二范式就是消除部分依赖。考察表1-1,我们可以发现,非主属性部分依赖于主键中的;非主属性,和都部分依赖于主键中的;表1-1的形式,存在着以下潜在问题:1.数据冗余:每一个字段都有值重复;2.更新异常:比如
8、字段的值,比如对值"TPMS"了修改,那么就要一次更新该字段的多个值;3.插入异常:如果新建了一个Project,名字为TPT,但是还没有Employee加入,那么将会空缺,而该字段是主键的一部分,因此将无法插入记录;InsertintoSAMPLE(PRJNUM,PRJNAME,EMY