如何设计数据库(2)?(芮)

数据规范化

•          仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构。表设计后,很可能结构不合理,出现数据重复保存,简称数据的冗余,这对数据的增删改查带来很多后患,所以我们需要审核是否合理,就像施工图设计后,还需要其他机构进行审核图纸是否设计合理一样。
•          如何审核呢?需要一些有关数据库设计的理论指导规则,这些规则业界简称数据库的范式。Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构。这些范式是:
–         第一范式(1st NF -First  Normal Fromate)
–         第二范式(2nd NF-Second  Normal Fromate)
–         第三范式(3rd NF- Third  Normal Fromate)

•          如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)。第一范式的目标是确保每列的原子性。
•          如果一个关系满足1NF,并且除了主键以外的其他列,都依赖于该主键,则满足第二范式(2NF)。第二范式要求每个表只描述一件事情,确保表中的每列,都和主键相关。
•          如果一个关系满足2NF,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)。第三范式确保每列都和主键列直接相关,而不是间接相关。

下面我们来看个形象的例子吧!假设某建筑公司要设计一个数据库。公司的业务规则概括说明如下:
•         公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等
•         公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等
•         公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)
•         公司定期制定一个工资报表,如图-1所示
 

图-1 某公司打印的工资报表

 

图-2 某公司的项目工时表

大家都看到,上面这样设计的表会有很多问题:
1.表中包含大量的冗余,可能会导致数据异常:
•          更新异常
    例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行
•          添加异常
    若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空)
•          删除异常
    例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据
2.采用这种方法设计表的结构,虽然很容易产生工资报表,但是每当一名职工分配一个工程时,都要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。


我们用第二范式规范一下:

 
我们再用第三范式规范一下,是不是明晰了很多?!


规范化和性能的关系

•          为满足某种商业目标,数据库性能比规范化数据库更重要
–         通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间
–         通过在给定的表中插入计算列(如成绩总分),以方便查询
•          进行规范化的同时,还需要综合考虑数据库的性能。数据库的三大范式和数据库的性能有时是矛盾的。

打个比方:大家都知道,环境保护非常重要,西方总是拿环保问题和中国刁难,说中国为了发展不顾环境保护、生态自然等。可中国目前的经济实力不够强大,如果人都吃不饱,空谈环保还有什么用呢?所以我们只能是在保持地区经济发展的前提下,尽量注重环保问题。这就是一种折中处理问题的典型。本例同样如此:为了满足三大范式,我们在规范化表格时就会拆分出越来越明细的表格。但客户喜欢综合的信息,为了满足客户,我们又需要把这些表通过连接查询还原为客户喜欢的综合数据。这和从一张表中读出数据相比,大大影响了数据库的查询性能。所以有时为了性能,需要做适当折中,适当牺牲规范化的要求,来提高数据库的性能。再如:在成绩表中添加一列-“成绩总分”,属于数据冗余,因为总分在查询时可由各门成绩求出来。但频繁查询成绩总分,并希望保存下来,所以有时表中就干脆添加总分这一列。
时间: 2024-08-04 16:05:28

如何设计数据库(2)?(芮)的相关文章

如何设计数据库(1)?(芮)

为什么需要设计数据库 这里我们思考两个问题: 修建茅屋需要设计吗?修建大厦需要设计吗? 结论是:当数据库比较复杂(如数据量大,表较多,业务关系复杂)时,我们需要先设计数据库: 因为,良好的数据库设计能够: q 节省数据的存储空间 q 能够保证数据的完整性 q 方便进行数据库应用系统的开发 糟糕的数据库设计: q 数据冗余.存储空间浪费 q 内存空间浪费 q 数据更新和插入的异常 软件项目开发周期 我们再来看看软件项目的开发周期: • 需求分析阶段:分析客户的业务和数据处理需求; • 概要设计阶段

[数据库设计]数据库设计三大范式

为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个

[转]oracle设计数据库应选择正确的数据类型

原文地址:http://blog.sina.com.cn/s/blog_5014663501007n40.html 在设计数据库的时候,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型,对于存储空间规划,应用性能调整都会很有帮助,下面是我个人的一点总结: 1. Char 定长格式字符串,在数据库中存储时不足位数填补空格,不建议使用,会带来不必要的麻烦 a.  字符串比较的时候,如果不注意(char不足位补空格)会带来错误 b.  字符串比较的时候,如果用trim函数,这样该字段上

