物理试题练习题教案学案课件有效数据库设计的目标_第1页
物理试题练习题教案学案课件有效数据库设计的目标_第2页
物理试题练习题教案学案课件有效数据库设计的目标_第3页
物理试题练习题教案学案课件有效数据库设计的目标_第4页
物理试题练习题教案学案课件有效数据库设计的目标_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

有效数据库设计的目标借助现代数据库工具,几乎所有人都能够创建数据库。但是问题是,得到的数据是否有用如果不能从其中快速、可靠且一致地取出数据,那么数据库不会有多少用处。如果数据库里都是不正确的或自相矛盾的数据,那么将毫无用处。此外,如果数据库被窃取、丢失或者当系统崩溃时遭受到仅半写入的数据的破坏,那么它也是无用的。现代数据库工具、好的数据库设计和一些常识可以解决所有这些潜在的问题。只要能够了解这些问题的实质,则可以避免它们。获得有用数据库的第一步是了解数据库的目标。数据库应该完成哪些任务怎么样能使数据库变得有用以及它能解决什么样的问题使用一个强大的数据库工具但却没有制定目标就像驾驶飞机在云中飞行而没有罗盘您拥有自己需要的工具但是却不知道方向。本章将描述数据库设计的目标。通过研究诸如文件这样能够充当数据库的信息容器,则可以定义数据库应该具有的特性和它们应该避免的问题。在本章将会学到如下内容好的数据库设计之所以重要的原因。可以充当数据库的各种不同的信息容器的优点和缺点。如何使计算机化的数据库受益于这些优点并避免那些缺点。好的数据库设计有助于达成数据库目标的方法。CRUD和ACID的概念以及它们和数据库设计相关的原因。11理解数据库设计的重要性请暂时忘记本书是有关数据库设计的,并考虑常规的软件设计。软件设计在软件开发中起着重要的作用。设计规划了今后开发将会采用的大体结构和方向,决定系统各部分之间的交互关系以及哪些子系统对应用程序的其他部分提供支持。如果应用程序的基础设计是有缺陷的,那么系统整体上将存在危险。设计中错误的假定会渗入应用程序最低级的代码,导致子系统出现问题。构建在这些子系统上的高级系统将沿袭设计缺陷并且它们的代码很快也会受损坏。有时,代码受到一点损坏便会弥散到整个系统并且直到项目进入到相对较晚的阶段才第章第章1会被注意到。项目持续的时间越长,不正确的假设越难更改,开发人员越不愿意舍弃整个设计并重新开始。问题在系统中存在的时间越长,越难消除它们。某些情况下抛弃所有事物并从头开始可能更为容易,但这是一个大多数人都不愿意向更高的管理层呈交的决定。项目管理我的一个朋友是工程师,参与了一个非常庞大的卫星项目。过了一段时间后,工程师们都意识到在当前的技术条件和设计状况下,该项目是不可行的。最终项目经理被迫向高层主管汇报此情况,他本人因此被解雇了。新的项目经理坚持了一段时间后也被迫向高层主管承认此项目不可行,当然他也被解雇了。此项目在新的项目经理接手后又继续进行了一段时间,但是他后来也认识到该项目是无希望的,并且直到最后上层主管也不得不承认项目是没有结果时他也被解聘,最终整个项目彻底失败。如果他们前期在项目设计上花费更多的时间并即时修正问题或立刻认识到项目不可能完成并在一开始就废弃项目,那么便可以节省大量时间、金钱和人力。构建一个项目往往与建造一座房屋或摩天大楼相似。在没有经过基于完善的建筑原则而深思熟虑的设计之前,完全不可能建造一个造价高达几十亿美元的摩天大楼。但是,软件开发人员往往在还末确定肯定能完成软件开发时就匆忙开始编写代码。编码比设计更有意思、更令人感兴趣。编写代码还允许开发人员告知管理层和客户他们已经写了多少行代码,这样看似开发人员正在实施软件开发,即使这些代码由于错误的假设而毫无用处。只有到了后期,他们才认识到基础设计有缺陷,编写的代码没有意义,而项目此时已经陷入了巨大的麻烦之中。现在回到项目设计。应用程序设计中数据库设计是最为关键的一项任务。数据库是信息的存储库,供应用程序的其他部分进行管理并显示给用户。如果数据库没有存储正确的数据,没有安全地保存数据,或者应用程序无法找到所需的数据,那么应用程序很少有成功的机会。在这里,无用输入无用输出GIGO原则完全适用。如果底层的数据不可靠,那么无论使用这些数据的应用程序完成什么任务,结果充其量也将是不可信的。例如,假想构建了一个订单跟踪系统用以快速获取客户以往订单的信息。遗憾的是,每次要求程序提取某个客户的记录,但它返回的结果却略有出入。尽管程序能够快速找到数据,但是结果并不足够可信赖而被使用。设想已经构建了一个令人吃惊的程序,该程序能够跟踪完成一个复杂任务的数千道工序,如建造一艘游轮或载客喷气式飞机。该程序能够跟踪每道工序的完成状况,确定何时需要订购新的零件以便为后续建造阶段做好准备,甚至还能确定今后采购的现行价格从而决定是现在购买还是等到需要时再购买零件。但是,程序将花费数个小时重新计算复杂的任务进度安排和价格详情。尽管计算结果是正确的,但是计算过程太慢使得用户无法有效地做出任何更改。更改飞机座椅织布的颜色或游轮走廊上使用的瓷砖都会延误整个项目。假设构建了一个有效的订阅应用程序,该程序允许客户订阅公司每季的资讯和数据服务。该程序能够快速查找并更新客户的订阅并且总能一致地为特定的客户显示同样的订价。但是,当更改了某个发行刊物的价格时会发现并非所有客户的记录都显示更新的价格。一些客户是按照新价格订阅的,另一些客户是按照旧价格订阅的,还有一些客户看似是按照从没见过的价格订阅的本示例并不像看起来的那样牵强。一些系统允许向客户群提供廉价订阅或特殊的奖励或者允许销售代表向特殊用户提供特价。如果希望能够完成诸如更改标准价格而不干扰定制价格这样的操作,那么这种系统便要求特殊的设计。拙劣的数据库设计会导致上述这些问题和其他令人烦恼的问题以及付出潜在的昂贵代价。良好的设计则可为完成应用程序其余部分打下坚实的基础。有经验的开发人员知道错误在系统中停留的时间越长,则越难以查找和修正。基于此逻辑,在开始构建应用程序之间实施正确的设计是非常重要的一环。数据库设计也不例外。在开始确定软件体系结构构思拙劣、实现拙劣或程序不合格之前,有缺陷的数据库设计注定项目会失败。12信息容器数据库是什么这个问题看似很简单,但是如果认真对待它,结果可能很有启发作用。通过调研满足数据库定义的一些物理对象的优点和缺点,可以了解理想计算机化数据库具有的特性。数据库是一种存储数据的工具,允许以某种方式创建、阅读、更新和删除数据。这是一个非常宽泛的定义并且涵盖许多不为大多数人看做是现代数据库的物理对象。例如,装满名片的信封、笔记本、装满客户档案的档案柜和人的大脑都符合此定义。这些数据库都有各自的优缺点,从中可以洞察计算机数据库具有的理想特性。只要不装过多的名片,名片盒就是有用的。通过浏览所有名片可以查找一条特定的数据例如一个人的电话号码。通过将更多的名片装进名片盒至少在一定程度上可以方便地扩展数据库。如果名片的数量超过一打,找到特定的名片将是耗时的。甚至还可以略微重新安排一下名片来方便查找经常使用的名片。每次使用一张名片,就将其放在名片堆的前面,这样一段时间以后使用最多的名片会放在最前面。笔记本是一种小型、便于使用和携带的数据库,不需要供电,也不要求在使用之前引导它。另外,笔记本数据库也非常容易扩展,因为当第一本笔记本写满时可以买另一本笔记本加入到收集物中。但是,笔记本的内容是按顺序安排的。如果希望查找有关特定主题的信息,必须一次浏览一个页面直到找到想要的内容。拥有的数据越多,这种搜索就会变得越困难。档案柜存储的信息要比笔记本多很多,可以通过添加更多的文件或柜子来扩展这种数据库。只要是根据用于安排档案的数据类型进行搜索的,在档案柜中查找某条特定的信息要比在笔记本中查找更为容易。如果档案柜装满按照客户名整理排列的客户信息,并且希望找到某个特定的客户数据,那么这样是幸运的。如果希望找到住在某个城市中的所有客户,则必须逐个遍历所有文件。人的大脑是迄今创建的最为复杂的数据库。它可以存储难以置信的数据量并允许采用多种不同的方式检索特定的数据块。例如,现在您很可能可以轻易地回答如下有关您经常光顾的饭店的问题哪家饭店距离您当前的位置最近哪家饭店的甜点最好哪家饭店的服务最好哪家饭店的价格最便宜哪家饭店最适合用商务午餐总体来说您最喜欢哪家饭店人的大脑提供了多种不同的方式来获取相同的有关饭店的信息。可以基于多种关键词位置、甜点质量、费用等来搜索相同的信息库。若要使用名片盒或饭店宣传册、笔记本或档案柜来回答上述这些问题,则需要较长的时间和费力的搜索。然而大脑也有缺点,至少作为数据库是这样的。最明显的缺点是它会遗忘信息。尽管可以记忆的信息量难以置信,但是随着时间的推移,其中一些信息将变得不可靠甚至会完全消失。您还能记起小学老师的所有名字吗我就不能我连自己老师的名字都记不得,更不用说您的老师。此外,大脑还会出现疲倦,此时它的准确性会降低。尽管人的大脑擅长完成某些任务,如识别人脸或挑选饭店,它并不擅长其他任务,如提供去年某个特定的顾客购买的所有项目的准确清单。相比于配偶的姓名,这些项目缺少情感意义,因此它们更难记忆。所有这些信息容器名片、笔记本、档案柜和大脑都会因为令人误解的、不正确的和矛盾的信息而受到损坏。如果在笔记本中写下不同形式的相同信息,那么数据将会不一致。随后当您设法查找数据时,可能会先找到任一种形式的信息,而没有认识到还有其他形式的信息存储不一致和自相矛盾的信息会使大脑变得非常混乱,特别是在大选年中收听政客们的演说时更是如此。下面各节总结了这些信息容器的优点和缺点。13信息容器的优缺点通过了解上一节描述的这些信息容器的优点和缺点,可以了解对于计算机化数据库有用的特性。那么这些优点和缺点到底有哪些呢下面的列表汇总了一些信息容器的优点上述这些数据库都不要求供电并且它们不会受到电源故障的影响。这些数据库能够相当安全和持久地保存数据但要防火,数据基本不会消失。这些数据库除了大脑价格便宜且容易购买。这些数据库具有简单的用户界面,因此几乎任何人都会使用它们。使用这些数据库可以非常方便地添加、编辑和删除数据。若按照与整理档案柜相同的方式搜索数据,那么使用档案柜可方便地找到数据。大脑允许通过使用不同的关键字来查找数据例如按照位置、价钱或服务质量。所有这些数据库都允许查找它们包含的每条信息,尽管可能花费一段时间遍历所有信息。只要存储的实际数据是一致的,那么所有这些数据库除了大脑都提供一致的结果。例如,使用相同笔记本的两个人会查找到相同的数据。类似地,如果随后查看同一个笔记本,它将显示与以前看到的数据相同的数据前提是没有修改它。所有这些数据库除了档案柜都是便携的。大脑可以执行复杂的计算,至少对于有限的类型和数字是这样的。所有这些数据库都提供原子事务处理或交易。最后一个优点比其他优点更为抽象一些,因此需要进行更多的说明。原子事务处理可能是一系列较为复杂的行动,那些不直接参与执行事务的人将它们看做是单一操作。最典型的示例是从一个银行账户向另一个账户转账。假定ALICE向BOB开了一张价值100美元的支票,并且需要在他们的账户之间转移这笔钱。您拿起记账本从ALICE的记录上扣除100美元并将100美元添加到BOB的记录上,然后放下笔记本。其他使用笔记本的人可能在事务处理之前此时ALICE有100美元或事务处理之后此时BOB有100美元查看它,但是不能在从ALICE账户上扣除100美元但还没有转给BOB的事务处理过程中查看它。当处理进行到一半时绝不允许办公室里粗鲁的同事从您的手中抢走笔记本,它是一种要么全做要么不做的事务处理。除了上述优点以外,诸如笔记本和档案柜这样的信息容器有一些缺点。研究这些缺点很有价值,这样一来便可以在构建计算机数据库时设法避免它们。下面的列表汇总了这些信息容器具有的一些缺点。所有这些数据库都可能保存不完整的、不正确的或自相矛盾的数据。一些数据库容易丢失或被盗。一些人可能会趁您吃午饭的时候窃取您的笔记本或者在公共汽车上从您的肩膀上偷看笔记本内容。另外,当匆忙赶航班时甚至可能把笔记本遗忘在安检柜台上。在所有这些数据库中,纠正数据中较大的差错可能较为困难。例如,可以在地址备忘录上使用钢笔更改某个人的地址。如果在您所在区域建造了一个新城市,则更新数百个地址要困难得多这种情况最近发生在我的居住地附近。这种情况需要对一摞名片、一本笔记本或档案柜进行冗长的搜索。而您的大脑彻底更新这种变化可能需要几年的时间。根据不可控的因素,如情绪、疲劳程度甚至是否饥饿,大脑会在不同的时间给出不同的结果。所有这些数据库都位于一个单独的地方,因此不能方便地共享它们。此外,每种数据库也不能方便地备份,如果原始的数据库丢失或破坏则会丢失数据。下一节考虑将上述优点和缺点转换成在计算机数据库中希望获得或避免的特性。14理想的数据库特性通过了解物理数据库的优点和缺点,可以创建一个计算机数据库应该具有的特性列表。其中一些是所有数据库都必须具有的基本特性应该能够从数据库中获取数据。这是很明显的特性。但是大多数特性至少部分依赖于良好的数据库特性。如果没有构建良好的设计,则会丧失这些特性的部分或全部。例如,任何恰当的数据库均提供备份特性,但是良好的设计可以使备份和恢复快速和方便得多。下一节介绍优良的数据库系统应该提供的一些特性并解释了它们依赖良好数据库设计的具体程度。141CRUDCRUD代表任何数据库都应该提供的4种基本的数据库操作创建CREATE、读取READ、更新UPDATE和删除DELETE。如果阅读万维网上的数据库文章和讨论,经常会看到人们提及术语CRUD他们使用此术语或许仅是为了听起来专业和内行。可以设想一些不支持所有这些方法的特殊的数据采集设备。例如,飞机上的黑匣飞行数据记录器记录航班信息并随后播放,但不允许修改数据。但是通常而言,如果不具备CRUD特性则不能称其为数据库。CRUD通常是数据库必备的一个特性而并非良好的数据库设计要求的特性,但是良好的数据库设计可以有效地提供CRUD。例如,假定设计一个数据库来跟踪CANUGGLING联盟可在网上查找它的时间并且要求参与方的地址包括一个出现在STATES表中的STATE状态值。当创建一个新的记录时CRUD中的C,数据库必须验证新的STATE记录项。与此类似,当更新一个记录时CRUD中的U,数据库必须验证修改的STATE记录项。当删除STATES表中的记录项时CRUD中的D,数据库必须验证没有PARTICIPANT参与方记录使用该状态。最后,当读取数据时CRUD中的R,数据库设计决定能否在几秒钟或几小时内找到想要的数据,或者根本就找不到想要的数据。下一节描述的许多概念与CRDU操作相关。142检索检索RETRIEVAL是读取的另一个名词,即CRUD中的R。数据库应该允许查找每条信息。如果没有办法随后取回数据而将这些数据置于数据库中是没有意义的这将成为“数据黑洞”而不是数据库。数据库应该允许组织数据以便可以采用一种或多种特殊的方法找到特定的数据段。举例而言,应该能够通过搜索客户名称或客户ID来查找客户的账单记录。理想情况下,数据库还将合理组织数据以便以某种特定的方式相对快速和方便地取出数据。例如,假定希望查看客户的居住地以便决定是否应该在一个新的程序开始递送服务。为了获取此信息,能够基于他们的地址找到客户是有帮助的。理想情况下,可以优化数据库从而通过地址快速搜索客户。与此相反,很可能不需要很频繁地按照中间名来搜索客户假设一个客户给您打电话问及“能否查找我的记录我不记得上个月是否支付了账单,而且我也不记得我的账户名或姓但却记得我的中间名是KONFUSED”。如果常规的按地址搜索快于少见的按中间名的搜索则更好。能够快速且可靠地查找到数据库中的所有数据是数据库设计的一个重要方面。在一个设计拙劣的数据库中查找需要的数据可能会花费数个小时或数天而不是仅仅数秒的时间。143一致性CRUD中的R的另一个方面是一致性。数据库应该提供一致的结果。如果在一行中执行相同的两次搜索,应该得到相同的结果。执行相同搜索的另一个用户也应该得到相同的结果当然,假定其间底层的数据没有变化。当股票价格剧烈波动时不能企望您的净值查询返回相同的结果。良好构造的数据库产品能够确保完全相同的查询返回相同的结果,但是设计还扮演着重要的角色。如果数据库设计拙劣,则可能会在数据库的不同部分中存储相冲突的数据。例如,您可能将一组联系信息存储在客户的订单中并将一组不同的信息存储在主客户记录中。随后如果需要联系客户了解有关订单的问题,那么应该使用哪条联系信息呢144有效性验证有效性与一致性的思想紧密相关。一致性是指数据库的不同部分不能保存相同信息的相互矛盾的视图。有效性是指在可能需要的地方相对数据库中的其他数据段对数据进行验证。在CRUD术语中,当创建、更新或删除记录时可以对数据进行验证。正如物理数据容器一样,计算机数据库可能保存不完整、不正确或相矛盾的数据。我们无法防止不会拼写或只是简单录入错误信息的人破坏数据库,但是好的数据库设计有助于防范物理数据库无法阻止的一些错误类型。例如,数据库可以方便地检验数据具有正确的类型。如果用户看到一个DATE日期字段并录入“NOTHANKS,IMMARRIED”,那么数据库会指出这是无效的日期格式并拒绝接受此值。类似地,数据库可以提示“OLD”不是有效的年龄AGE,“LOTS”不是有效的数量QUANTITY,并且“CONFUSION”过长而不是一个两字母的状态缩写尽管该值可以正确反映用户的思维状态。数据库还可以检验用户输入的值是否出现在数据库的其他部分中。例如,一个粗心的打字员试图在STATE字段中输入CO却输入了CP。数据库会检查有效状态列表并且会在列表中没有找到CP时拒绝接受该数据如果数据库需要仅使用某些状态,那么可以限制列表只包含那些状态并使测试更加严格。数据库还可以检查数据的某些类型的条件。假设数据库包含一个图书订购系统。当顾客订购某种图书500册时他并不想要那么多册,数据库可以检查其他部分来查看是否存在这么多册图书对任意给定的图书大多数书店仅存有几册,如果没有足够的数量则会拒绝此订购。此外,良好的数据库设计还有助于防止对数据库进行不正确的更改。假定热牛奶咖啡及修理服务不再覆盖一座邻近的城市。当设法从有效位置列表中删除该城市时,数据库可以指出在此城市中是否还存在客户。根据数据库的设计,它能够拒绝删除该城市,除非已向那些客户表示歉意并从数据库中删除他们。所有这些技术均依赖于良好、可靠的数据库设计。但是它们仍然不能防范用户在姓字段中输入名字或者用户意外敲击CAPSLOCK键,但是它能够防止笔记本这样的数据库所不能防范的许多类型的错误。145轻松的纠错即使完美设计的数据库也无法确保绝对的有效性。数据库如何知道一个客户的名字应该被拼写成PHEIDAUX而不是用户键入的FIDO呢在笔记本上纠正单个错误非常容易。只需划掉错误的值并写入新的值即可。在笔记本中纠正系统的错误要困难得多。假定雇佣了一个暑期实习生逐户上门推销家用产品,他详细记录了很多“DUCKTAPE”订单,但是没有意识到实际的产品是“DUCTTAPE”。修正所有错误可能会很乏味和耗时当然,乏味和耗时的工作正是暑期实习生从事的工作,因此可以让他们自己修正所犯的错误。此外,还可以忽视此问题并保留拼错的订单,但是随后如何知道某个客户何时真正想要为鸭子录音在计算机数据库中,这种纠错很简单。一条简单的数据库命令即可更新整个系统中出现的所有产品名称“DUCKTAPE”实际上,这种纠错有时做起来过于简单。如果不够小心,可能会意外将所有产品的名称更改为DUCTTAPE,设置包括那些没有错误拼写为DUCKTAPE的产品。通过为数据库构建可靠的用户界面来避免这种情况。方便的纠正错误是计算机数据库内在的一种特性,但是为了从此特性中获得最大的收益,则需要良好的设计。如果在自由编排格式的文本部分中包含订单信息,则数据库修订排印错误将会遇到麻烦。如果将产品名称放在分离的字段中,则数据库能够轻易做出这种更改。尽管轻松纠错基本上不受约束,但是需要作少许设计以便使它们尽可能有效和高效。146速度所有CRUD特性的一个重要方面是速度。良好设计的数据库能够快速创建、读取、更新和删除记录。不可否认的是,计算机数据库比笔记本或档案柜快速得多。计算机数据库远不止每小时处理几十条记录,而能每秒处理几十条或上百条记录我曾参与开发一个记账中心,它每3天可以处理大约300万个账户。良好的数据库设计在提高数据库效率上起着重要作用。拙劣构造的数据库尽管仍然比等效的纸制数据库快速,但是要比良好设计的数据库慢得多。数据库设计上一段提到的记账中心有一个小问题它无法找到拖欠记账中心钱财最多的客户。数据库每隔3天会列出一份欠钱的客户列表。这份客户列表打印出来的一堆纸几乎高3英尺。但是这份列表是随机排序的很可能按照客户ID或鞋子尺码或其他同样无用的标准进行排序,因此不能推算出欠钱最多的客户。大部分客户仅欠几元钱太少而不必纠缠但是少数客户却欠下上万元钱。我们将此打印输出结果电子化处理后并按照余额来排列账户。结果表明真正有问题的客户仅占据几页并且前5个账户的欠款超过了其他所有账户欠款的总和。我引入这个故事的目的不是炫耀我的编程能力老实说,这是一个非常容易的项目,而是为了说明数据库设计如何大幅改善系统性能。在此通过很简单的改动任何数据库都应该予以支持可以在几秒钟内找出最令人忧虑欠款最多的客户,否则难以找到此客户。并不是所有对数据库设计的更改都可以得到激动人心的结果,但是良好的设计的确在改善性能方面发挥着重要作用。147原子事务处理原子事务处理可能是一系列较为复杂的行动,那些不直接参与执行事务的人将它们看做是单一操作。如果从ALICE的账户向BOB的账户转账100美元,当数据库处于中间状态时其他人不能查看数据库,这种状态是已从ALICE的账户扣除100美元但还没有添加到BOB的账户上。事务处理要么其所属操作全部完成要么什么都不发生而不能只进行一部分操作。原子事务处理对于维护一致性和有效性很重要,因此对于CRUD中的R和U非常重要。物理数据容器如笔记本支持原子事务处理,因为通常一次只有一个人能够使用它。除非当您在笔记本中写入记录时办公室粗鲁的同事DEREK从您的手中抢去笔记本,在允许其他人有机会使用笔记本之前只能完成一系列操作。一些最简单的数据库类型,如平面文件和XML文件本书后面将介绍它们并不是本身就支持原子事务处理,但是更高级的关系数据库产品能够对此予以支持。这些数据库允许开始事务处理并执行一系列操作。然后可以提交事务处理以便使更改成为永久性的,或者回滚事务处理以便全部取消这些操作并将数据库恢复到开始事务处理之前的状态。此外,如果数据库意外停止,这些数据库还将自动回滚打开的任何事务处理。例如,假设开始一个事务处理,从ALICE的账户中取出100美元,随后您公司的吉祥物一匹小马走进微机房,踩上电源板并切断了主机的电源。当重新启动数据库在将小马送至人力资源部后时,它自动回滚事务处理以便使ALICE找回她的钱。然后需要再次尝试事务处理,但是至少要求系统没有丢失任何钱财。原子事务处理与其说是数据库设计问题,还不如说是一种正确使用数据库特性的问题。如果挑选了适当高级的数据库产品并正确使用事务处理,将会获得其好处。如果决定使用平面文件来存储数据,则将需要亲自实现事务处理。148ACID本节对上一节描述的事务处理进行了更加详细的介绍,而不是讨论物理数据容器和计算机数据库的新特性。ACID是描述一个有效的事务处理系统应提供的4种特性的首字母缩写词。ACID代表ATOMICITY原子性、CONSISTENCY一致性、ISOLATION隔离性和DURABILITY持久性。原子性是指事务处理是原子的。事务处理中的操作要么全部完成要么都不执行。一致性是指事务处理确保数据库在事务处理前后处于一致的状态。换句话说,如果事务处理内的操作违反数据库的规则,则回滚事务处理。举例而言,假设数据库的规则规定一个账户不能完成导致余额少于零的支付。此外,假定ALICE的账户仅有75美元。现在开始一个事务处理,向BOB的账户添加100美元,然后试图从ALICE的账户上扣除100美元。这样做将使ALICE负债25美元,违反了数据库的规则,因此会取消此事务处理并且都会设法忘记这种难堪的事件曾经发生过实际上我们可能由于开错了支票而给ALICE开了一张令人气愤的过多扣费的账单。隔离性是指事务处理向除了执行事务处理的人以外的所有人隐蔽其细节。假定开始了一个事务处理,从ALICE的账户上扣除100美元并将这100美元添加到BOB的账户。在此操作的过程中,其他人都不能窥视数据库并且看不到ALICE和BOB拥有100美元的状态。任何查看数据库的人都能在某个账户上看到100美元,不同的是在事务处理之前是在ALICE的账户上而在事务处理之后却是在BOB的账户上。具体而言,两个事务处理运行在隔离状态并且不能相互干扰。假设一个事务处理从ALICE向BOB转账100美元,然后另一个事务处理从BOB向CINDY转账100美元。逻辑上,一个事务处理要先出现并在另一个事务处理开始之前结束。例如,当第二个事务处理开始时,它将看不到ALICE的账户上消失了100美元,除非它已经转移到BOB的账户上。事务处理出现的次序可能会造成很大不同。假设ALICE最初有150美元,BOB最初有50美元。现在假定第二个BOB到CINDY转账的事务处理先发生,如果事务处理首先从BOB的账户上扣除100美元,BOB将会透支,于是回滚此事务。我们评定BOB由于扣费过高而透支,并设法向BOB推销非常低价的每月仅10美元的透支保护。在此事务处理的所有操作完成后,ALICE到BOB转账的事务处理才发生,并且成功地向BOB的账户转账100美元。与此相反,假设ALICE到BOB的事务处理先发生。此事务处理成功完成而不会带来任何问题,因此当BOB到CINDY的事务处理开始时,BOB的账户已有150美元并且第二个事务处理能够成功地完成。数据库不能决定哪个事务处理首先开始,而只是决定在另一个事务处理开始之前提交或回滚一个事务。持久性是指一旦提交了一个事务处理,它就不会消失。如果电源出问题,此时造成数据库重新启动,该事务处理的作用仍然保留。持久性要求依赖于一致性规则。一致性确保如果事务处理使数据库处于一种违反数据库规则的状态,则不会完成事务处理。持久性意味着数据库将不能随后确定事务处理造成了这样一种状态,并且回溯性地删除该事务处理。一旦提交了事务处理,那么它是不能改变的。高端数据库可以通过连续的镜像或影像来提供持久性。每次执行数据库操作,都会将其镜像到另一个系统。如果主系统崩溃,则镜像数据库可以立即投入服务。其他数据库可以通过日志提供持久性。数据库每次执行操作时,都会将此操作的记录写入到日志中。现在假设系统崩溃,当数据库重新启动时它将重新加载其最后保存的数据,然后重新运用日志描述的所有操作。相比于从镜像数据库重启,这种方式花费更长的时间,但是要求更少的资源,因此通常更加便宜。为了提供持久性,在将其变化进行镜像或记录到日志中之前,数据库不认为事务处理是提交的,因此即使数据库崩溃,它也不会丢失变化。149持久性和备份数据必须是持久的,它不应该自动更改或消失。如果连你都不信任数据库能够安全地保存数据,那么数据库将毫无用处。数据库产品应尽量保持数据的安全性,并且在正常操作中不需要做大量工作来获得数据持久性带来的好处。但是当出现异常的情况时,可能需要采取特殊的行动并要求事先规划。例如,假定保存数据库的磁盘驱动器完全损坏。或者火灾使计算机完全损毁了,再有就是用户意外或有意删除了数据库一个用户对我曾参与的一个项目尝试这样做过一次,最终大家都不高兴。在这些极端的情况下,数据库将无能为力。为了防止这类问题,需要执行常规的备份。物理数据容器如笔记本通常难以备份,因此难以使其免受损伤。如果火灾烧毁了您的账户收款笔记本,则将不得不依赖客户的诚信来收回欠款了。尽管我们爱戴客户,但我不能确保大多数企业能如此信任他们。在理论上可以创建笔记本的副本并将它们存放到不同的位置以防范这类事件,但是实际上很少有企业这样做除了可能的洗钱、走私和其他为了方便向执法人员和股东出示不同账本的企图。但是计算机数据库备份起来相对容易。如果丢失少量数据并不会过度损害您,而且还可以每日备份数据库。如果火灾、计算机病毒或其他某种意外事件破坏了主数据库,还可以重新加载备份数据库并在一两个小时内做好恢复操作的准备。如果数据库非常不稳定或者如果即使丢失少量数据仍会造成很大问题可以想象在繁忙的一小时内通过纽约证券交易所交易的资金有多少,则需要不同的备份策略。很多高端的数据库产品都允许镜像出现的每个数据库操作,因此对于出现的每种状况总是保留有完整的副本。即便主数据库遭到破坏,仍可以在数分钟内恢复业务。一些数据库体系结构可以如此快速地切换到备份数据库,甚至连用户都察觉不到发生了数据库切换。备份计划将备份存储到远离执行备份的计算机总是最好的做法。因此如果像火灾这样真正的大事故发生并烧毁存有数据库的整座大楼,那么备份仍然是安全的。我认识的几个开发组通常将备份直接存储到他们正备份的计算机旁边。这种做法仅可以防范某些愚蠢的做法在我曾工作过的小组中,大约每10个人一年中就有一人会意外删除一个需要从备份中恢复的文件,但却不能防范更大的意外事故。我还知道有些公司制定了正式的备份计划,但是一旦提交了一个真正存储的备份,它将转移至远离现场所在的位置,而且在需要它时花费较长的时间才能取回它。如果不能使用它,那么备份基本没有多少用处在一个非常极端的示例中,我有一个客户甚至担心备份存储的位置距离原始数据库仅30英里。他们的想法是在出现火山爆发或原子弹爆炸的时候备份可能仍不够安全。正确实现数据库备份的方法取决于多种因素,如认为问题出现的可能性多大、需要恢复数据库的频率以及丢失一些数据并花费时间从备份恢复造成的损失有多么大,但是相比于笔记本,计算机数据库提供的选择要多得多。良好的数据库设计有助于更为容易地创建备份。如果合理安排数据使得变化大都出现在局部区域,那么则可以相当频繁地备份此区域而不浪费时间备份仅偶尔变化的数据。1410低成本和可扩充性理想情况下,数据库应该容易获取易安装、便宜且易于扩展。如果发现每天需要处理的数据远多于期望的数据,则应该确保能够以某种方式增加数据库的容量。尽管一些数据库产品非常昂贵,但是大多数数据库都具有适当的升级途径,因此可以购买价格最低的能够满足需求的许可证,至少开始时是这样。例如,SQLSERVER、ORACLE和MYSQL都提供了免费的版本可以用来开始构建小型的单用户应用程序。它们也提供了更昂贵的版本,适用于非常大型的具有数百个用户的应用程序。安装数据库绝不像购买一个新的笔记本一样容易和便宜,不过它也不必是一个耗时的金融噩梦。尽管费用和容量更多是特定数据库产品而非数据库设计的特性,但是良好的数据库设计有助于获得一种不同类型的可扩展性。假定使用了笔记本数据库一段时间并发现需要获取新的信息类型。或许需要跟踪客户的饮食习惯,以便了解在特定的场合给它们什么样的饭店赠券。在这种情况下,若能够扩展数据库设计以容纳这种额外的信息则是令人满意的。良好的数据库设计使得这种扩展成为可能。1411易用性笔记本和档案柜具有简单的用户界面,因此几乎所有人都可以有效使用它们尽管有时搞得非常混乱,应该将“UNITEDSTATESPOSTALSERVICE”归档在“UNITEDSTATES”、“POSTALSERVICE”还是“SNAILMAIL”。计算机应用程序的用户界面决定了对于一般用户而言的可用程度。用户界面设计并不属于数据库设计的内容,因此您可能想知道为何在这里提及易用性。数据库级别最高的用户通常是编程人员和相对富有经验的数据库用户,他们知道操纵数据库的方式。良好的数据库设计可以使这些用户更容易访问数据库。只需要通过查看表的名称、字段和其他组织数据的数据库记录项,这种用户应该能够了解不同的数据段组合在一起的方式以及使用它们检索所需要的数据的方法。如果这些高级的用户可以方便地理解数据库,则可以为较低级的用户创建更好的用户界面。1412便携性计算机数据库提供的便携性能力远胜于笔记本。它允许从可以访问WEB的任何地方访问数据,而不必实际转移物理数据库。差不多可以从任何地方访问数据库,而数据本身可以安全地存放在家中,从而远离扒手、掉在泥浆和遗忘在公共汽车上的危险。实际上,新型的便携性可能有些过于容易了。尽管飞机上您座位后面的某个人无法像窥探笔记本那样从您背后偷窥计算机里的数据是的,如果您使用笔记本是能够偷窥的,但是地球另一端的电脑黑客可能可以设法侵入数据库并在您睡着的时候窃取客户的数据。这一问题引出了下一个主题,安全性。1413安全性相比起来,笔记本更容易丢失或窃取,但是高度便携的数据库却更容易遭到安全威胁。如果能够从全世界各地访问数据库,那么计算机窃贼和其他网络罪犯也可以访问数据库。锁定数据库通常是应该通过网络和数据库的安全工具加以解决的安全问题。但是,有一些设计技术可以用来更方便地确保数据库的安全性。信息窃取迄今发生了大量笔记本电脑、硬盘和磁盘丢失或被窃以及其他媒体潜在向坏蛋暴露机密信息的事件。2005年1月22日,北科罗拉多州大学的一个含有大约30000个大学在职人员和曾供职人员个人信息的硬盘被盗。2005年12月22日,福特汽车公司的含有公司7000个在职人员和曾供职人员的名称和社会保险号码的计算机被窃。三天之后,即2005年12月25日,AMERIPRISE金融公司的含有大约260000客户的敏感信息的笔记本电脑被盗后来找到了该笔记本电脑。2006年6月1日,含有HOTELCOM公司大约243000位客户信息的笔记本电脑被窃。2007年1月13日,北科罗拉多州税务部门的一台含有30000名纳税人的纳税信息的计算机被盗。2008年1月24日,一台含有大约30000名病人秘密信息的FALLONCOMMUNITYHEALTHPLAN电脑被窃。最后,迄今最大的数据丢失事件出现在2006年5月3日,美国退役军人事务所一台含有大约28600000名退伍军人和现役人员信息的笔记本电脑被盗。我并不打算找出这些受害人。这是一个大问题,全球就算不到上千家也有上百家公司遭受了类似的数据泄密事件。隐私权票据交换所网页WWWPRIVACYRIGHTSORG/AR/CHRONDATABREACHESHTM上的“数据损失年表”列出了自从该网站开始于2005年跟踪事件以来单在美国总数超过230000000项的泄密记录。如果将数据分离到不同类型的用户需要操纵的类别中,可以向不同类型的用户授予不同级别的权限。仅赋予用户访问他们绝对需要的数据不仅能减少合法用户做各种蠢事或错事的机会,而且会降低攻击者冒充此类用户并做某种坏事的机会。即使愚笨的CARL不会故意损毁您的数据,网上的恶棍也有可能会猜出CARL的口令很自然是CARL并设法从事破坏活动。如果CARL没有权限破坏账户数据,那么网络恶棍也不能做到。数据库安全的另一个新情况是实际上,用户可以远程访问数据库而不必在本地保存数据库的副本。可以使用掌上型电脑来访问数据库而不必将数据存储到您的计算机上。这意味着若确实不知何故丢失了自己的计算机,数据仍然安全地存放在数据库的计算机上。此问题更多的是应用程序体系结构问题而并非数据库设计问题不要将数据本地存储在笔记本电脑上,但是通过数据库设计限制用户仅能访问他们确实需要了解的数据是有帮助的。1414共享在许多人中间共享使用笔记本或装满名片的信封很不方便。实际上,两个用户很难同时使用同一个笔记本,而且在用户之间来回传递笔记本会带来一些花销。每天花时间穿越房间12个来回将是够令人厌烦的;跨越国家用快件邮件笔记本无疑是非常愚蠢的做法。现代网络能够允许数百个乃至数千个用户从全球各地同时访问相同的数据库。尽管这在很大程度上是采用联网方法和特定数据库提供的工具,但是一些设计问题确实在起作用。如果按照上一节中描述的那样,将数据划分到不同类型的用户需要使用的类别中,这不仅有助于提高安全性而且还有助于减少需要跨越网络传送的数据量。将数据分解成适当的片段还有助于协调多个用户的操作。当伦敦的同事开始编辑客户的记录时,必须锁定此记录以便在编辑完成之前其他用户不能进入系统并将记录搞乱。适当对数据分组允许锁定尽可能少的数据以便使更多的数据可供其他用户编辑。细致的设计允许数据库执行一些计算并仅将计算结果传送到正在夏威夷海滩辛勤工作的老板手中,而不必将整个数据库传送到那里并让他的计算机执行所有的工作。良好的应用程序设计也非常重要。即使在做好高效使用数据库的准备之后,应用程序仍需要正确使用它。但是如果没有良好的数据库设计,则不可能实现这些技术。1415执行复杂计算的能力与人的大脑相比,计算机有点像傻瓜。它采用非常强大的硬件和极度复杂的算法来执行人们认为理所当然的任务,如人脸识别、与讲话者无关的语音识别和手写识别尽管人的大脑和计算机还都不能辨认医生的处方。此外,人的大脑是自动编程的,因此可以灵活且快速地学习新的任务。尽管计算机缺乏人的大脑具有的自适应性,但是它擅长快速、重复和可靠地执行一系列明确定义的任务。计算机不会感到厌倦、注意力不集中并且不会犯简单的算术错误除非它遭受声名狼藉的PENTIUMFDIV缺陷、F00F错误、CYRIX昏睡问题或其他一些程序错误的影响。要点是如果底层的硬件和软件运行正确,计算可以无差错地每秒反复执行同样的任务上百万次。在遇到结算支票簿、搜索余额小于零的账户和执行其他许多涉及数字的任务时,计算机明显要比大脑快速得多且不容易出错。对于这类计算而言,计算机自然更快速,但是如果数据库设计拙劣,则即使这种令人吃惊的高计算速度也不可能起太多作用。良好的数据库设计可以在数秒内找到需要的数据而不必花费几个小时、几天或者根本找不到数据。1416良好设计和拙劣设计对应的结果表11总结了良好的设计和拙劣的设计影响上一节介绍的各种特性的方式。表11特性良好的设计拙劣的设计CRUD能够快速且方便地查找需要的数据。数据

温馨提示

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

评论

0/150

提交评论