如何设计数据库(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所示

 

工程号

工程名称

职工号

姓名

职务

小时工资率

工时

实发工资

A1

花园大厦

1001

齐光明

工程师

65

13

845.00

1002

李思岐

技术员

60

16

960.00

1004

葛宇宏

律师

60

19

1140.00

 

 

 

小计

 

 

 

2945.00

A2

立交桥

1001

齐光明

工程师

65

15

975.00

1003

鞠明亮

工人

55

17

935.00

 

 

 

小计

 

 

 

1910.00

A3

临江饭店

1002

李思岐

技术员

60

18

1080.00

1004

葛宇洪

律师

60

14

840.00

 

 

 

小计

 

 

 

1920.00

 

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

 

 

工程号

工程名称

职工号

姓名

职务

小时工资率

工时

A1

花园大厦

1001

齐光明

工程师

65

13

A1

花园大厦

1002

李思岐

技术员

60

16

A1

花园大厦

1004

葛宇洪

律师

60

19

A2

立交桥

1001

齐光明

工程师

65

15

A2

立交桥

1003

鞠明亮

工人

55

17

A3

临江饭店

1002

李思岐

技术员

60

18

A3

临江饭店

1004

葛宇洪

律师

60

14

 

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

 

大家都看到,上面这样设计的表会有很多问题:

1.表中包含大量的冗余,可能会导致数据异常:

•          更新异常 

    例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行

•          添加异常 

    若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空)

•          删除异常 

    例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据

2.采用这种方法设计表的结构,虽然很容易产生工资报表,但是每当一名职工分配一个工程时,都要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。

 

 

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

 

 

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

 

规范化和性能的关系

 

•          为满足某种商业目标,数据库性能比规范化数据库更重要

–         通过在给定的表中添加额外的字段,以大量减少需要从中搜索信息所需的时间

–         通过在给定的表中插入计算列(如成绩总分),以方便查询

•          进行规范化的同时,还需要综合考虑数据库的性能。数据库的三大范式和数据库的性能有时是矛盾的。

 

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


