规范化-数据库设计原则(案例).doc_第1页
规范化-数据库设计原则(案例).doc_第2页
规范化-数据库设计原则(案例).doc_第3页
规范化-数据库设计原则(案例).doc_第4页
规范化-数据库设计原则(案例).doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关系数据库设计的核心问题是关系模型的设计。本文将结合具体的实例,介绍数据库设计规范化的流程。摘要关系型数据库是当前广泛应用的数据库类型,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构。然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句的是很笨拙并且效率低下的。更糟糕的是,由于表结构定义的不合理,会导致在更新数据时造成数据的不完整。因此,就有必要学习和掌握数据库的规范化流程,以指导我们更好的设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。本文将结合具体的实例,介绍数据库规范化的流程。序言本文的目的就是通过详细的实例来阐述规范化的数据库设计原则。在oracle中,简洁、结构明晰的表结构对数据库的设计是相当重要的。规范化的表结构设计,在以后的数据维护中,不会发生插入(insert)、删除(delete)和更新(update)时的异常。反之,数据库表结构设计不合理,不仅会给数据库的使用和维护带来各种各样的问题,而且可能存储了大量不需要的冗余信息,浪费系统资源。要设计规范化的数据库,就要求我们根据数据库设计范式也就是数据库设计的规范原则来做。但是一些相关材料上提到的范式设计,往往是给出一大堆的公式,这给设计者的理解和运用造成了一定的困难。因此,本文将结合具体形象的例子,尽可能通俗化地描述三个范式,以及如何在实际工程中加以优化应用。规范化在设计和操作维护数据库时,关键的步骤就是要确保数据正确地分布到数据库的表中。使用正确的数据结构,不仅便于对数据库进行相应的存取操作,而且可以极大地简化应用程序的其他内容(查询、窗体、报表、代码等)。正确进行表设计的正式名称就是数据库规范化。后面我们将通过实例来说明具体的规范化的工程。关于什么是范式的定义,请参考附录文章 1.数据冗余数据应该尽可能少地冗余,这意味着重复数据应该减少到最少。比如说,一个部门雇员的电话不应该被存储在不同的表中, 因为这里的电话号码是雇员的一个属性。如果存在过多的冗余数据,这就意味着要占用了更多的物理空间,同时也对数据的维护和一致性检查带来了问题,当这个员工的电话号码变化时,冗余数据会导致对多个表的更新动作,如果有一个表不幸被忽略了,那么就可能导致数据的不一致性。规范化实例为了说明方便,我们在本文中将使用一个SAMPLE数据表,来一步一步分析规范化的过程。首先,我们先来生成一个的最初始的表。CREATE TABLE SAMPLE ( PRJNUM INTEGER NOT NULL, PRJNAME VARCHAR(200), EMYNUM INTEGER NOT NULL, EMYNAME VARCHAR(200), SALCATEGORY CHAR(1), SALPACKAGE INTEGER) IN USERSPACE1; ALTER TABLE SAMPLE ADD PRIMARY KEY (PRJNUM, EMYNUM); Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(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,我们可以看到,这张表一共有六个字段,分析每个字段都有重复的值出现,也就是说,存在数据冗余问题。这将潜在地造成数据操作(比如删除、更新等操作)时的异常情况,因此,需要进行规范化。第一范式参照范式的定义,考察上表,我们发现,这张表已经满足了第一范式的要求。1、因为这张表中字段都是单一属性的,不可再分;2、而且每一行的记录都是没有重复的;3、存在主属性,而且所有的属性都是依赖于主属性;4、所有的主属性都已经定义事实上在当前所有的关系数据库管理系统(DBMS)中,都已经在建表的时候强制满足第一范式。因此,这张SAMPLE表已经是一张满足第一范式要求的表。考察表1-1,我们首先要找出主键。可以看到,属性对是主键,其他所有的属性都依赖于该主键。从一范式转化到二范式根据第二范式的定义,转化为二范式就是消除部分依赖。考察表1-1,我们可以发现,非主属性部分依赖于主键中的; 非主属性,和都部分依赖于主键中的;表1-1的形式,存在着以下潜在问题:1 数据冗余:每一个字段都有值重复;2 更新异常:比如字段的值,比如对值TPMS了修改,那么就要一次更新该字段的多个值;3 插入异常:如果新建了一个Project,名字为TPT, 但是还没有Employee加入,那么将会空缺,而该字段是主键的一部分,因此将无法插入记录;Insert into SAMPLE(PRJNUM, PRJNAME, EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(100003, TPT, NULL, NULL, NULL, NULL)4 删除异常:如果一个员工 200003, Kevin 离职了,要将该员工的记录从表中删除,而此时相关的Salary信息 C 也将丢失, 因为再没有别的行纪录下 Salary C的信息。Delete from sample where EMYNUM = 200003Select distinct SALCATEGORY, SALPACKAGE from SAMPLE因此,我们需要将存在部分依赖关系的主属性和非主属性从满足第一范式的表中分离出来,形成一张新的表,而新表和旧表之间是一对多的关系。由此,我们得到:CREATE TABLE PROJECT ( PRJNUM INTEGER NOT NULL, PRJNAME VARCHAR(200) IN USERSPACE1; ALTER TABLE PROJECT ADD PRIMARY KEY (PRJNUM); Insert into PROJECT(PRJNUM, PRJNAME) values(100001, TPMS), (100002, TCT); 表1-2表 1-3CREATE TABLE EMPLOYEE ( EMYNUM INTEGER NOT NULL, EMYNAME VARCHAR(200), SALCATEGORY CHAR(1), SALPACKAGE INTEGER) IN USERSPACE1; ALTER TABLE EMPLOYEE ADD PRIMARY KEY (EMYNUM); Insert into EMPLOYEE(EMYNUM, EMYNAME, SALCATEGORY, SALPACKAGE) values(200001, Johnson, A, 2000), (200002, Christine, B, 3000), (200003, Kevin, C, 4000), (200004, Apple, B, 3000); Employee NumberEmployee NameSalary CategorySalary Package 200001JohnsonA2000 200002ChristineB3000 200003KevinC4000 200004AppleB3000 CREATE TABLE PRJ_EMY ( PRJNUM INTEGER NOT NULL, EMYNUM INTEGER NOT NULL) IN USERSPACE1; ALTER TABLE PRJ_EMY ADD PRIMARY KEY (PRJNUM, EMYNUM); Insert into PRJ_EMY(PRJNUM, EMYNUM) values(100001, 200001), (100001, 200002), (100001, 200003), (100002, 200001), (100002, 200004); 同时,我们把表1-1的主键,也就是表1-2和表1-3的各自的主键提取出来,单独形成一张表,来表明表1-2和表1-3之间的关联关系:表 1-4这时候我们仔细观察一下表1-2, 1-3, 1-4, 我们发现插入异常已经不存在了,当我们引入一个新的项目 TPT 的时候,我们只需要向表1-2 中插入一条数据就可以了, 当有新人加入项目 TPT 的时候,我们需要向表1-3, 1-4 中各插入一条数据就可以了。虽然我们解决了一个大问题,但是仔细观察我们还是发现有问题存在。从二范式转化到三范式考察表前面生成的三张表,我们发现,表1-3存在传递依赖关系,即:关键字段 - 非关键字段 -非关键字段。而这是不满足三范式的规则的,存在以下的不足:1、 数据冗余:和的值有重复;2、 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况;3、 删除异常:同样的,如果员工 200003 Kevin 离开了公司,会直接导致 Salary C 的信息的丢失。Delete from EMPLOYEE where EMYNUM = 200003Select distinct SALCATEGORY, SALPACKAGE from EMPLOYEE因此,我们需要继续进行规范化的过程,把表1-3拆开,我们得到:表 1-5和表 1-6这时候如果 200003 Kevin 离开公司,我们只需要从表 1-5 中删除他就可以了, 存在于表1-6中的Salary C信息并不会丢失。但是我们要注意到除了表 1-5 中存在 Kevin 的信息之外, 表1-4中也存在 Kevin 的信息, 这很容易理解, 因为 Kevin 参与了项目 100001, TPMS, 所以当然也要从中删除。 至此,我们将表1-1经过规范化步骤,得到四张表,满足了三范式的约束要求,数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论