数据规范化

•          仅有好的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

如何设计数据库(2)相关推荐

  1. 设计数据库字段或者java中使用boolean型时需谨慎

    boolean型变量只有两个值 false和true,我们在设计数据库字段时或者定义java变量时会使用boolean,通常情况下开关类的变量使用无可非议,但请一定要考虑到扩展性. 使用前请仔细考虑一 ...

  2. 时间字段 oracle 经验 设计,数据库设计与优化

    一.设计技巧 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即 ...

  3. db2查看表结构_作为后端开发如何设计数据库系列文章(一)设计传统系统表结构(Java开发)...

    本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. 以前经常能够看到,数据库范式,现在说数据库三大范式的少了. 三大范式我以前也很严格的弄 ...

  4. mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...

    今天的目标: mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题 先讲约束: 要他唯一 不能重复 不能空值 : 什么是 mysql的约束: 对mysql 进行约束 2.2  默 ...

  5. 数据库综合设计java_JAVA程序综合设计数据库设计_

    JAVA程序综合设计数据库设计_ 北华大学开放实验报告实验项目名称: JAVA 程序综合设计(数据库设计)所属课程名称: 面对象程序设计--JAVA 实 验 类 型: 设 计 型 班 级: 信 息 1 ...

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

    原文地址:http://blog.sina.com.cn/s/blog_5014663501007n40.html 在设计数据库的时候,选择正确的数据类型,往往可以避免很多的问题,正确理解数据库的类型 ...

  7. PowerDesigner设计数据库

    PowerDesigner设计数据库 李伟华 2000年9月 说明:此文档为本人经验积累之所得,非部门设计文档(版权所有) 本文档不讲述如何使用PowerDesigner,而是讲述如何将PowerDe ...

  8. EA强大的画图工具---设计数据库表格

    关于EA这个优秀的软件是从师哥哪里听来的,自己瞎点了点,感觉也没什么.最近和和智福加上一个师哥合作敲机房收费系统时,想到之前听人说EA很强大,便随便找了找关于EA使用的帮助手册.果然惊喜-- 如题,这 ...

  9. 设计数据库表时,你真的会选数据类型吗

    转载自  设计数据库表时,你真的会选数据类型吗 关系型数据库,是开发人员最常接触的持久化存储之一了,使用关系型数据库有很多好处,比如支持通过事务处理保持数据的一致性.数据更新的开销很小.可以进行Joi ...

  10. 初学者设计数据库_面向初学者的完整数据库设计课程

    初学者设计数据库 This database design course will give you a deeper grasp of database design. Caleb Curry te ...

最新文章

  1. androidstudio常见问题
  2. Spring Boot 配置文件详解
  3. 2009年出现的计算机术语,2009年计算机一级考试真题及答案
  4. python函数教程:global 和 nonlocal的详细用法
  5. ecu故障现象_【案例】柴油电喷车维修故障案例
  6. 2017最新顺口溜出炉(超级经典)!
  7. JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell
  8. 厉害了!《流浪地球》《疯狂的外星人》票房均破10亿元大关
  9. window启动过程讲解--PPT截图[张银奎]
  10. python 栈_python:栈的理解与应用
  11. LVM 的创建,扩展,缩减及建立快照
  12. CSS盒模型详解(图文教程)
  13. vscode之 wget下载zip文件并unzip解压zip文件
  14. 微信保存图片提示失败_微信为什么保存不了图片
  15. 特效制作思路(技术层面)
  16. blast在linux上的用法
  17. 局域网唤醒 外网无法唤醒_为您的网络设置局域网唤醒控制面板
  18. Fig (无花果)任务流水线式 多线程框架使用
  19. 一起弄个微信订阅号鉴黄机器人
  20. 【深度学习】ReID相关知识点解析(PCB、BoT、MGN)

热门文章

  1. 开源运动发展史与开源许可证(BSD、GPL、Apache、MIT、木兰(中国))的那些事儿
  2. 面渣逆袭:Java集合连环三十问
  3. html图片布满全屏
  4. 继承与派生(Part Ⅲ)——多重继承 虚基类
  5. iMessage app 开发
  6. 分享微信群内成员快速统计报名,看完超级简单
  7. 华为FreeBuds 5左右耳音量大小不同的解决办法。
  8. 宝塔7Linux去掉文件夹的锁
  9. LaTex将普通图片格式转换成高清图片格式eps
  10. 计算机 我们一起学猫叫歌词,我们一起学猫叫歌词