Student elective system (VF)
博客插N+文件有些麻烦,索性PDF上传到百度文库 点击获取《数据库系统原理与应用》也有相应的word版本
word版加密密码:(博客链接加密后)
六、附录
数据库设计的基本步骤,按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下六个阶段:
l 需求分析;
l 概念结构设计;
l 逻辑结构设计;
l 物理结构设计;
l 数据库实施;
l 数据库运行和维护。
数据库设计开始之前,首先必须选定参加设计的人员,包括系统分析人员、数据库设计人员和程序员、用户和数据库管理员。系统分析和数据库设计人员是数据库设计的核心人员,他们将自始至终参与数据库设计,他们的水平决定了数据库系统的质量。用户和数据库管理员在数据库设计中也是举足轻重的,他们主要参加需求分析和数据库的运行维护,他们的积极参与不但能加速数据库设计,而且也是决定数据库设计的质量的重要因素。程序员则在系统实施阶段参与进来,分别负责编制程序和准备软硬件环境。
如果所设计的数据库应用系统比较复杂,还应该考虑是否需要使用数据库设计工具和CASE工具以提高数据库设计质量并减少设计工作量,以及选用何种工具。
第一、 需求分析
需求分析简单地说就是分析用户的要求。需求分析是设计数据库的起点,需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,并影响到设计结果是否合理和实用。
1.1 需求分析的任务
需求分析的任务是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统或计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计数据库。
调查的重点是“数据”和“处理”,通过调查、收集与分析,获得用户对数据库如下要求:
(1)信息要求。指用户需要从数据库中获得信息的内容与性质。由信息要求可以导出数据要求,即在数据库中需要存储哪些数据。
(2)处理要求。指用户要完成什么处理功能,对处理的响应时间有什么要求,处理方式是批处理还是联机处理。
(3)安全性与完整性要求。
确定用户的最终需求是一件很困难的事,这是因为一方面用户缺少计算机知识,开始时无法确定计算机究竟能为自己做什么,不能做什么,因此往往不能准确地表达自己的需求,所提出的需求往往不断地变化。另一方面,设计人员缺少用户的专业知识,不易理解用户的真正需求,甚至误解用户的需求。因此设计人员必须不断深入地与用户交流,才能逐步确定用户的实际需求。
1.2 需求分析的方法
进行需求分析首先是调查清楚用户的实际要求,与用户达成共识,然后分析与表达这些需求。
调查用户需求的具体步骤是:
(1)调查组织机构情况。包括了解该组织的部门组成情况、各部门的职责等,为分析信息流程做准备。
(2)调查各部门的业务活动情况。包括了解各个部门输入和使用什么数据,如何加工处理这些数据,输出什么信息,输出到什么部门,输出结果的格式是什么,这是调查的重点。
(3)在熟悉了业务活动的基础上,协助用户明确对新系统的各种要求,包括信息要求、处理要求、完全性与完整性要求,这是调查的又一个重点。
(4)确定新系统的边界。对前面调查的结果进行初步分析,确定哪些功能由计算机完成或将来准备让计算机完成,哪些活动由人工完成。由计算机完成的功能就是新系统应该实现的功能。
在调查过程中,可以根据不同的问题和条件,使用不同的调查方法。常用的调查方法有:
(1)跟班作业。通过亲身参加业务工作来了解业务活动的情况。这种方法可以比较准确地理解用户的需求,但比较耗费时间。
(2)开调查会。通过与用户座谈来了解业务活动情况及用户需求。座谈时,参加者之间可以相互启发。
(3)请专人介绍。
(4)询问。对某些调查中的问题,可以找专人询问。
(5)设计调查表请用户填写。如果调查表设计得合理,这种方法是很有效,也易于为用户接受。
(6)查阅记录。查阅与原系统有关的数据记录。
做需求调查时,往往需要同时采用上述多种方法。但无论使用何种调查方法,都必须有用户的积极参与和配合。
在调查了解了用户需求以后,还需要进一步分析和表达用户的需求。在众多的分析方法中结构化分析方法(Structured Analysis,简称SA方法)是一种简单实用的方法。SA方法从最上层的系统组织机构入手,采用自顶向下、逐层分解的方式分析系统。
1.3 数据字典
数据流图表达了数据和处理的关系,数据字典则是系统中各类数据描述的集合,是进行详细的数据收集和数据分析所获得的主要成果。数据字典在数据库设计中占有很重要的地位。
数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分。其中数据项是数据的最小组成单位,若干个数据项可以组成一个数据结构,数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
(1)数据项
数据项是不可再分的数据单位。对数据项的描述通常包括以下内容:
数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,取值范围,
取值含义,与其他数据项的逻辑关系,数据项之间的联系}
其中“取值范围”、“与其他数据项的逻辑关系”(例如该数据项等于另几个数据项的和,该数据项值等于另一数据项的值等)定义了数据的完整性约束条件,是设计数据检验功能的依据。
可以用关系规范化理论为指导,用数据依赖的概念分析和表示数据项之间的联系。即按实际语义,写出每个数据项之间的数据依赖,它们是数据库逻辑设计阶段数据模型优化的依据。
(2)数据结构
数据结构反映了数据之间的组合关系。一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。对数据结构的描述通常包括以下内容:
数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
(3)数据流
数据流是数据结构在系统内传输的路径。对数据流的描述通常包括以下内容:
数据流描述={数据流名,说明,数据流来源,数据流去向,
组成:{数据结构},平均流量,高峰期流量}
其中“数据流来源”是说明该数据流来自哪个过程。“数据流去向”是说明该数据流将到哪个过程去。“平均流量”是指在单位时间(每天、每周、每月等)里的传输次数。“高峰期流量”则是指在高峰时期的数据流量。
(4)数据存储
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。它可以是手工文档或手工凭单,也可以是计算机文档。对数据存储的描述通常包括以下内容:
数据存储描述={数据存储名,说明,编号,输入的数据流,输出的数据流,
组成:{数据结构},数据量,存取频度,存取方式}
其中“存取频度”指每小时或每天或每周存取几次、每次存取多少数据等信息。“存取方式”包括是批处理还是联机处理;是检索还是更新;是顺序检索还是随机检索等。另外,“输入的数据流”要指出其来源,“输出的数据流”要指出其去向。
(5) 处理过程
处理过程的具体处理逻辑一般用判定表或判定树来描述。数据字典中只需要描述处理过程的说明性信息,通常包括以下内容:
处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
处理:{简要说明}}
其中“简要说明”中主要说明该处理过程的功能及处理要求。功能是指该处理过程用来做什么(而不是怎么做),处理要求包括处理频度要求,如单位时间里处理多少事务、多少数据量、响应时间要求等。这些处理要求是后面物理设计的输入及性能评价的标准。
可见,数据字典是关于数据库中数据的描述,即元数据,而不是数据本身。
数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实、完善的。
明确地把需求收集和分析作为数据库设计的第一阶段是十分重要的。这一阶段收集到的基础数据(用数据字典来表达)和一组数据流程图(Data Flow Diagram,简称DFD)是下一步进行概念设计的基础。
最后,要强调两点:
(1)需求分析阶段的一个重要而困难的任务是收集将来应用所涉及的数据,设计人员应充分考虑到可能的扩充和改变,使设计易于更改,系统易于扩充,这是第一点。
(2)必须强调用户的参与,这是数据库应用系统设计的特点。数据库应用系统和广泛的用户有密切的联系,许多人要使用数据库。数据库的设计和建立又可能对更多人的工作环境产生重要影响。因此用户的参与是数据库设计不可分割的一部分。在数据分析阶段,任何调查研究没有用户的积极参加是寸步难行的。设计人员应该和用户取得共同的语言,帮助不熟悉计算机的用户建立数据库环境下的共同概念,并对设计工作的最后结果承担共同的责任。
第二、 概念结构设计
将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计。它是整个数据库设计的关键。
2.1 概念结构
在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,才能更好地、更准确地用某一DBMS实现这些需求。
概念结构的主要特点是:
(1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是对现实世界的一个真实模型。
(2)易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成功的关键。
(3)易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。
(4)易于向关系、网状、层次等各种数据模型转换。
概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定。
描述概念模型的有力工具是E-R模型。有关E-R模型的基本概念已在第一章介绍。下面将用E-R模型来描述概念结构。
2.2 概念结构设计的方法与步骤
设计概念结构通常有四类方法:
l 自顶向下。即首先定义全局概念结构的框架,然后逐步细化。
l 自底向上。即首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构。
l 逐步扩张。首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他概念结构,直至总体概念结构。
l 混合策略。即将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构。
其中最经常采用的策略是自底向上方法。即自顶向下地进行需求分析,然后再自底向上地设计概念结构。
这里只介绍自底向上设计概念结构的方法。它通常分为两步:第1步是抽象数据并设计局部视图,第2步是集成局部视图,得到全局的概念结构。
2.3 数据抽象与局部视图设计
概念结构是对现实世界的一种抽象。所谓抽象是对实际的人、物、事和概念进行人为处理,抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述,这些概念组成了某种模型。
2.4 视图的集成
各子系统的分E-R图设计好以后,下一步就是要将所有的分E-R图综合成一个系统的总E-R图。
(1)合并分E-R图,生成初步E-R图
(2)消除不必要的冗余,设计基本E-R图
第三、 逻辑结构设计
概念结构是独立于任何一种数据模型的信息结构。逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。
从理论上讲,设计逻辑结构应该选择最适于相应概念结构的数据模型,然后对支持这种数据模型的各种DBMS进行比较,从中选出最合适的DBMS。但实际情况往往是已给定了某种DBMS,设计人员没有选择的余地。目前DBMS产品一般支持关系、网状、层次三种模型中的某一种,对某一种数据模型,各个机器系统又有许多不同的限制,提供不同的环境与工具。所以设计逻辑结构时一般要分三步进行:
(1)将概念结构转换为一般的关系、网状、层次模型;
(2)将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换;
(3)对数据模型进行优化。
3.1 E-R图向关系模型的转换
E-R图向关系模型的转换要解决的问题是如何将实体和实体间的联系转换为关系模式,如何确定这些关系模式的属性和码。
关系模型的逻辑结构是一组关系模式的集合。E-R图则是由实体、实体的属性和实体之间的联系三个要素组成的。所以将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转换为关系模式,这种转换一般遵循如下原则:
一个实体型转换为一个关系模式。实体的属性就是关系的属性,实体的码就是关系的码。
对于实体间的联系则有以下不同的情况:
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的候选码。如果与某一端实体对应的关系模式合并,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
(3)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。
(4)三个或三个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。
(5)具有相同码的关系模式可合并。
形成了一般的数据模型后,下一步就是向特定的RDBMS的模型转换。设计人员必须熟悉所用RDBMS的功能与限制。这一步是依赖于机器的,不能给出一个普遍的规则,但对于关系模型来说,这种转换通常都比较简单,不会有太多的困难。
3.2 数据模型的优化
数据库逻辑设计的结果不是唯一的。为了进一步提高数据库应用系统的性能,还应该根据应用需要适当地修改、调整数据模型的结构,这就是数据模型的优化。关系数据模型的优化通常以规范化理论为指导,方法为:
(1)确定数据依赖。在1.3“数据字典”一节中已讲到用数据依赖分析和表示数据项之间的联系,写出每个数据项之间的数据依赖。如果需求分析阶段没有来得及做,可以现在补做,即按需求分析阶段所得到的语义,分别写出每个关系模式内部各属性之间的数据依赖以及不同关系模式属性之间的数据依赖。
(2)对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系,具体方法已在2.4中讲解。
(3)按照数据依赖的理论对关系模式逐一进行分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
(4)按照需求分析阶段得到的处理要求,分析对于这样的应用环境这些模式是否合适,确定是否要对某些模式进行合并或分解。
必须注意的是,并不是规范化程度越高的关系就越优。例如,当查询经常涉及到两个或多个关系模式的属性时,系统经常进行连接运算。连接运算的代价是相当高的,可以说关系模型低效的主要原因就是连接运算引起的。这时可以考虑将这几个关系合并为一个关系。因此在这种情况下,第二范式甚至第一范式也许是合适的。
又如,非BCNF的关系模式虽然从理论上分析会存在不同程度的更新异常或冗余,但如果在实际应用中对此关系模式只是查询,并不执行更新操作,则就不会产生实际影响。所以对于一个具体应用来说,到底规范化到什么程度,需要权衡响应时间和潜在问题两者的利弊决定。
(5)对关系模式进行必要的分解, 提高数据操作的效率和存储空间的利用率。常用的两种分解方法是水平分解和垂直分解。
水平分解是把(基本)关系的元组分为若干子集合,定义每个子集合为一个子关系,以提高系统的效率。 根据“80/20原则”,一个大关系中,经常被使用的数据只是关系的一部分,约20%,可以把经常使用的数据分解出来,形成一个子关系。 如果关系R上具有n个事务,而且多数事务存取的数据不相交,则R可分解为少于或等于n个子关系,使每个事务存取的数据对应一个关系。
垂直分解是把关系模式R的属性分解为若干子集合,形成若干子关系模式。垂直分解的原则是,经常在一起使用的属性从R中分解出来形成一个子关系模式。垂直分解可以提高某些事务的效率,但也可能使另一些事务不得不执行连接操作,从而降低了效率。因此是否进行垂直分解取决于分解后R上的所有事务的总效率是否得到了提高。垂直分解需要确保无损连接性和保持函数依赖,即保证分解后的关系具有无损连接性和保持函数依赖性。这可以用第五章中的模式分解算法对需要分解的关系模式进行分解和检查。
规范化理论为数据库设计人员判断关系模式优劣提供了理论标准,可用来预测模式可能出现的问题,使数据库设计工作有了严格的理论基础。
3.3 设计用户子模式
将概念模型转换为全局逻辑模型后,还应该根据局部应用需求,结合具体DBMS的特点,设计用户的外模式。
目前关系数据库管理系统一般都提供了视图(View)概念,可以利用这一功能设计更符合局部用户需要的用户外模式。
定义数据库全局模式主要是从系统的时间效率、空间效率、易维护等角度出发。由于用户外模式与模式是相对独立的,因此在定义用户外模式时可以注重考虑用户的习惯与方便。包括:
(1)使用更符合用户习惯的别名
在合并各分E-R图时,曾做了消除命名冲突的工作,以使数据库系统中同一关系和属性具有唯一的名字。这在设计数据库整体结构时是非常必要的。用View机制可以在设计用户View时重新定义某些属性名,使其与用户习惯一致,以方便使用。
(2)可以对不同级别的用户定义不同的View,以保证系统的安全性。
假设有关系模式产品(产品号,产品名,规格,单价,生产车间,生产负责人,产品成本,产品合格率,质量等级),可以在产品关系上建立两个视图:
为一般顾客建立视图:
产品1(产品号,产品名,规格,单价)
为产品销售部门建立图:
产品2(产品号,产品名,规格,单价,车间,生产负责人)
顾客视图中只包含允许顾客查询的属性;销售部门视图中只包含允许销售部门查询的属性。生产领导部门则可以查询全部产品数据。这样就可以防止用户非法访问本来不允许他们查询的数据,保证了系统的安全性。
(3)简化用户对系统的使用
如果某些局部应用中经常要使用某些很复杂的查询,为了方便用户,可以将这些复杂查询定义为视图,用户每次只对定义好的视图进行查询,大大简化了用户的使用。
第四、数据库的物理设计
数据库在物理设备上的存储结构与存取方法称为数据库的物理结构,它依赖于给定的计算机系统。为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是数据库的物理设计。
数据库的物理设计通常分为两步:
(1)确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;
(2)对物理结构进行评价,评价的重点是时间和空间效率。
如果评价结果满足原设计要求,则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型。
4.1 数据库的物理设计的内容和方法
不同的数据库产品所提供的物理环境、存取方法和存储结构有很大差别,能供设计人员使用的设计变量、参数范围也很不相同,因此没有通用的物理设计方法可遵循,只能给出一般的设计内容和原则。希望设计优化的物理数据库结构,使得在数据库上运行的各种事务响应时间小、存储空间利用率高、事务吞吐率大。为此首先对要运行的事务进行详细分析,获得选择物理数据库设计所需要的参数。其次,要充分了解所用RDBMS的内部特征,特别是系统提供的存取方法和存储结构。
对于数据库查询事务,需要得到如下信息:
l 查询的关系;
l 查询条件所涉及的属性;
l 连接条件所涉及的属性;
l 查询的投影属性。
对于数据更新事务,需要得到如下信息:
l 被更新的关系;
l 每个关系上的更新操作条件所涉及的属性;
l 修改操作要改变的属性值。
除此之外,还需要知道每个事务在各关系上运行的频率和性能要求。例如,事务T必须在10秒钟内结束,这对于存取方法的选择具有重大影响。
上述这些信息是确定关系的存取方法的依据。
应注意的是,数据库上运行的事务会不断变化、增加或减少,以后需要根据上述设计信息的变化调整数据库的物理结构。
通常对于关系数据库物理设计的内容主要包括 :
l 为关系模式选择存取方法;
l 设计关系、索引等数据库文件的物理存储结构。
下面就介绍这些设计内容和方法。
4.2 关系模式存取方法选择
数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用要求。物理设计的任务之一就是要确定选择哪些存取方法,即建立哪些存取路径。
存取方法是快速存取数据库中数据的技术。数据库管理系统一般都提供多种存取方法。常用的存取方法有三类。第一类是索引方法,目前主要是B+树索引方法;第二类是聚簇(Cluster)方法;第三类是HASH方法。
B+树索引方法是数据库中经典的存取方法,使用最普遍。
(一)索引存取方法的选择
所谓选择索引存取方法实际上就是根据应用要求确定对关系的哪些属性列建立索引、哪些属性列建立组合索引、哪些索引要设计为唯一索引等。一般来说:
1. 如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引);
2. 如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引;
3. 如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引;
关系上定义的索引数并不是越多越好,系统为维护索引要付出代价,查找索引也要付出代价。例如,若一个关系的更新频率很高,这个关系上定义的索引数不能太多。因为更新一个关系时,必须对这个关系上有关的索引做相应的修改。
二、聚簇存取方法的选择
为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇。
聚簇功能可以大大提高按聚簇码进行查询的效率。例如要查询信息系的所有学生名单,设信息系有500名学生,在极端情况下,这500名学生所对应的数据元组分布在500个不同的物理块上。尽管对学生关系已按所在系建有索引,由索引很快找到了信息系学生的元组标识,避免了全表扫描,然而再由元组标识去访问数据块时就要存取500个物理块,执行500次I/O操作。如果将同一系的学生元组集中存放,则每读一个物理块可得到多个满足查询条件的元组,从而显著地减少了访问磁盘的次数。
聚簇功能不但适用于单个关系,也适用于经常进行连接操作的多个关系。即把多个连接关系的元组按连接属性值聚集存放,聚簇中的连接属性称为聚簇码。这就相当于把多个关系按“预连接”的形式存放,从而大大提高连接操作的效率。
一个数据库可以建立多个聚簇,一个关系只能加入一个聚簇。
选择聚簇存取方法,即确定需要建立多少个聚簇,每个聚簇中包括哪些关系。
下面先设计候选聚簇,一般来说:
(1)对经常在一起进行连接操作的关系可以建立聚簇;
(2)如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇;
(3)如果一个关系的一个(或一组)属性上的值重复率很高,则此单个关系可建立聚簇。即对应每个聚簇码值的平均元组数不太少。太少了,聚簇的效果不明显。
然后检查候选聚簇中的关系,取消其中不必要的关系。
(1)从聚簇中删除经常进行全表扫描的关系;
(2)从聚簇中删除更新操作远多于连接操作的关系;
(3)不同的聚簇中可能包含相同的关系,一个关系可以在某一个聚簇中,但不能同时加入多个聚簇。要从这多个聚簇方案(包括不建立聚簇)中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小。
必须强调的是,聚簇只能提高某些应用的性能,而且建立与维护聚簇的开销是相当大的。对已有关系建立聚簇,将导致关系中元组移动其物理存储位置,并使此关系上原有的索引无效,必须重建。当一个元组的聚簇码值改变时,该元组的存储位置也要做相应移动,聚簇码值要相对稳定,以减少修改聚簇码值所引起的维护开销。
因此,当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的,这时可以使用聚簇。尤其当SQL语句中包含有与聚簇码有关的ORDER BY,GROUP BY,UNION,DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作;否则很可能会适得其反。
(三)HASH存取方法的选择
有些数据库管理系统提供了HASH存取方法。选择HASH存取方法的规则如下:
如果一个关系的属性主要出现在等连接条件中或主要出现在相等比较选择条件中,而且满足下列两个条件之一,则此关系可以选择HASH存取方法:
(1)如果一个关系的大小可预知,而且不变;
(2)如果关系的大小动态改变,而且数据库管理系统提供了动态HASH存取方法。
4.3 确定数据库的存储结构
确定数据库物理结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、聚簇、日志、备份等的存储安排和存储结构;确定系统配置等。
确定数据的存放位置和存储结构要综合考虑存取时间、存储空间利用率和维护代价三方面的因素。这三个方面常常是相互矛盾的,因此需要进行权衡,选择一个折中方案。
1. 确定数据的存放位置
为了提高系统性能,应该根据应用情况将数据的易变部分与稳定部分、经常存取部分和存取频率较低部分分开存放。
例如,目前许多计算机都有多个磁盘,因此可以将表和索引放在不同的磁盘上,在查询时,由于两个磁盘驱动器并行工作,可以提高物理I/O读写的效率;也可以将比较大的表分放在两个磁盘上,以加快存取速度,这在多用户环境下特别有效;还可以将日志文件与数据库对象(表、索引等)放在不同的磁盘上以改进系统的性能。此外,数据库的数据备份和日志文件备份等只在故障恢复时才使用,而且数据量很大,可以存放在磁带上。
由于各个系统所能提供的对数据进行物理安排的手段、方法差异很大,因此设计人员应仔细了解给定的RDBMS提供的方法和参数,针对应用环境的要求,对数据进行适当的物理安排。
2. 确定系统配置
DBMS产品一般都提供了一些系统配置变量、存储分配参数,供设计人员和DBA对数据库进行物理优化。初始情况下,系统都为这些变量赋予了合理的缺省值。但是这些值不一定适合每一种应用环境,在进行物理设计时,需要重新对这些变量赋值,以改善系统的性能。
系统配置变量很多,例如:同时使用数据库的用户数,同时打开的数据库对象数,内存分配参数,缓冲区分配参数(使用的缓冲区长度、个数),存储分配参数,物理块的大小,物理块装填因子,时间片大小,数据库的大小,锁的数目,等等。这些参数值影响存取时间和存储空间的分配,在物理设计时就要根据应用环境确定这些参数值,以使系统性能最佳。
在物理设计时对系统配置变量的调整只是初步的,在系统运行时还要根据系统实际运行情况做进一步的调整,以期切实改进系统性能。
4.4 评价物理结构
数据库物理设计过程中需要对时间效率、空间效率、维护代价和各种用户要求进行权衡,其结果可以产生多种方案,数据库设计人员必须对这些方案进行细致的评价,从中选择一个较优的方案作为数据库的物理结构。
评价物理数据库的方法完全依赖于所选用的DBMS,主要是从定量估算各种方案的存储空间、存取时间和维护代价入手,对估算结果进行权衡、比较,选择出一个较优的合理的物理结构。如果该结构不符合用户需求,则需要修改设计。
第五、 数据库的实施和维护
完成数据库的物理设计之后,设计人员就要用RDBMS提供的数据定义语言和其他实用程序将数据库逻辑设计和物理设计结果严格描述出来,成为DBMS可以接受的源代码,再经过调试产生目标模式。然后就可以组织数据入库了,这就是数据库实施阶段。
5.1 数据的载入和应用程序的调试
数据库实施阶段包括两项重要的工作,一项是数据的载入,另一项是应用程序的编码和调试。
一般数据库系统中,数据量都很大,而且数据来源于部门中的各个不同的单位,数据的组织方式、结构和格式都与新设计的数据库系统有相当的差距,组织数据录入就要将各类源数据从各个局部应用中抽取出来,输入计算机,再分类转换,最后综合成符合新设计的数据库结构的形式,输入数据库。因此这样的数据转换、组织入库的工作是相当费力费时的工作。
特别是原系统是手工数据处理系统时,各类数据分散在各种不同的原始表格、凭证、单据之中。在向新的数据库系统中输入数据时,还要处理大量的纸质文件,工作量就更大。
由于各个不同的应用环境差异很大,不可能有通用的转换器,DBMS产品也不提供通用的转换工具。为提高数据输入工作的效率和质量,应该针对具体的应用环境设计一个数据录入子系统,由计算机来完成数据入库的任务。
由于要入库的数据在原来的系统中的格式结构与新系统中不完全一样,有的差别可能还比较大,不仅向计算机内输入数据时发生错误,转换过程中也有可能出错。因此在源数据入库之前要采用多种方法对它们进行检验,以防止不正确的数据入库,这部分的工作在整个数据输入子系统中是非常重要的。
在设计数据输入子系统时还要注意原有系统的特点,例如对原有系统是人工数据处理系统的情况,尽管新系统的数据结构可能与原系统有很大差别,在设计数据输入子系统时,尽量让输入格式与原系统结构相近,这不仅使处理手工文件比较方便,更重要的是减少用户出错的可能性,保证数据输入的质量。现有的DBMS一般都提供不同DBMS之间数据转换的工具,若原来是数据库系统,就可以利用新系统的数据转换工具,先将原系统中的表转换成新系统中相同结构的临时表,再将这些表中的数据分类、转换、综合成符合新系统的数据模式,插入相应的表中。
数据库应用程序的设计应该与数据库设计同时进行,因此在组织数据入库的同时还要调试应用程序。应用程序的设计、编码和调试的方法、步骤在软件工程等课程中有详细讲解,这里就不赘述了。
5.2 数据库的试运行
在原有系统的数据有一小部分已输入数据库后,就可以开始对数据库系统进行联合调试,这又称为数据库的试运行。
这一阶段要实际运行数据库应用程序,执行对数据库的各种操作,测试应用程序的功能是否满足设计要求。如果不满足,对应用程序部分则要修改、调整,直到达到设计要求为止。
在数据库试运行时,还要测试系统的性能指标,分析其是否达到设计目标。在对数据库进行物理设计时已初步确定了系统的物理参数值,但一般的情况下,设计时的考虑在许多方面只是近似的估计,和实际系统运行总有一定的差距,因此必须在试运行阶段实际测量和评价系统性能指标。事实上,有些参数的最佳值往往是经过运行调试后找到的。如果测试的结果与设计目标不符,则要返回物理设计阶段,重新调整物理结构,修改系统参数,某些情况下甚至要返回逻辑设计阶段,修改逻辑结构。
这里特别要强调两点,第一,上面已经讲到组织数据入库是十分费时费力的事,如果试运行后还要修改数据库的设计,还要重新组织数据入库。因此应分期分批地组织数据入库,先输入小批量数据做调试用,待试运行基本合格后,再大批量输入数据,逐步增加数据量,逐步完成运行评价。
第二,在数据库试运行阶段,由于系统还不稳定,硬、软件故障随时都可能发生。而系统的操作人员对新系统还不熟悉,误操作也不可避免,因此应首先调试运行DBMS的恢复功能,做好数据库的转储和恢复工作。一旦故障发生,能使数据库尽快恢复,尽量减少对数据库的破坏。
5.3 数据库的运行和维护
数据库试运行合格后,数据库开发工作就基本完成,即可投入正式运行了。但是,由于应用环境在不断变化,数据库运行过程中物理存储也会不断变化,对数据库设计进行评价、调整、修改等维护工作是一个长期的任务,也是设计工作的继续和提高。
在数据库运行阶段,对数据库经常性的维护工作主要是由DBA完成的,它包括:
1. 数据库的转储和恢复
数据库的转储和恢复是系统正式运行后最重要的维护工作之一。DBA要针对不同的应用要求制定不同的转储计划,以保证一旦发生故障能尽快将数据库恢复到某种一致的状态,并尽可能减少对数据库的破坏。
2. 数据库的安全性、完整性控制
在数据库运行过程中,由于应用环境的变化,对安全性的要求也会发生变化,比如有的数据原来是机密的,现在是可以公开查询的了,而新加入的数据又可能是机密的了。系统中用户的密级也会改变。这些都需要DBA根据实际情况修改原有的安全性控制。同样,数据库的完整性约束条件也会变化,也需要DBA不断修正,以满足用户要求。
3. 数据库性能的监督、分析和改造
在数据库运行过程中,监督系统运行,对监测数据进行分析,找出改进系统性能的方法是DBA的又一重要任务。目前有些DBMS产品提供了监测系统性能参数的工具,DBA可以利用这些工具方便地得到系统运行过程中一系列性能参数的值。DBA应仔细分析这些数据,判断当前系统运行状况是否是最佳,应当做哪些改进。例如调整系统物理参数,或对数据库进行重组织或重构造等。
4. 数据库的重组织与重构造
数据库运行一段时间后,由于记录不断增、删、改,会使数据库的物理存储情况变坏,降低了数据的存取效率,数据库性能下降,这时DBA就要对数据库进行重组织,或部分重组织(只对频繁增、删的表进行重组织)。DBMS一般都提供数据重组织用的实用程序。在重组织的过程中,按原设计要求重新安排存储位置、回收垃圾、减少指针链等,提高系统性能。
数据库的重组织,并不修改原设计的逻辑和物理结构,而数据库的重构造则不同,它是指部分修改数据库的模式和内模式。
由于数据库应用环境发生变化,增加了新的应用或新的实体,取消了某些应用,有的实体与实体间的联系也发生了变化等,使原有的数据库设计不能满足新的需求,需要调整数据库的模式和内模式。例如,在表中增加或删除某些数据项,改变数据项的类型,增加或删除某个表,改变数据库的容量,增加或删除某些索引等。当然数据库的重构也是有限的,只能做部分修改。如果应用变化太大,重构也无济于事,说明此数据库应用系统的生命周期已经结束,应该设计新的数据库应用系统了。
Student elective system (VF)的更多相关文章
- Operating system hdu 2835 OPT
Operating system Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Spring4笔记8--Spring与JDBC模板(IoC应用的例子)
Spring 与 JDBC模板: 为了避免直接使用 JDBC 而带来的复杂且冗长的代码,Spring 提供了一个强有力的模板类---JdbcTemplate 来简化 JDBC 操作.并且,数据源 Da ...
- 集合-Collection接口
集合 和 数组 的比较: 数组 - 本质上就是在内存空间中申请的一段连续内存空间,存放多个相同类型的数据 - 数组一旦定义完毕,则在内存空间中的长度固定. - 插入/删除元素时可能导致大量元素的移动, ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...
- MyBatis5:MyBatis集成Spring事物管理(上篇)
前言 有些日子没写博客了,主要原因一个是工作,另一个就是健身,因为我们不仅需要努力工作,也需要有健康的身体嘛. 那有看LZ博客的网友朋友们放心,LZ博客还是会继续保持更新,只是最近两三个月LZ写博客相 ...
- Struts2+Spring+Hibernate框架整合总结详细教程
一.SSH三大框架知识总结 Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...
- Set容器--HashSet集合
Set容器特点: ① Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ② 最常用的两个Set接口的实 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
随机推荐
- [Effective JavaScript 笔记]第45条:使用hasOwnProperty方法以避免原型污染
之前的43条,44条讨论了属性的枚举,但都没有彻底地解决属性查找中原型污染的问题.看下面关于字典的一些操作 'zhangsan' in dict; dict.zhangsan; dict.zhangs ...
- php常用函数time
string date( string format [, int timestamp] ) 参数 format 表示时间格式化的方式,可能的方式如下: 格式化方式 说明 Y ...
- 查找树ADT
通过二叉查找树实现排序的例程 /** * 无论排序的对象是什么,都要实现Comparable接口 * * @param <T> */ public class BinaryNode< ...
- Java,double类型转换成String,String装换成double型
今天,老师布置了小系统,银行用户管理系统,突然发现自己的基础知识好薄弱,就把这些记录一下, double类型转化string:Double.toString(double doub); String类 ...
- angular的路由
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 下面 ...
- PHP调用webservice遇到 Soap WSDL Error - "failed to load external entity
本人遇到的原因是服务器上没有安装php-soap centos安装方式: yum install php-soap 安装完成后重启 php-fpm 服务 service php-fpm restart ...
- d3.js读书笔记-1
d3.js入门 d3入门 D3是一个强大的数据可视化工具,它是基于Javascript库的,用于创建数据可视化图形.在生成可视化图形的过程中,需要以下几步: 把数据加载到浏览器的内存空间: 把数据绑定 ...
- 通过js给android控件WebView设padding
项目中有个界面是用来显示一个网页的,很简单,放个WebView就ok了,可是返回按钮放在哪 ,ui的设计是在底部显示一个半透明的条,左边有一个返回按钮.这个条显示在内容上面.我有一个担心,就是要是最下 ...
- EasyUI、Struts2、Hibernate、spring 框架整合
经历了四个月的学习,中间过程曲折离奇,好在坚持下来了,也到了最后框架的整合中间过程也只有自己能体会了. 接下来开始说一下整合中的问题和技巧: 1, jar包导入 c3p0(2个).jdbc(1个). ...
- validate插件深入学习-04自定义验证方法
自定义验证方法 jQuery.validator.addMethod(name,method,[,message]) name: 方法名 method: function(value,element, ...