您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > Access数据库一日通-郭安定
Access数据库一日通郭安定关系型数据库的正规化数据库并不是数据的堆积场没有适当加以规划,即使程序代码优化也难提升效率正规化是数据库领域的重要课题同时也是建立数据表的最高指导原则数据库的应用发展极其广泛,它的哲学其实很简单,就是『留住时间、储存思考精华』,这个世界上,即使再平凡的文件都可称为数据库:因为信息储存在不因时间而消失的媒介,以便可以重新延续既有的生命。数据库研究领域尚未风行前,文件存取多半经由循序存取、随机存取和二进制制存取方式达成,大多数程序语言都有这门技术的相关课题,其中,循序存取是将文件从头到尾读过一遍,我们可以将它想象成录音带,如果存取第一百笔数据,那么得经过第一到第九十九笔数据的读取,非常没有效率。相对于循序存取的方式,随机存取则像雷射唱盘,它的存取机制可以任意定位,无形中改进了存取速度,对于非一般文字型态的数据,例如:声音或影像则透过二进制制的存取方式,不论是随机或二进制制的存取方式,数据异动都是个很大的挑战,刚开始您得准备两个文件,一个作为读取,另一个则作为写入,例如:删除某个文件的第1000笔数据,那么得先从A文件读999个文件写入B文件,然后跳过第1000笔记录,再将A文件的第1001笔记录写到B文件,如果文件不大,那么没有人会抗议,但如果文件高达10MB呢?或者说高达100MB呢?恐怕没有人会痴痴等待。折衷的办法是在文件的前端设定参照的表头(Head),删除文件时仅是在某个纪录上做个标记,并未实际删除,虽然速度快,但还是没有节省储存空间,因此,我们需要另全新的储存机制,以便存取更多数字化数据,它必须够快而且更有效率,而数据库的领域正是在这样的背景下诞生的。资料建构的第一步科技的历史不仅短暂而且快速,尽管世界的某个角落还可以看到ISAM的影子,但现在毕竟已经是关系型数据库(RelationalDatabase)的天下了,桌上型数据库的产品几乎多到还来不及认识,每个月都有新产品的诞生和淘汰。现代数据库工具讲究的是效率,用户建立数据库并不需要伟大的知识,有些建构精灵(Wizard)甚至在还没来得及看清楚前,就把作品完成了,但这是个很大的危机,因为了解内部运作原理的人越来越少了,有些专家认为世界上并不会出现唯一的解决方案,因为即使我们和邻家用的调味料都未必相同,又怎么认定机器能决定所有人的喜好呢…自定工作环境是未来的趋势,对于数据库,能够了解关系型数据库的特性,并擅用正规化的技巧将有助于存取效益的提升,首先,我们必须了解,在数据库的概念里,数据表是最常见的输入口,也是组成数据库的重要单元,数据表由不同字段构成,就好像对象拥有不同的属性一样。对象的属性定义非常具有弹性,数据表的字段定义也一样,那么当一个数据表定义两个不同的字段和两个数据表各自定义一个不同的字段有什么不同呢?当然,这种问题不会难倒专家,他们会在纸上画些简单逻辑,还有讲授令初学者满腹狐疑的理论。很多人第一次建构数据库时,都是将可以想到的字段塞进一个数据表里,他们认为非常直觉:『因为当开启数据表时,所有能够存取的东西都在那里。』但您知道的,这种做法就好像出门时,戴着安全帽、雨伞、盥洗用具,外加锅碗瓢盆。为什么我们不能只将注意力集中在存取数据本身呢?当然可以,这种替数据表特别规划、决定哪些字段应该放在相同数据表,哪些字段应该分开的优化过程就称为正规化(Normalization),底下我们即将从一个简单案例学习正规化的步骤及其注意事项。为了说明起见,表一是未经正规化的数据,我们假想机器猫小叮当建了一个邮购网站,它的好朋友大雄、技安和宜静都来捧场,小叮当将所有交易都纪录在它的魔术笔记本,现在让我们来帮小叮当进行数据库的正规化。客户编号客户姓名信用评等消费日期商品分类商品代码购买商品购买金额备注说明001大雄尚可2/2AMB01一年会员$1000-001大雄尚可2/2BGD01任意门$999款项未清001大雄尚可2/3BGD02竹蜻蜓$150交换条件002技安差2/2AMB02半年会员$500-002技安差2/3BGD03缩小机$2000-002技安差2/4BGD02竹蜻蜓$150-002技安差2/4BGD04无痛胶布$200-002技安差2/4BGD05透视镜$2500-003宜静不错2/2AMB02半年会员$800大雄支付003宜静不错2/5BGD06快速滑板$400-表一:未经正规化的数据表有许多重复的字段。一次正规化正规化可经由几个不同的阶段逐一分析,第一阶段是『找出数据库里重复出现的数据,并设法将它独立成另一个数据表』,例如表一的客户编号、客户姓名和信用评等重复出现了好几次,其实只要使用一个客户编号就可以代表客户姓名和信用评等,例如:大雄的信用评等为尚可,不会突然有一笔信用平等不同的状况出现,因此,经过第一次正规化的结果可以拆成如下的两个数据表。客户编号客户姓名信用评等001大雄尚可002技安差003宜静不错表二:将客户的基本数据独立成一个数据表。客户编号消费日期消费分类商品代码商品名称购买金额备注说明0012/2AMB01一年会员$1000-0012/2BGD01任意门$999款项未清0012/3BGD02竹蜻蜓$150交换条件0022/2AMB02半年会员$500-0022/3BGD03缩小机$2000-0022/4BGD02竹蜻蜓$50-0022/4BGD04无痛胶布$200-0022/4BGD05透视镜$2500-0032/2AMB02半年会员$800大雄支付0032/5BGD06快速滑板$400-表三:简化后的消费数据。在这种情况下,简化后的消费数据表可以藉由客户编号到基本数据表找到更多详细数据,小叮当还可以在数据表扩充性别、生日、地址等其它数据,而且不会增加数据的重复性,至此我们算是完成了第一阶段的任务。二次正规化正规化的第二步骤是『找出数据表中绝对依赖的字段,并独立成另一个数据表』,例如商品代码和商品名称的关系是绝对依赖,GD02代表竹蜻蜓,如果种类很多种,应该赋予不同代码,好比飞天竹蜻蜓的商品代码命名为GD021、潜水竹蜻蜓的代码则是GD022,如此可以避免混淆,像这种存在绝对依赖的字段可以再拆成不同的数据表。商品代码商品名称购买金额MB01一年会员$1000MB02半年会员$500GD01任意门$999GD02竹蜻蜓$150GD03缩小机$2000GD04无痛胶布$200GD05透视镜$2500GD06快速滑板$400表四:再分出一个商品基本数据。客户编号消费日期消费分类商品代码备注说明0012/2AMB01-0012/2BGD01款项未清0012/3BGD02交换条件0022/2AMB02-0022/3BGD03-0022/4BGD02-0022/4BGD04-0022/4BGD05-0032/2AMB02大雄支付0032/5BGD06-表五:二次正规化后的消费数据。在进行的过程中,我们意外地发现商品名称和购买金额也具有绝对依赖关系,为了贪图方便,所以将它并入商品的基本数据表,目前表一已经拆成客户基本数据、商品基本数据和客户消费数据三个数据表了,赶紧再接再厉吧。三次正规化第三正规化的法则是『将数据表中相依字段独立成数据表』,这句话是什么意思呢?仔细检查消费数据表会发现表五重复率最高的是消费分类的A和B,小叮当最初的想法是将缴交会员费用的部分归在A等级,这样它可以很快经由筛选消费分类为A的纪录,统计某月会员费的缴交情形,而B等级的则代表一般商品。其实,这个字段与商品代码存在着相依的关系,因为从MB01或MB02反查自然就可以找到它们都是属于A等级的消费,而GD01~GD06则可以知道是属于B等级的消费,在这种情况下,我们可以将商品代码和消费分类另外独立成底下的数据表:消费分类商品代码AMB01AMB02BGD01BGD02BGD03BGD04BGD05BGD06表六:三次正规化后的相依数据。而消费数据表就再度缩减成表七了:客户编号消费日期商品代码备注说明0012/2MB01-0012/2GD01款项未清0012/3GD02交换条件0022/2MB02-0022/3GD03-0022/4GD02-0022/4GD04-0022/4GD05-0032/2MB02大雄支付0032/5GD06-表七:三次正规化后的消费数据。以上示范的就是最常见的三阶段正规化,但还是必须经过测试,才知道是否可以满足实际的需求,首先,正规化的最大好处是数据异动时,提供完整的一致性,例如:当小叮当开始生产隐形竹蜻蜓和潜水竹蜻蜓时,只要更改GD02的商品名称为飞天竹蜻蜓,那么过去参照到GD02的纪录,进行查询作业时也会一起变更,不会有错误的情况,目前看起来是不错的。大哥!过头了但我们也发现了一些问题,好比任意门的特惠价是$999,如果想优待大雄成为$800该怎么办?由于交易价格并非制定在消费历史数据而是商品基本数据,所以就会显得格外棘手,像这种情况称为假性依赖,也就是原先认定绝对依赖的项目会在某些情况改变,因此,这种字段不应独立成另外一个数据表,此外,检视表四和表六,不难发现这两个数据表可以再结合成单一数据表,这种情况下,反而更加精简。有时数据表的切割会因疏忽而有过度正规的现象,这时就可重新修正字段的分配,但请牢记『正规化仅是建立数据表的原则而非铁则』,重复数据数据过多时才能显现正规化的威力,如果数据表永远固定只有五笔记录,那么经过正规化的切割方式不见得提升存取效率,就好比表一的备注说明字段,它的内容和长度都是不固定的,与其增加备注代码另外兴建一个数据表,不如直接将它加在消费数据表来得恰当。关系的建立通常经过正规化的数据表已经很难看出纪录原貌,有时甚至要查上十几个数据表才有办法得出完整纪录,这也正是关系型数据库的最大威力:将数个数据表整合成能够阅读的纪录。以Access97为例,关系的建立采用图形操作模式,您可以将某个数据表的字段拖曳到另一个数据表的字段进行连结,连结字段的名称可以不同,但必须具备同性质内容,以小叮当情况为例,它的关系图像图一所示。图一:将数个数据表透过索引关系在一起。常见的关系方式有三种,第一种是对等连结,也就是左侧数据表与右侧数据表的字段内容相同时才显示数据;另一种是左边关系则是以左侧数据库为主,与右侧数据库字段相符或空白的纪录都会显示;最后,则是右侧关系。除了关系的建立外,您也可以在数据表内增加索引(Index)加快存取速度,但建立索引的缺点是减缓数据的异动速度,因此,整个数据库的规划必须经过慎密的分析,就数据异动的频繁和关系特性详细布局。维护的问题当数据库建立后,只是让它具备架构,还必须另外设计数据输入接口,这时就牵涉到维护的问题,以表七为例,如果更新大雄第二笔交易纪录,搜寻条件会很难决定,因为不论是满足任何字段的设定条件都不是唯一,因此必需赋予每笔记录一个识别代码,就像身分证字号一样,不会因为其它字段异动而受到影响。在Access97的工作环境,您可以在数据表内新增自动编号型态的特殊字段(参图二),当纪录逐项新增到数据表时,这个字段的数字会自动加1,即使稍后删除某些纪录,累加动作还是会继续进行,好比我们新增了五笔数据,那么自动编号会为每笔记录赋予从1到5的编号,即使删除第3笔,下个新增的纪录识别会是6,而不是3。图二:自动编号的字段可以协助资料维护的进行。这里我们提到了数据表建立的正规化原则,也说明了一般代码在关系扮演的角色、索引的建立,还有因应维护所需的自动编号代码,新手只要掌握这几个原则,设计的东西即使不是冠冕堂皇,也绝对人模人样了。
本文标题:Access数据库一日通-郭安定
链接地址:https://www.777doc.com/doc-4664790 .html