- 浏览: 1500763 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
简介: 关系数据库设计的核心问题是关系模型的设计。本文将结合具体的实例,介绍数据库设计规范化的流程。
<!-- <p class="ibm-no-print"> <div id="dw-tag-this" class="ibm-no-print"></div> <div id="interestShow" class="ibm-no-print"></div> </p> -->
发布日期: 2006 年 5 月 31 日
级别: 初级
访问情况 15022 次浏览
建议: 0 (添加评论) <!-- Rating_Area_Begin --><!-- Ensure that div id is based on input id and ends with -widget -->
IBM 为社区提供了 DB2 免费版本 DB2 Express-C,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。
关系型数据库是当前广泛应用的数据库类型,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构。然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句的是很笨拙并且效率低下的。更糟糕的是,由于表结构定义的不合理,会导致在更新数据时造成数据的不完整。因此,就有必要学习和掌握数据库的规范化流程,以指导我们更好的设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。本文将结合具体的实例,介绍数据库规范化的流程。
本文的目的就是通过详细的实例来阐述规范化的数据库设计原则。在DB2中,简洁、结构明晰的表结构对数据库的设计是相当重要的。规范化的表结构设计,在以后的数据维护中,不会发生插入(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,我们首先要找出主键。可以看到,属性对<Project Number, Employee Number>是主键,其他所有的属性都依赖于该主键。
根据第二范式的定义,转化为二范式就是消除部分依赖。
考察表1-1,我们可以发现,非主属性<Project Name>部分依赖于主键中的<Project Number>; 非主属性<Employee Name>,<Salary Category>和<Salary package>都部分依赖于主键中的<Employee Number>;
表1-1的形式,存在着以下潜在问题:
1. 数据冗余:每一个字段都有值重复;
2. 更新异常:比如<Project Name>字段的值,比如对值"TPMS"了修改,那么就要一次更新该字段的多个值;
3. 插入异常:如果新建了一个Project,名字为TPT, 但是还没有Employee加入,那么<Employee Number>将会空缺,而该字段是主键的一部分,因此将无法插入记录;
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 = 200003
Select 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-3
CREATE 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 Number Employee Name Salary Category Salary Package
200001 Johnson A 2000
200002 Christine B 3000
200003 Kevin C 4000
200004 Apple B 3000
|
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存在传递依赖关系,即:关键字段< Employee Number > --> 非关键字段< Salary Category > -->非关键字段< Salary Package >。而这是不满足三范式的规则的,存在以下的不足:
1、 数据冗余:<Salary Category>和<Salary Package>的值有重复;
2、 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况;
3、 删除异常:同样的,如果员工 200003 Kevin 离开了公司,会直接导致 Salary C 的信息的丢失。
Delete from EMPLOYEE where EMYNUM = 200003
Select 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经过规范化步骤,得到四张表,满足了三范式的约束要求,数据冗余、更新异常、插入异常和删除异常。
在三范式之上,还存在着更为严格约束的BC范式和四范式,但是这两种形式在商业应用中很少用到,在绝大多数情况下,三范式已经满足了数据库表规范化的要求,有效地解决了数据冗余和维护操作的异常问题。
在本文描述的过程中,我们通过结合实例的方法,通俗地演绎了数据表规范化的过程,并展示了在此过程中数据冗余、数据库操作异常等问题是如何得到解决的。
在具体的工程应用中,运用数据库规范化的方法来设计数据库表,将是具有现实意义的。
<!-- CMA ID: 125680 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-document-html-6.0.xsl -->-
Database Normalization Basics:数据库规范化基础原则
-
Normalization principles:数据库规范化原则和范式定义
发表评论
-
SQL查询顺序处理
2011-09-15 11:29 1628select的解析执行顺序1. from语句 2. where ... -
概念模型、逻辑模型、物理模型区别
2011-09-08 10:48 1232http://wenku.baidu.com/view/9a6 ... -
数据库设计准则(第一、第二、第三范式说明)
2011-09-07 10:17 1277I、关系数据库设计范式 ... -
oracle日志文件及归档日志模式
2011-09-01 10:18 1758oracle数据库中分为联机日志文件和归档日志文件两种日志文件 ... -
Oracle重做日志管理
2011-09-01 09:50 1436Oracle重做日志操作是为了记录数据的改变,提供数据库 ... -
Oracle复制技术的分布式系统同步应用
2011-08-28 17:41 1293本文将结合一个实际案例,讲解Oracle复制技术在分布 ... -
oracle数据同步
2011-08-28 14:34 993首先创建一个 dblink(dat ... -
Oracle 流复制(Stream Replication)
2011-07-20 10:37 5625Stream 是Oracle 的消息队列( ... -
表分区
2011-06-30 09:21 1679分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用 ... -
数据库大型应用解决方案总结(1)
2011-06-22 18:01 1391随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设 ... -
oracle_SQL中ROWID与ROWNUM的使用
2011-06-16 10:51 1425对于 Oracle 的 rownum 问题,很多资料都说不支持 ... -
oracle函数手册
2011-06-08 09:22 1184SQL中的单记录函数1.ASCII ... -
oracle基础文档
2011-06-03 09:10 1240oracle基础文档 -
ORACLE 找回误删的数据库
2011-06-02 14:14 1369同事找回时操作的数据库为oracle 10g , 之前删除方式 ... -
为什么Oracle有时会用索引来查找数据?--强制Oracle使用最优的“执行计划”
2011-06-01 09:04 1742[摘要] 在你运用SQL语言,向数据库发布一条查询语句时,O ... -
sql编程规范与性能
2011-05-31 08:40 1277sql编程规范与性能 -
Nested Loops Join(嵌套连接)
2011-04-13 16:21 11576说明:最近找到了一个 ... -
如何看Oracle执行计划
2011-01-14 15:43 2187oracle执行计划解释 ... -
oracle中分析sql语句执行计划的方法
2011-01-14 15:36 2229如何生成explain plan? 解答:运行utl ... -
oracle sql 语句(二)
2010-12-10 09:17 144327建立序列:(注意,这里并没有出现说是哪个表里面的序列 ...
相关推荐
### 数据库设计原则——规范化详解 #### 一、引言 在关系数据库设计过程中,规范化是一种重要的设计方法,它能够帮助我们减少数据冗余、提高数据完整性并优化数据存储效率。随着项目的扩大,数据库设计变得越来越...
规范化-数据库设计原则 数据库设计的核心问题是关系模型的设计。关系数据库设计是对数据进行组织化和结构化的过程。核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构...
【规范化数据库设计原则详解】 关系型数据库是现代信息系统的基础,其设计的核心在于关系模型的构建。随着项目规模的扩大,数据库的复杂性也随之增加,此时,数据库设计的规范化显得尤为重要。规范化是解决数据库中...
11. **数据库设计原则**:如KISS(保持简单和愚蠢)、YAGNI(你不会需要它)等,可以帮助避免过度设计。 12. **数据库设计工具**:例如MySQL Workbench、Oracle SQL Developer等,可以帮助我们更直观地进行数据库...
文档的编写目的主要是为了规范数据库设计过程,明确设计目标,使开发人员能够理解并遵循设计原则,确保数据库系统满足软件系统的功能需求和性能指标。 1.2 背景 背景部分介绍了项目的基本情况,如项目的目标、预期...
《数据库设计开发规范-阿里.pdf》是一份由阿里巴巴云数据库服务部门编制的技术文档,旨在为数据库设计和开发提供一套全面且规范化的指导原则。该文档涵盖了Oracle和MySQL两大主流数据库系统的具体规范,并针对每种...
4. 规范化理论:数据库设计应遵循第一范式(1NF)、第二范式(2NF)、第三范式(3NF),以及更高的BCNF和4NF,以减少数据冗余和提高数据一致性。 5. 主键与外键:主键用于唯一标识表中每一行,应选择不为空且唯一的...
数据库设计的基本步骤通常遵循自顶向下、逐步细化的原则,分为四个阶段: 1. 需求分析,收集和分析用户需求,创建需求说明书,包括数据元数据,用数据字典管理以确保数据一致性和统计。 2. 概念结构设计,构建反映...
数据库设计与开发是软件工程研究生课程中的核心部分,它涵盖了数据管理、数据库系统架构、查询语言、数据库设计原则以及数据库应用程序开发等多个方面。这个压缩包文件"软件工程研究生的课程---数据库设计开发.rar...
数据库设计需遵循一定的规范化原则,以减少数据冗余和提高数据一致性。常见的范式有: 1. 第一范式(1NF):确保每个字段都不可再分。 2. 第二范式(2NF):在1NF基础上,消除部分函数依赖。 3. 第三范式(3NF):在...
规范化理论在此过程中起到关键作用,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等,确保数据的完整性和减少冗余。 数据库开发包括了数据库的实施和优化。在实施阶段,我们使用特定的数据库管理系统(如...
《2021最新产品需求模板系列-数据库设计文档》是针对XX公司xx事业部的一项重要工作成果,旨在提供一个规范化的数据库设计模板,以满足产品需求分析的要求。这份文档详细阐述了数据库设计的基本原则、业务需求以及...
Normalization 是对数据进行规范化的过程,以确保数据的一致性和完整性。标准化是对数据进行格式化的过程,以确保数据的可读性和可维护性。安全性是对数据进行保护的过程,以防止数据的泄露和损坏。可扩展性是指...
- **基于3NF**:从需求分析开始,确定依赖关系,通过规范化形成符合3NF的模式集合。 - **基于视图**:从各个应用的数据需求出发,设计视图并转化为数据库模式。 设计步骤通常包括企业模式设计、概念模式设计、...
数据库设计与开发规范是软件开发过程中的重要环节,特别是在大型企业如阿里巴巴这样的环境中,严谨的数据库规范能够确保数据的一致性、稳定性和高效性。本规范主要针对MySQL,但也适用于Oracle等其他数据库系统。 1...
通过这个项目,学习者将有机会实践数据库设计原则,掌握SQL语句的编写,理解JDBC的用法,以及学会如何在Java应用中处理数据库事务和优化查询性能。这是一个全面且实用的学习资源,对于提升数据库管理和Java开发能力...
综上所述,"北京大学软件工程研究生的课程---数据库设计开发"涵盖了数据库系统的核心概念、设计原则、SQL操作、事务处理、并发控制以及分布式和大数据处理等内容,是一门全面而深入的课程,对于未来在软件工程领域...
【开发大型项目参考-数据库设计规范】 在进行大型项目的数据库设计时,遵循一套严谨的规范至关重要,这不仅可以确保系统的稳定性和可维护性,还能提高团队之间的沟通效率。国内知名大型软件公司的数据库设计规范...