数据库规范化理论研究.doc_第1页
数据库规范化理论研究.doc_第2页
数据库规范化理论研究.doc_第3页
数据库规范化理论研究.doc_第4页
数据库规范化理论研究.doc_第5页
免费预览已结束,剩余18页可下载查看

下载本文档

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

文档简介

数据库规范化理论研究河北经贸大学毕业论文数据库规范化理论研究专业名称:计算机科学与技术班 级: 学生姓名: 指导老师: 完成时间: 河北经贸大学毕业论文摘 要数据库理论的研究主要集中于关系的规范化理论、关系数据理论等。近年来,随着人工智能与数据库理论的结合、并行计算技术等的发展,数据库逻辑演艺和知识推理、数据库中的知识的发展(Knowledge Discover From Database,简称KDD)、并行计算等成为新的理论研究。但是数据库的规范化理论是各方面发展的基础。本文着重研究了数据库的规范化理论。规范化的思想是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”,即“一事一地”的模式设计原则。让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于个概念就把它“分离”出去。因此所谓规范化实质上就是概念的单一化。关系模式的规范化过程是通过对关系模式的分解来实现的。把低一级的关系模式分解为若干个高一级的关系模式。但是这种分解不是唯一的。具体分解方法正文中将作详述。关键词: 数据库技术发展;规范化;反规范化;函数依赖范式Abstract Main concentration of the research of the database theories is in the relations normal theories, relation data theories etc. In recent years, along with the combination of the artificial intelligence and database theories, proceed together the calculation technique the development, database logic that wait the show business to reason logically with knowledge, the development (Knowledge Discovery from Database, brief name KDD) of the knowledge in the database, proceed together the calculation the etc. to become the new theories research. But the databases normal theories is the base of other development. This text put great emphasis on to study the databases normal theories. The thought of the normal gradually dissolve the data to depend on the insides not fit part, make the mode of each relation in the mode attain a certain degree of separate , namely a matter a ground of mode design principle. Let a relation describe a concept, an entity or a kind of contact of the entity. If precious sight more a concept it separate out.Therefore the so-called normal substantially is the concepts lonely. Relation the modes normal the process is a decomposition to pass right relation mode to come realizing of. Resolve low and first-degree relation mode to some the high and first-degree relation mode. But this kind of resolve to is not unique. Concrete decomposition method will make the description in the text.KEYWORD: DATABASE;TECHNOLOGY;DEVELOPMENT;NORMALIZATION;FUNCTIONAL;DEPENDENCY;FORM目 录1 数据库技术的发展11.1 第一代数据库21.2 第二代数据库关系数据库系统31.3 传统数据库系统的局限性51.4 新一代数据库的特点82 关系数据理论102.1 函数依赖102.2 数据的规范化112.2.1 1NF112.2.2 2NF122.2.3 3NF122.2.4 小结132.3 数据的反规范132.3.1 反规范的好处132.3.2 常用的反规范技术142.3.3 反规范技术需要维护数据的完整性153 数据库规范化的技巧16致谢19参考文献2019数据库规范化理论研究1 数据库技术的发展了解当前数据库技术的发展,研究数据库发展的动向,分析各种新型数据库的特点,对数据库技术的研究和应用具有重大的意义。以数据模型、数据库应用、数据库管理系统开发技术三个方面为主线,概述数据库发展历程,向读者展示数据库学科在理论、应用和系统开发等方面的研究内容和发展方向,目的在于向读者提供一个宏观的、总体的数据库学科的视图,使读者既能了解数据库的新进展,又能了解数据库技术发展的来龙去脉;既能了解新的数据库分支的基础,又能了解这些分支之间的相互联系。数据库技术从60年代中期产生到今天仅仅30年的历史。其发展速度之快,使用范围之广是其它技术所远不及的。短短30年已从第一代的网状、层次数据库,第二代的关系数据库系统,发展到第三代以面向对象模型为主要特征的数据库系统。数据库技术、网络通信技术、人工智能技术、面向对象程序设计技术、并行计算技术等等互相渗透,互相结合,成为当前数据库技术发展的主要特征。 数据模型是数据库系统的核心和基础。因此,数据库发展阶段的划分应该以数据模型的进展作为主要的依据和标志。层次数据库系统和网状数据库系统的数据模型虽然分别为层次和网状模型,但实质上层次模型是网状模型的特例。它们都是格式化模型,两类系统也都是在60年代后期研究和开发的。它们从体系结构、数据库语言到数据存储管理均具有共同特征,应该划分为同一代,可称为第一代。 关系数据库系统支持关系模型。关系模型不仅简单、清晰,而且有关系代数作为语言模型,有关系数据理论作为理论基础。因此关系数据库系统具有形式基础好、数据独立性强、数据库语言非过程化等等特色,标志着数据库技术发展到了第二代。 第二代数据库系统的数据模型虽然描述了现实世界数据的结构和一些重要的相互联系,但是仍不能捕捉和表达数据对象所具有的丰富而重要的语义,因此只能属于语法模型。 第三代的数据库系统将是以更加丰富的数据模型和更强大的数据管理功能为特征,以满足传统数据库系统难以支持的新的应用要求。1.1 第一代数据库 第一代数据库的代表是: 1) 1969年IBM公司研制的层次模型的数据库管理系统IMS(information management system)。 2) 美国数据库系统语言协商会CODASYL(Conference on Data System Language)下属的数据库任务组DBTG(Data Base Task Group)对数据库方法进行了系统的研究、探讨,于60年代末70年代初提出了若干报告,称为DBTG报告。DBTG报告确定并建立了数据库系统的许多概念、方法利技术。DBTG所提议的方法是基于网状结构的。它是数据库网状模型的典型代表。在DBTG方法和思想的指引下数据库系统的实现技术不断成熟,开发了许多商品化的数据库管理系统,它们都是基于网状模型和层次模型的。可以说,层次数据库是数据库系统的先驱,而网状数据库则是数据库概念、方法、技术的奠基。它们是数据库技术中研究得最早的两种数据库。两者的区分是以数据模型为基础,层次数据库的数据模型是分层结构的,而网状数据库的数据模型是网状的,它们的数据结构都可以用图来表示。层次数据模型对应于有根定向有序树,而网状模型对应的是有向图。所以,这两种数据模型可以统称为格式化数据模型。 这两种数据库系统具有下列共同特点: 1) 支持三级模式的体系结构 三级模式通常指外模式、概念模式、内模式。模式之间具有转换(或称为映射)功能,从而使数据库系统具有了数据与程序的物理独立性和一定的逻辑独立性。 2) 用存取路径来表示数据之间的联系 这是数据库系统和文件系统的主要区别之。数据库不仅存储数据而且存储数据之间的联系。数据之间的联系在层次和网状数据库系统中是用存取路径来表示和实现的。例如,DBTG中一对多的联系用系(Set)来表示,而系一般是用指引元的方法实现的,因此系值就是一种数据的存取路径。 3) 独立的数据定义语言 层次数据库系统和网状数据库系统有独立的数据定义语言,用以描述数据库的外模式、概念模式、内模式以及相互映象。诸模式一经定义,就很难修改。修改模式必须首先把数据全部卸出,然后重新定义诸模式,重新生成诸模式,最后编写实用程序把卸出的数据按新模式的定义装入新数据库中。因此在许多实际运行的层次、网状数据库系统中,模式是不轻易重构的。这就要求数据库设计人员在建立数据库应用系统时,不仅充分考虑用户的当前需求,还要充分了解需求可能的变化和发展。对数据库设计的要求比较高。 4) 导航的数据操纵语言 层次和网状数据库的数据查询和数据操纵语言是一次一个记录的导航式的过程化语言。这类语言通常嵌入某一种高级语言如COBOL、FORTRAN、PL/I中。所谓导航就是指用户不仅要了解“要干什么”,而且要指出“怎么干”。用户必须使用某种高级语言编写程序,一步一步地“引导”程序按照某一条预先定义的存取路径来访问数据库,最终达到要访问的数据目标。在访问数据库时,每次只能存取一条记录值。若该记录值不满足要求就沿着存取路径查找下一条记录值。 导航式的数据操纵语言其优点是存取效率高。存取路径由应用程序员指定,应用程序员可以根据他对数据库逻辑模式和存储模式的了解选取一条较优的存取路径,从而优化了存取效率。缺点是编程繁琐。用户既要掌握高级语言又要掌握数据库的逻辑结构和物理结构。对数据的访问是通过导航的方式,给用户编写应用程序带来了困难,其设计很大程度上依赖于设计者自己的经验和实践,因而只有具有计算机专业水平的应用程序员才能掌握和使用这类数据库操纵语言。应用程序的可移植性较差,数据的独众性也较差。1.2 第二代数据库关系数据库系统1970年IEM公司SanJose研究宝的研究员EFCodd发表了题为“大型共享数据库数据的关系模型”论文,提出了数据库的关系模型,开创了数据库关系方法和关系数据理论的研究,为关系数据库技术奠定了理论基础。由于EFCodd的杰出贡献,他于1981年获得了ACM图灵奖。70年代是关系数据库理论研究和原型开发的时代。其中以IBM san Jose研究室开发的system R和Berkeley大学研制的INGRES为典型代表,经过大量的高层次的研究和开发取得了一系列的成果。主要是: 1) 奠定了关系模型的理论基础,给出了人们一致接受的关系模型的规范说明。 2) 研究了关系数据语言,有关系代数、关系演算、SQL语言、QBE等等。这些描述性语言一改以往程序设计语言和网状、层次数据库系统中数据库语言的风格,以其易学易用的优点得到了最终用户的喜爱,为80年代数据库语言标准化打下了基础。 3) 研制了大量的肋BMS的原型,攻克了系统实现中查询优化、并发控制、故障恢复够一系列关键技术。不仅大大丰富了DBMS实现技术和数据库理论,更重要的是促进了DBMS产品的蓬勃发展和广泛应用。 关系数据库从实验支走向了社会,因此,在计算机领域中有人把70年代称为数据库时代。80年代几乎所有新开发的系统均是关系的。这些商用数据库系统的运行,特别是微机RDBMS的使用,使数据库技术日益广泛地应用到企业管理、情报检索、辅助决策等各个方面,成为实现和优化信息系统的基本技术。关系数据库是以关系模型为基础,关系模式概括的讲由三部分组成:1) 数据结构域,域上定义的关系。关系模型中,实体、实体与实体之间的联系都通过关系这种单一的结构类型来表示。 2) 关系操作 关系操作的能力可用关系代数(或等价的关系演算)中并、交、差、广义笛卡尔积、选择、投影、连接、除等操作来表示。关系操作的特点是集合操作,无论是操作的对象还是操作的结果都是集合。这种操作方式被称为一次一集合(setatatime)的方式,均非关系型的一次一记录(recordatatime)的方式相对照。 3) 数据完整性 数据完整性包括实体完整性、参照完整性以及与应用有关的完整性。实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应由关系系统自动支持;用户定义完整性则是针对某一具体数据库的约束条件,由应用环境决定。反映某一具体应用所涉及的数据必须满足的语义要求,关系数据库系统应提供定义和检验这类完整性的机制。 关系模式建立在严格数学概念的基础上,概念简单、清晰,易于用户理解和使用,大大简化了用户的工作、正因为如此,关系模型提出以后,便迅速发展,并在实际的商用数据库产品中得到了广泛应用,成为深受广大用户欢迎的数据模型。总的来看,关系模型主要具有以下特点: 关系模型的概念单一,实体以及实体之间的联系都用关系来表示。 以关系代数为基础,数据形式化基础好。 数据独立性强:数据的物理存储和存取路径对用户隐蔽。 关系数据库语言是非过程化的,将用户从编程数据库记录的导航式检索中解脱出来,大大减小了用户编程的难度。1.3 传统数据库系统的局限性 新的应用领域需要数据库的支持,但当试图将传统的数据库系统运用到前面所提到的那些新的应用领域时,立刻暴露出传统数据库系统的局限性。这里应说明的是,分析传统数据库系统的局限性并不是批评或否定传统数据库系统。前面我们已经阐明了传统数据库系统,尤其是关系数据库系统的优点及其在传统应用领域中取得的成就。它们适合处理格式化数据,较好地满足了商业事务处理的需求。现在人们要把它们应用到新的应用领域,可以说是对传统数据库的苛求。不过话又说回来,正是应用的驱动,推动了数据库技术的进步,同样也会促进传统数据库系统的提高和发展。 我们分析传统数据库的局限性,是为了寻求新一代数据库技术对新应用需求的解决方案;我们讨论传统数据库的局限性,并不能等同地认为它们在传统应用领域中的不足。其实“局限性”这个词已经能说明问题了,说明传统数据库适应“局部”的应用范围。 当我们谈及传统数据库系统的不足,更多指的是关系数据库系统。现在,RDBMS在DBMS市场上,占主导地位,现行销售的DBMS80是基于关系模型的。 传统数据库系统的局限性主要表现在以下几个方面: 1) 面向机器的语法数据模型 传统数据库中采用的数据模型强调数据的高度结构化,是面向机器的语法数据模型。它们只能存储离散的数据和有限的数据与数据之间的关系,语义表示能力差。传统数据模型的单调性,无法表示客观世界中的复杂对象,即结构复杂、相互联系的语义也十分复杂的对象。从而限制了数据库处理文本、超文本、图形、图象、CAD图件、声音等多种复杂对象,以及工程、地理、测绘等领域中的非格式化、非经典数据的能力。此外,传统数据模型无法揭示数据之间的深层含义和内在联系,缺乏数据抽象。 例如,关系模型只有个非常简单的结构性概念:关系。 在传统应用中,数据对象具有同形结构,这样它们很容易映射到关系来表示;而工程对象拥有许多异形结构,一个复杂对象可能山许多具有不同结构的于对象组成。对这些复杂对象比较自然的(即对于用户来说是友好的)表示,就需要有比关系模型更复杂的抽象机制。 有两个主要的数据抽象: 聚合(aggregation):聚合也称为聚集,是用来抽象因子对象聚集而成的合成对象。 泛化(generalization)和特化(specialization):泛化也称为普通化,概括。泛化是指将相似对象分类,抽象成一个一般化类型。特化也称为特殊化。特殊化是与普遍化互补的概念,是指一个对象类型可精化到一个只涉及更特殊属性的实例。在关系系统下必须将在逻辑上是一个整体的复杂对象分解为好几个基本关系。在这种结构下内部数据库结构与外部对象不再是一一对应的。对许多操作来说,人们更希望把所操作部分抽象为一个逻辑单位,而关系模型不支持这一点。于是人们必须从关系模式的片段中构造复杂对象,其结果常常是带有许多冗余数据的不自然的复杂查询。进一步讲,重构复杂对象还带来另一个问题,那就是,由连接构造的视图一般是不可更新的。 关系系统是基于值的,即用码来标识元组。而这种用值来标识一个对象时,一但其值变化,所有对该对象的引用将变为无效。 2) 数据类型简单、固定 传统的DBMS只能理解、存储和处理简单的数据类型。如整数、浮点数、字符串、日期、货币等。传统的RDBMS只支持某一固定的类型集,不能依据某一应用所需的特定数据类型来扩展其类型集。例如,不能定义包含三个实数分量的数据类型vector来表示三维向量。 复杂的数据类型只能由用户编写程序借助高级语言功能用简单的数据类型来构造、描述和处理,加重了用户的负担,也不能保证数据的一致性。而且在客户/服务器环境下,由于应用程序在客户端,势必加大了客户与服务器之间的网络通信开销,服务器的性能没有充分发挥,从而降低了整个系统的性能, 3) 结构与行为完全分离 从应用程序员角度来看,在某应用领域内标识的对象应包括两个方面的内容: 结构表示 行为规格说明 前者可映射到数据库模式(带着前面所提到的缺陷),而后者在传统数据库系统中则完全失去了。传统数据库主要关心数据的独立性以及存取数据的效率,是语法数据库,语义表达差,难以抽象化地去模拟行为。例如,用户在CAD设计中用某些数据结构来表示的对象,对他们的操作(如成形、显示和组合等)就无法存放到数据库中,即使按记录存放进去了,这些操作也成了毫无意义的编码(或字符),对象中与应用相关的大量语义在数据库中无法从无意义的编码中恢复。这样,对象的行为特征在传统数据库系统中最多只能由应用程序来表示。 在传统数据模型中,结构与行为完全分割开了 4) 阻抗失配 指关系系统中,数据操纵语言如SQL和通用程序设计语言之间的失配。这种不匹配表现在两个方面:一是编程模式不同,描述性的SQL语言与指令式的编程语言如C语言不同;另一方面是指类型系统不匹配,编程语言不能直接表示诸如关系这样的数据库结构,在其界面就会丢失信息。进步说,由于是两个类型系统,自动的类型检查也成了问题。 5) 被动响应 传统数据库管理系统只能响应和重做用户要求它们做的事情,从这种意义上说,它门是被动的。而在实际应用中,往往要求一个系统能够管理它本身的状态,在发现异常情况时及时通知用户;能够主动响应某些操作成外部事件,自动采取规定的行动:应该能够在一些预定的或动态计算的时间间隔中自动执行某些操作。就像在现实生活中,一个好的决策者(个人或组织)周围必定有一群人负责主动、及时地提供各种有用信息和提出建议(专家知识),决策者不需要总是向别人或机器询问信息。这就是说,要求系统更加主动、更加智能化,而传统的数据库显然不能适应这一要求。 6) 存储、管理的对象有限 传统的DBMS只存储和管理数据,缺乏知识管理和对象管理的能力。传统数据管理中,主要进行的是数据的存储、管理、查询、排序和报表生成等简单的、离散化的信息处理工作。数据库反映的是客观世界中静态、被动的事实。上面已经论述了传统的DBMS缺乏对象管理的能力。此外,传统的DBMS还缺乏描述和表达知识的能力,缺乏对知识的处理能力,不具有演绎和推理的功能,因而无法满足MIS、DSS、OA和AI等领域中进行高层管理和决策的要求。从而限制了数据库技术的高级应用。 7) 事务处理能力较差 传统数据库只能支持非嵌套事务,对长事务的响应较慢且在事务发生故障时的恢复比较困难。1.4 新一代数据库的特点面对数据库应用领域的不断扩展和用户要求的多样化、复杂化,传统的数据库技术遇到了严峻的挑战,它所固有的这些局限性也使其不能适应新的要求。正是这些缺陷决定了当前数据库的研究方向与未来的努力方向,新一代数据库技术应运而生。 由于传统数据库在新应用中存在的种种缺陷,数据库技术遇到了挑战。人们问:下一代数据库系统是什么?数据库将向何处去?数据库工作者为了给应用建立适合的数据库系统,进行了艰苦的探索,从多方面发展了现行的数据库系统技术,如: 针对不同的应用,对传统的DBMS,主要是RDBMS进行不同层次上的扩充。 与计算机领域中其它学科的新技术紧密结合,丰富和发展数据库系统的概念、功能和技术。 以上两方面的努力是立足于数据库已有的成果和技术,加以发展进化,有人称之为“进化论”的观点和方法。 另一方面的努力是立足于新的应用需求和计算机未来的发展,研究全新的数据库系统,有人称之为“革新论”的观点和方法。可以说新一代数据库技术的研究,新一代数据库系统的发展呈现了百花齐放的局面。其特点是; 1) 面向对象的方法和技术对数据库发展的影响最为深远 80年代,面向对象的方法和技术的出现,对计算机各个领域,包括程序设计语言、软件工程、信息系统设计,以及计算机硬件设计等都产生了深远的影响,也给面临新挑战的数据库技术带来了机会和希望。数据库研究人员借鉴和吸收了面向对象的方法和技术,提出了面向对象数据模型(简称对象模型)。该模型克服了传统数据模型的局限性,为新一代数据库系统的探索带来了希望,促进了数据库技术在一个新的技术基础上继续发展。 2) 数据库技术与多学科技术的有机结合 数据库技术与多学科技术的有机结合是当前数据库技术发展的重要持征。 计算机领域中其它新兴技术的发展对数据库技术产生了重大影响。传统的数据库技术和其它计算机技术的互相结合、互相渗透,使数据库中新的技术内容层出不穷。数据库的许多概念、技术内容、应用领域,甚至某些原理都有了重大的发展和变化。建立和实现了一系列新型数据库,如分布式数据库、并行数据库、演绎数据库、知识库、多媒体数据库等等,它们共同构成了数据库大家族。 传统数据库仅是数据库大家族的一员,当然,它也是最成熟的和应用最广泛的一员。它的核心理论、应用经验、设计方法等仍然是整个数据库技术发展和应用开发的先导和基础。 3) 面向专门应用领域的数据库技术的研究 为了适应数据库应用多元化的要求,在传统数据库基础上,结合各个专门应用领域的特点,研究适合该应用领域的数据库技术,如:工程数据库、统计数据库、科学数据库、空间数据库、地理数据库等,这是当前数据库技术发展的又一重要特征。研究和开发面向专门应用领域的数据库系统的基本方法是以传统数据库技术为基础,针对专门领域的数据对象的特点,建立特定的数据模型,它们或者是关系模型的扩展和修改,或者是具有某些面向对象特征的数据模型。2 关系数据理论 设计任何一种数据库应用系统,不论是层次的、网状的还是关系的,都会遇到如何构造合适的数据模式即逻辑结构的问题。由于关系模型有严格的数学理论基础,并且可以向别的数据模型转换,因此,人们就以关系模型为背景来讨论这个问题,形成了数据库逻辑设计的一个有利的工具关系数据库的规范化理论。规范化理论虽然是以关系模型为背景的,但是它对于一般的数据库逻辑设计同样具有理论上的意义。2.1 函数依赖现实世界随着时间在不断地变化,因此在不同的时刻,关系模式的关系也会有所变化。但是,现实世界的许多已有事实限定了关系模式所有可能的关系必须满足一定的完整性约束条件。这些约束条件或者通过对属性取值的范围的限定,或者通过属性之间的相互关系(主要体现于值的相等与否)反映出来。后者称为数据依赖。它是数据模式设计的关键。数据依赖是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。现在人们已经提出了许多种类型的数据依赖,其中最重要的是函数依赖(Functional Dependency,简称FD)和多值依赖(Multivalued Dependency,简称MVD)。函数依赖极为普遍的存在于现实生活中。比如描述一个学生的关系,可以有学号(SNO),姓名(SNAME),系名(SDEPT)等几个属性,由于一个学号只能对应一个学生,一个学生只能在一个系里学习。因而当学号值确定之后,姓名和该生所在班级也就被唯一地确定了。就像自变量x确定之后,相应的函数值f(x)也就唯一的确定了一样,称SNO函数决定SNAME和SDEPT,或者说SNAME和SDEPT函数依赖于SNO,记为:SNOSNAME,SNOSDEPT。 前面已经提过关系必须是规范化的(Normalization),即每个分量必须是不可分的数据项。但是这只是最基本的规范化。但是并非所有这样规范化的关系都能很好的描述现实世界,必须作进一步的分析,以确定如何设计一个好的、反映现实世界的模式。 函数依赖和别的数据依赖一样是语义范畴的概念。只能根据语义来确定一个函数依赖。例如:姓名年龄,这个函数依赖只有在该部门没有同名人的条件下成立。如果允许有同名人,则年龄就不再函数依赖于姓名了。2.2 数据的规范化 规范化理论是研究如何将一个不好的关系模式转化为好的关系模式的理论,规范化理论是围绕范式而建立的。规范化理论认为,一个关系数据库中所有的关系,都应满足一定的规范(约束条件)。规范化理论把关系应满足的规范要求分为几级,满足最低要求的一级叫做第一范式(1NF),在第一范式的基础上提出了第二范式(2NF),在第二范式的基础上又提出了第三范式(3NF),以后又提出了BCNF范式,4NF,5NF。范式的等级越高,应满足的约束集条件也越严格。规范的每一级别都依赖于它的前一级别,例如若一个关系模式满足2NF,则一定满足1NF。下面我们只介绍1NF,2NF,3NF范式。2.2.1 1NF 1NF是关系模型的最低要求,它的规则是: (1) 每一列必须是原子的,不能分成多个子列。 (2) 每一行和列的位置只能有一个值。 (3) 不能具有多值列。 例:如果要求一个学生一行,一个学生可选多门课,则下面的“学生”表就不满足1NF:student(Sno,Sname,classno)其中:sno为学号,sname为学生姓名,classno为课程号。因为一个学生可选多门课,所以列classno有多个值,所以空不符合1NF。规范化就是把它分成如下两个表:“学生”表和“选课”表,则这两个表就都满足1NF了。 student(Sno,Sname) stuclass(Sno,classno)2.2.2 2NF 对于满足2NF的表,除满足1NF外,非主码的列必须依赖于所有的主码,而不是组合主码的一部分。如果满足1NF的表的主码只有一列,则它自动满足2NF。 例:下面的“选课”表,不符合2NF。 stuclass(Sno,classno,classname) 其中:classname为课程名称。因为词表的主码是:(sno,classno),非主码列classname依赖于组合主码的一部分classno,所以它不符合2NF。对该表规范化也是把它分解成两个表:“选课”表和“课程”表,则它们就都满足2NF了。 stuclass(Sno,classno) class(classno,classname)2.2.3 3NF 3NF的规则是除满足2NF外,任一非主码列不能依赖于其它非主码列。 例:下面的“课程”表,不符合3NF。 class(classno,classname,teacherno,teachername) 其中:teacherno为任课教师号,teachername为任课教师姓名。因为非主码列teachername依赖于另一非主码列teacherno,所以它不符合3NF。 其解决办法也是把它分解成两个表:“课程”表和“教师”表,则它们就都满足3NF了。 class(classno,classname,teacherno) teacher(teacherno,teachername)2.2.4 小结 当一个表是规范的,则其非主码列依赖于主码列。从关系模型的角度来看,表满足3NF最符合标准,这样的设计容易维护。一个完全规范化的设计并不总能生成最优的性能,因此通常是先按照3NF设计,如果有性能问题,再通过反规范来解决。 数据库中的数据规范化的优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度,但是对完全规范的数据库查询,通常需要更多的连接操作,从而影响查询的速度。因此,有时为了提高某些查询或应用的性能而破坏规范规则,即反规范。2.3 数据的反规范2.3.1 反规范的好处 是否规范化的程度越高越好?这要根据需要来决定,因为“分离”越深,产生的关系越多,关系过多,连接操作越频繁,而连接操作是最费时间的,特别对以查询为主的数据库应用来说,频繁的连接会影响查询速度。所以,关系有时故意保留成非规范化的,或者规范化以后又反规范了,这样做通常是为了改进性能。 例如:帐户系统中的“帐户”表BTB01,它的列busibalance(企业帐户的总余额)就违反规范,其中的值可以通过下面的查询获得: select busicode,sum(accbalance) fromBTB06 groupbybusicode 如果BTB01中没有该列,若想获得businame(企业名称)和企业帐户的总余额,则需要做连接操作: selectbusiname,sum(accbalance) fromBTB01,BTB06 whereBTB01busicode=BTB06busicode group by busicode如果经常做这种查询,则就有必要在BTB01中加入列busibalance,相应的代价则是必须在表BTB06上创建增、删、改的触发器来维护BTB01表上busibalance列的值。类似的情况在决策支持系统中经常发生。反规范的好处是降低连接操作的需求、降低外码和索引的数目,还可能减少表的数目,相应带来的问题是可能出现数据的完整性问题。加快查询速度,但会降低修改速度。因此决定做反规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点,好的索引和其它方法经常能够解决性能问题,而不必采用反规范这种方法。2.3.2 常用的反规范技术 在进行反规范操作之前,要充分考虑数据的存取需求、常用表的大小、一些特殊的计算(例如合计)、数据的物理存储位置等。常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。 (1) 增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。例如前面例子中,如果经常检索一门课的任课教师姓名,则需要做class和teacher表的连接查询: select classname,teachername from class,teacher where classteacherno=teacherteacherno 这样的话就可以在class表中增加一列teachername就不需要连接操作了。 增加冗余列可以在查询时避免连接操作,但它需要更多的磁盘空间,同时增加表维护的工作量。 (2) 增加派生列指增加的列来自其它表中的数据,山它们计算生成。它的作用是在查询时减少连接操作,避免使用集函数。例如前面所讲的账户系统中的表BTBo1的列busibalance就是派生列。派生列也具有与冗余列同样的缺点。 (3) 重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。例如,用户经常需要同时查看课程号,课程名称,任课教师号,任课教师姓名,则可把表class(classno,classname,teacherno)和表teacher(teacherno,teachername)合并成一个表class(classno,classname,teacherno,teachername)。这样可提高性能,但需要更多的磁盘空间,同时也损失了数据在概念上的独立性。 (4) 有时对表做分割可以提高性能。表分割有两种方式: 水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。水平分割通常在下面的情况下使用。 表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。 表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。 需要把数据存放到多个介质上。 例如法规表law就可以分成两个表activelaw和inactivelaw。activeaauthors表中的内容是正生效的法规,是经常使用的,而inactivelaw表则使已经作废的法规,不常被查询。 水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。 垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要join操作。2.3.3 反规范技术需要维护数据的完整性 无论使用何种反规范技术,都需要一定的管理来维护数据的完整性,常用的方法是批处理维护、应用逻辑和触发器。批处理维护是指对复制列或派生列的修改积累一定的时间后,运行一批处理作业或存储过程对复制或派生列进行修改,这只能在对实时性要求不高的情况下使用。 数据的完整性也可由应用逻辑来实现,这就要求必须在同一事务中对所有涉及的表进行增、删、改操作。用应用逻辑来实现数据的完整性风险较大,因为同逻辑必须在所有的应用中使用和维护,容易遗漏,特别是在需求变化时,不易于维护。 另种方式就是使用触发器,对数据的任何修改立即触发对复制列或派生列的相应修改。触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护。一般来说,是解决这类问题的最好的办法。 数据库的反规范设计可以提高查询性能。常用的反规范技术有增加冗余列、增加派生列、重新组表和分割表。但反规范技术需要维护数据的完整性。因此在做反规范时,一定要权衡利弊,仔细分析应用的数据存取需求和实际的性能特点。3 数据库规范化的技巧 理解您的数据。 在设计表之前,应明确您打算如何处理数据,还要了解随着时间的推移数会发生什么样的变化。您所做的假设将会影响最终的设计。 您需要什么样的数据? 设计应用程序时,关键要了解设计的最终结果以便确保您准备好所有必需的数据并知道其来源。例如,报表的外观、每个数据的来源以及所需的所有数据是否都存在。对项目损失最大的莫过于在项目后期发现重要报表缺少数据。知道需要什么样的数据后,就必须确定数据的来源。数据是否从其他数据源中导入?数据是否需要清理或验证?用户是否需要输入数据? 明确所需数据的类型和来源是数据库设计的第一步。 您打算如何处理这些数据? 用户是否需要编辑这些数据?如果需要,应如何显示数据以便于用户理解和编辑?有没有验证规则和相关的查找表?要求对编辑和删除保留备份的数据输入有没有相关联的审核问题?需要为用户显示哪些摘要信息?是否需要生成导出文件?了解这些信息后,就可以想象字段之间是如何相互关联的了。 数据之间如何相互关联?将数据分组放入相关字段(例如与客户相关的信息、与发票相关的信息等),每个字段组都代表要建立的表。然后考虑如何将这些表相互关联。例如,哪些表具有一对多关系(例如,一个客户可能持有多张发票)?哪些表具有一对一关系(这种情况下,通常会考虑将其组合到个表中)? 随着时间的推移数据会发生什么样的变化? 设计表之后,常常会由于没有考虑时间的影响而导致以后出现严重问题。许多表设计在当时使用时效果非常好,但是,常常会因为用户修改数据、添加数据以及随时间的推移而崩溃。开发人员经常会发现需要重新设计表的结构来适应这些变化。表的结构发生变化时,所有相关的内容(查询、窗体、报表、代码等)也必须随之更新。理

温馨提示

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

最新文档

评论

0/150

提交评论