mysql之设计数据库

设计数据库的步骤 1.充分了解需求文档2.从需求文档中抽实体 实体:就是真实存在的事物(名词) 3.通过需求抽出每个实体的属性 实体的属性:就是实体的描述以及特征 4.分析实体之间关系建立关系 实体的关系:就是事物与事物存在的联系 5.将实体,属性 表间的关系转化为E-R图 长方形 表示 实体 椭圆 表示实体的属性 菱形 表示实体之间关系 6.将实体转化为表结构 实体名称:就是表名 实体属性: 就是其的字段 7.根据需求和需要 设置每个表的主键,设置表间关系等

Synopsys.milkway.vH-2013.Linux32_64 2CD设计数据库

Synopsys.milkway.vH-2013.Linux32_64 2CD设计数据库Synopsys的Milkway设计数据库已对第三方开放访问,该数据库是Galaxy设计平台的关键组成部分.Galaxy设计平台将通过使■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□ + 诚信合作,保证质量!!!长期有效: + 电话TEL:18980583122 客服 QQ:1140988741 邮件(Email):[email protected] ■□■□■□■□■□■□■□■□

20个设计数据库的最佳实践指南

数据库设计看上去很简单,但是如果不经意随意设计,可能会为日后维护拓展或性能方面埋下祸根.以下是20个设计数据库的最佳实践指南: 1. 使用完整的一致的数据表名称和字段名,如:School, StudentCourse, CourseID 2.数据表名称使用单数,比如使用StudentCourse 而不是StudentCourses,数据表代表实体的一个集合,因此没有必要使用复数名称. 3. 数据表名称不要使用空格,比如StudentCourse 比Student Course更好. 4.数据表名

用面向对象的思维方式来设计数据库

场景 我们有多种类型订单:实物订单.特享商户订单.核销订单.生活缴费订单.电影票订单.机票订单.以及以后会持续新增的未知类型订单,它们都存放在不同的订单类型表中 影响 导致有些业务做起来会比较痛苦 比如: 统计当前用户未付款订单总数 在列表中显示当前用户在某个时间段内所有未支付订单的信息(实现方式如上) 例外还会有个未知因素:持续新增的未知类型订单 每新增一种内型订单,上面的实现都将随之新增业务代码.各种蛋疼. 思路 上次换工作,面试遇到一道面试题,如下: "请设计数据库,用来存放 老师.学生等

设计数据库需要考虑到的问题

成功的管理系统=50% 的业务+(25%的数据库+25%的程序) 1.考察现有系统环境    大多数数据库项目都不是从头开始建立的,通常机构内总会存在用来满足特定需求的现有系统.显然,现有系统并不完美,否则你就不必再建立新系统了.但是对旧系统的研究可以让你发现一些可能会忽略的细微问题.一般来说,考察现有系统对你绝对有好处. 2.充分预计需求的升级趋势    询问用户如何看待未来需求变化非常有用,这样做可以达到两个目的:首先,可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈:其次

使用PowerDesigner设计数据库

使用PowerDesigner设计数据库 设计数据库有如下6个主要步骤: 1.需求分析:了解用户的数据需求.处理需求.安全性及完整性要求: 2.概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型: 3.逻辑结构设计:设计系统的模式和外模式,对于关系模型主要是基本表和视图: 4.物理结构设计:设计数据的存储结构和存取方法,如索引的设计: 5.系统实施:组织数据入库.编制应用程序.试运行: 6.运行维护:系统投入运行,长期的维护工作. 在此我要说的是使用PowerDesigner设计数据库的

设计数据库步骤

设计数据库 •          在需求分析阶段,设计数据库的一般步骤为: –         收集信息 –         标识对象 –         标识每个对象的属性 –         标识对象之间的关系 •          在概要设计阶段和详细设计阶段,设计数据库的步骤为: –         绘制E-R图 –         将E-R图转换为表格 –         应用三大范式规范化表格 下面我们以一个BBS简易论坛的数据库设计为例来看看设计数据库的步骤: 收集信息: 与该系统