转自:http://blog.csdn.net/lenotang/article/details/3304575

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要包含最基础的数据库语句,很适合初学者,目标使用企业管理器创建数据库表设置表的主键、外键和建立表之间的关系为表增加约束数据完整性 数据完整性 数据存放在表中 “数据完整性的问题大多是由于设计引起的” 创建表的时候,就应当保证以后数据输入是正确的 ——错误的数据、不符合要求的数据不允许输入完整性包括… 输入的类型是否正确? ——年龄必须是数字输入的格式是否正确? ——身份证号码必须是18位是否在允许的范围内? ——性别只能是”男”或者”女” 是否存在重复输入? ——学员信息输入了两次是否符合其他特定要求? ——信誉值大于5的用户才能够加入会员列表 …… 完整性包括… 实体完整性域完整性引用完整性自定义完整性表操作创建数据库表 SQL Server的数据类型思考创建数据库表思考创建数据库表思考选择主键的原则创建数据库表思考创建数据库表创建数据库表关系图主表和从表创建数据库表-7 创建数据库表完毕!导入-导出数据总结 SQL Server创建表的过程饰淦麈定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)保证的过程实体完整性数据行不能存在重复,引用完整性要求子表中的相关项必须在主表中存在域完整性实现了对输入到特定列的数值的限制 SQL Server中存在五种约束,分别是:主键约束、外键约束、检查约束、默认约束和唯一性约束(唯一性约束将在后续课程中使用SQL语句实现)总结创建数据库表需要:确定表的列名、数据类型、是否允许为空,还需要确定主键、必要的默认值、标识列和检查约束如果建立了主表和子表的关系,则: ——子表中的相关项目的数据,在主表中必须存在; ——主表中相关项的数据更改了,则子表对应的数据项也应当随之 更改; ——在删除子表之前,不能够删除主表;回顾SQL Server的约束约束的目的:确保表中数据的完整型常用的约束类型:主键约束(Primary Key Constraint):要求主键列数据唯一,并且不允许为空唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束默认约束(Default Constraint):某列的默认值,如我们的男性学员较多,性别默认为“男” 外键约束(Foreign Key Constraint):用于两表间建立关系,需要指定引用主表的那列添加约束 添加约束的语法:添加约束示例添加约束示例删除约束如果错误地添加了约束,我们还可以删除约束 删除约束的语法第二部分 数据库设计课程目标了解设计数据库的基本步骤熟练使用T-SQL实现建库、建表、加约束掌握T-SQL编程,实现功能强大的查询掌握创建索引、视图,快速访问数据库 掌握创建存储过程,实现复杂的业务规则理解触发器的原理,实现高级的约束目标了解设计数据库的步骤掌握如何绘制数据库的E-R图理解数据库的规范化-三大范式为什么需要设计数据库 2-1 为什么需要设计数据库 2-2 软件项目开发周期需求分析阶段:分析客户的业务和数据处理需求; 概要设计阶段:设计数据库的E-R模型图,确认需求信息 的正确和完整; 详细设计阶段:将E-R图转换为多张表,进行逻辑设计, 并应用数据库设计的三大范式进行审核; 代码编写阶段:选择具体数据库进行物理实现,并编写 代码实现前端应用; 软件测试阶段:…… 安装部署:…… 设计数据库的步骤4-1 收集信息: 与该系统有关人员进行交流、坐谈,充分理解数据库需要完成的任务 设计数据库的步骤4-2 标识对象(实体-Entity) 标识数据库要管理的关键对象或实体 设计数据库的步骤4-3 设计数据库的步骤4-4 标识对象之间的关系(Relationship) 绘制E-R图 4-1 E-R(Entity-Relationship)实体关系图 绘制E-R图 4-2 绘制E-R图 4-3 映射基数绘制E-R图如何将E-R图转换为表 3-1 如何将E-R图转换为表 3-2 如何将E-R图转换为表数据规范化 仅有好的RDBMS并不足以避免数据冗余,必须在数据库设计中创建好的表结构 Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构。这些范式是:第一范式(1st NF -First Normal Fromate) 第二范式(2nd NF-Second Normal Fromate) 第三范式(3rd NF- Third Normal Fromate) 第一范式 (1st NF) 第二范式 (2nd NF) 第三范式 (3rd NF) 规范化实例 5-1 假设某建筑公司要设计一个数据库。公司的业务规则概括说明如下:公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)公司定期制定一个工资报表,如图-1所示规范化实例 5-2 规范化实例 5-3 规范化实例 5-4 1.表中包含大量的冗余,可能会导致数据异常:更新异常 例如,修改职工号=1001的职务,则必须修改所有职工号=1001的行添加异常 若要增加一个新的职工时,首先必须给这名职工分配一个工程。或者为了添加一名新职工的数据,先给这名职工分配一个虚拟的工程。(因为主关键字不能为空)删除异常 例如,1001号职工要辞职,则必须删除所有职工号=1001的数据行。这样的删除操作,很可能丢失了其它有用的数据规范化实例 5-5 2.采用这种方法设计表的结构,虽然很容易产生工资报表,但是每当一名职工分配一个工程时,都要重复输入大量的数据。这种重复的输入操作,很可能导致数据的不一致性。 应用范式规范化设计应用第二范式规范化应用第三范式规范化规范化和性能的关系 总结 2-1 在需求分析阶段,设计数据库的一般步骤为:收集信息标识对象标识每个对象的属性标识对象之间的关系在概要设计阶段和详细设计阶段,设计数据库的步骤为:绘制E-R图将E-R图转换为表格应用三大范式规范化表格总结 2-2 为了设计结构良好的数据库,需要遵守一些专门的规则,称为数据库设计范式 。第一范式(1NF)的目标:确保每列的原子性。第二范式(2NF)的目标:确保表中的每列,都和主键相关 第三范式(3NF)的目标:确保每列都和主键列直接相关,而不是间接相关 第三部分 常用的SQL语法及技巧查询-单表查询 SELECT <选择列表> FROM [[<数据库名>.]<模式名>.]<基表名> | <视图名> <相关名> [

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值