基于云计算的企业设备管理系统数据库的设计与实现.doc
基于云计算的企业设备管理系统数据库的设计与实现1.1 系统总体设计设备管理系统分为设备管理、租借管理、运行管理、报废管理、特种设备管理、统计分析、合同管理、基础信息管理和系统维护 9 个管理模块,每个功能管理模块又分为多个子功能模块。系统总体设计如图 1.1 所示。图1.1 系统总体结构1.2系统功能模块的设计1.2.1 设备管理模块在该功能模块中,主要实现建立设备台账信息,实现设备台账的查询等功能,完成设备数据的基础管理。在设备管理模块中共分为 9 个子模块,详细设计如图 1.2 所示,具体实现功能如下:1. 设备台账管理:详细记录与设备有关的各类信息,如分类编号、名称、品牌和购置日期等,可以全面反映和设备相关的各类信息。2. 设备台账、跟踪查询:以台账内所有设备信息为基础,依据设备所在状态,如闲置、在用、送检等,完成查找相关设备的功能。设备台账查询结果主要体现设备的基础信息,设备跟踪查询结果主要体现设备的变更情况和设备运行情况。管理人员可以根据不同的查询需求,采用合适的查询方法。3. 保修到期查询:通过设定指定日期,查找该日期之前保修到期的设备,当设备出现故障时,便于选择保修还是自维的方式进行处理。1. 设备增加管理、查询:该功能可以向系统内添加新增加的设备信息,并且可以设定日期间隔,查询该段时间内新增加设备明细。5. 领用出库管理、查询:记录设备的领用部门和经办人等信息,并且可以设定查询条件,查找相关设备领用信息。6. 领用退库管理、查询:记录设备的使用部门和退库人员信息,并且可以设定查询条件,查找相关设备的退库信息。7. 设备调拨管理、查询:记录设备的调出部门、调出经办人、调入部门和调入经办人信息,确保设备在企业内部的调动或移位时,完成相关信息进行更新,实现对设备调拨的电子化管理,避免设备调拨过程中出现的管理混乱。同时,可以设定查询条件,查找相关设备的调拨信息,提高相关工作的工作效率。8. 设备盘点管理、查询:通过定期或临时对设备的实际数量进行清查、清点,掌握设备的流动情况(入库、在库、出库的流动状况),对现有设备的实际数量与帐目上记录的数量相核对,将盘点的设备与盘点日期、盘点人员、审核日期和审核人员等信息记录在设备管理系统中。同时,可以设定查询条件,查找相关设备的盘点记录,并输出盘点设备的详细信息。图 1.2 设备管理模块图1.2.2 租借管理模块在该功能模块中,主要建立仪器设备租借的信息库,实现设备租借的查询等功能,完成仪器设备的租借管理。在仪器设备租借管理模块中共分为 6 个子模块,详细设计如图 1.3 所示,具体实现功能如下:1. 设备借用管理:当借用方提出设备借用需求,并完成仪器设备的相关借用手续后,企业设备管理人员可以通过管理系统记录设备的借出部门、借出人员、预还日期和借出技术状态等信息,同时可以便于查询借出设备的相关信息。在该功能模块中,也可以设定时间范围,查询在该时间段内所有的仪器设备借出记录。2. 设备归还管理:当借用人归还仪器设备时,通过管理系统记录归还日期、归还人员、接收人员信息及归还技术状态,同时输出设备的借出信息与归还信息,便于核实设备技术状态是否发生变化。在该功能模块中,可以设定时间范围,查询在该时间段内所有的仪器设备归还记录。3. 借用单据查询:在设备借用管理与设备归还管理功能模块中均具有借用单据查询功能,但是为了保护系统数据安全,在企业设备管理系统中,通过单独增加借用单据查询模块方法,并与系统管理员设定用户的使用权限相结合,使这些用户只具有查看权限,而不能够更改系统数据。1. 个人借用查询:当系统内保存了大量的借用数据时,查询某个人的借用记录将十分费时。在本系统中,可以通过个人借用查询模块方便的查找个人借用信息。在该模块中,首先可以选择员工所在部门,然后在部门的名单中找到该员工,同时该员工的所有借用信息结果也将一同输出。5. 设备租出、收回管理与租出单据查询:同设备借用相关管理模块相同,当仪器设备租出或收回时,可以通过系统记录,同时也可以完成租出单据的查询工作。图 1.3 租借管理模块图1.2.3 运行管理模块在该功能模块中,主要对仪器设备的缺陷、故障及维保等信息进行记录,实现仪器设备相应的查询功能,完成仪器设备的运行管理。在仪器设备运行管理模块中共分为 13个子模块,详细设计如图 1.4 所示,具体实现功能如下:1. 设备缺陷登记:该模块可记录存在缺陷的设备和发现人信息,重点对设备缺陷的描述进行记录,并保存对存有缺陷设备的处理意见。同时,在该功能模块中,也可以设定时间范围,查询在该时间段内所有的仪器设备缺陷登记记录。2. 设备消缺管理:如果存有缺陷的设备已经进行了维修,并且能够投入使用,该系统需要对其进行消缺管理。在该模块中可记录相关消缺信息,如日期、消缺人员、设备状态及处理情况,同时,在该功能模块中,也可以设定时间范围,查询在该时间段内仪器设备的消缺记录。3. 缺陷记录查询:在设备缺陷登记与设备消缺管理功能模块中均具有对应的查询功能。在企业设备管理系统中,通过单独增加缺陷记录查询模块方法,并与系统管理员设定用户的使用权限相结合,限制某些用户只具有查看权限,而不能够更改系统数据,达到保护系统数据安全的目的。1. 设备故障登记:当仪器设备发生故障后,需要对故障信息进行记录。在该模块中,主要记录了故障设备基本信息及发现人员、审核人员、送修人员、故障现象、故障原因和处理意见。同时,该模块也能够完成设备故障信息的查询。5. 故障维修管理:该模块设计建立在设备故障登记模块基础上,增加了维修信息管理与维修情况说明两部分内容。在维修信息中,包括维修单位、维修人员、修后状态和维修费用。同时,该模块也能够完成故障维修信息的查询。6. 故障记录查询:与缺陷记录查询功能一致,该模块可以完成故障记录及维修信息的查询工作,并且通过设置用户使用权限,使其只具有查看权限,进而达到保护系统数据安全的目的。7. 维保计划管理、设备维保管理、维保查询:在这三个模块中,涉及的内容均与仪器设备的维护与保养有关。主要功能为管理仪器设备基本设备信息、维保分类和维修信息等,并且能够查询与维保工作相关的信息资料。8. 设备封存管理、封存记录查询:对于一段时间不使用或不需要,而技术状态完好的仪器设备,相关部分可以进行封存处理,当封存审批完成后,可以在设备封存管理模块内录入设备封存的相关信息,如封存人员、封存部门等。同时,封存记录查询模块可以根据查询条件,查找设备封存的相关信息。9. 设备启封管理、启封记录查询:与上述两个功能模块相对应,当已经封存的设备需要重新投入运行时,需要提出相应的申请,并在设备启封管理模块中进行记录,同时,也可以完成相应的查询工作。图 1.4 运行管理模块图1.2.4 报废管理模块在该功能模块中,主要对仪器设备的报废、处置及销账等信息进行记录,实现仪器设备相应的查询功能,完成仪器设备的报废管理。在仪器设备的资料信息中,与报废相关的有启用日期、设备原值、折旧方式(平均年限法)、折旧年限(月)、残净值率(%),依据上述几个数据,可以计算设备现值。在仪器设备报废管理模块中共分为 7 个子模块,详细设计如图 1.5 所示,具体实现功能如下:1. 到期设备查询:随着设备使用年限的不断增加,设备现值逐渐降低,如果设备现值为零,则该设备已到使用年限,可以申请报废。在该模块中,以设备现值数据为查找依据,设定查询日期条件(如查询 2013 年 12 月前到期的资产),则可以查询到满足条件的数据。2. 设备报废管理、设备报废查询:通过查询当前日期前到期的设备,如果有到期设备,则可以申请报废。待相关手续办理完成后,需要在设备报废管理模块中添加报废设备信息,同时,必须更改设备基础信息(如设备状态和存放位置)并更新设备台账。对于已登记的报废设备,可以通过报废查询功能查找到相关仪器设备信息。3. 报废设备处置、处置记录查询:当设备报废工作完成后,需要对报废设备进行处理。在该功能模块中,需要记录报废设备的处理方式(出售或销毁)、回收公司及回收金额,对于已处置的报废设备,可以通过处置查询功能查找到相关仪器设备的信息。1. 设备销账管理、设备销账查询:对于报废已处置的设备,或者是已经丢失的仪器设备,需要进行销账登记。销账管理中主要记录销账方式(变卖、丢失)及更改设备基本信息。图 1.5 报废管理模块图1.2.5 特种设备管理模块在设备当中,部分属于特种设备,如锅炉、电梯计量器具等,由于这部分设备是涉及生命安全并且具有较大的危险性,因此,在本企业设备管理系统中,单独增加了对特种设备的管理。特种设备的管理是以设备台账为数据基础,从中添加符合条件的设备,通过设定一些检验规则,对特种设备的检验等进行细致的管理。在特种设备管理模块中共分为 9 个子模块,详细设计如图 1.6 所示,具体实现功能如下:1. 特种设备分类维护、设备检验规则维护:在这两个功能模块中,主要对特种设备进行分类,一般分为锅炉、压力容器、电梯、起重机械和计量器具五大类,并可以在每一大类中建立子分类。对于特种设备,其相关的检验检测都需要第三方机构进行,在系统中通过建立检验规则,便于特种设备的维护,这其中的信息包括检验周期(年或月)、检验负责人和检验单位名称等。2. 特种设备档案维护、档案查询:设备档案功能模块主要完成对设备台账中的数据进行筛选,根据设备类型,将其划分至相应的特种设备分类中,建立特种设备数据库。查询功能可根据设备分类,查找到相应的设备。在其余的功能模块中,主要完成查询在某个时间之前需要送检的设备,根据送检设备的时间先后顺序,安排计划。当设备送检时,对送检设备相关信息进行记录,送检结束后,向系统内增加检验报告,并可以对设备检测的每个阶段进行查询。图 1.6 特种设备管理模块图1.2.6 统计分析模块统计分析,常指对收集到的有关数据资料进行整理归类并进行解释的过程。统计分析分为三个步骤,收集数据、整理数据、分析数据。其中收集的数据为企业设备管理系统中的设备台账数据,整理数据以仪器设备分类(基础信息模块设定分类)为依据,分析数据采用描述统计方法,描述和归纳仪器设备数据的特征。在本系统中,统计分析模块主要完成设备分类、部门分类等数据的统计,共分为 15个子模块,详细设计如图 1.7 所示,具体实现功能如下:1. 设备分类综合统计:选择不同的设备分类,统计各类别设备的新增数量、新增金额、调入数量、调出数量、出库数量、退库数量、故障数量、销账数量等,并对各项统计数值进行汇总。2. 部门设备分类综合统计、明细列表:以部门为参考,对部门内各类设备进行统计汇总,并可以查询部门分类设备明细。3. 设备折旧统计:以月为统计单位,对各类别设备的折旧数据进行统计,包括折旧设备数量、设备原值、月初价值、本月折旧和月末价值等。同时,能够查询历史折旧设备数据。在其余的功能模块中,按照统计时间要求,主要完成新增、调入、调出、报废、故障、销账及维保设备的统计工作,并且能够导出统计结果,便于后期的数据查看和分析。图 1.7 统计分析模块图1.2.7 合同管理模块在企业的经济往来中,主要是通过合同形式进行的。设备合同中,主要包括设备的采购价格、维修保养信息及设备供应商的服务信息等。如果以纸质形式进行管理,不便于合同的管理、内容的查询和合同的保存。在企业设备管理方面,合同的数据管理也是至关重要的。在企业设备管理系统中,合同管理模块主要完成合同信息、货品、文件、付款信息等的数据记录工作。主要功能是可以监督设备供应商的责任是否全部履行,当设备出现故障时,可以查询相关的维保信息。1.2.8 基础信息管理模块在设备管理系统中,所有设备的管理均建立在企业和设备的基础信息之上,在该模块中,主要对企业的组织机构、职工信息、设备分类、厂商信息进行维护。建立完善的基础信息数据库,是管理好仪器设备的前提条件。在基础信息管理模块中共分为 12个子模块,详细设计如图 1.8 所示,具体实现功能如下:1. 组织机构维护:根据各部门之间的上下级关系,建立企业组织结构树。如某一部门和另一部分具有同级关系,它们建立在结构树的同一级,如该部门内部还有多个科室,则可以在部门内部建立其子树。2. 职工档案维护、查询:当组织机构建立结束后,可以根据职工所属部门,建立职工档案。当遇到有较大信息需要录入时,对于职工档案信息可以采用批量录入或通过Excel 表格导入的方法进行处理。当需要查询某职工信息时,可以根据职工编号、姓名或身份证等多个条件进行查找。3. 设备分类维护、属性设置、状态维护:在统计分析模块中,需要对设备按分类进行统计,其中设备分类可以在基础信息模块进行设置。设备分类建立结束后,可以设定分类属性,设置设备所处状态,如就地封存、完好运行、正常待报废、送检等。1. 仓库档案设置、存放位置维护:在企业当中,每个仪器设备均有其存放位置。建立完善的仓库档案和存放位置信息数据库,当仪器设备需要进行调配、维修和处置时,可以方便的查询设备所在位置。5. 供应、维修厂商维护:企业所采购的仪器设备中,均有其供货商和维修厂商。在该模块中,主要保存厂商的基本信息,如名称、银行账号及联系电话等。完整的供应商和维修商信息,当设备出现故障时,可以快速查找相关厂商,让其及时进行处理。图 1.8 基础信息管理模块图1.2.9 系统维护模块完整的企业设备管理系统,除了基本的数据处理功能外,还需要有完善的系统维护功能,该模块主要实现系统操作人员管理和操作权限设置,在设计上共分为 6 个子模块,详细设计如图 1.9 所示,具体实现功能如下:1. 系统参数维护:该项功能主要对基本的设备信息字段进行设置,如设备编号的序号位数、前缀字符、职工编号的序号位数和日志保存期限等。2. 角色授权管理:系统用户账户,可以被分配不同角色,不同的角色所拥有操作权限不同,如采购员具有设备增加和部分查询的权限,而不具备其它操作权限。3. 操作人员授权:管理系统用户,系统管理员拥有最高权限,可以完成系统内所有操作。通过系统管理员账户,可以为系统添加或删除账户,并且给各用户账户分配角色,如采购员、管理人员、资产管理员和系统管理员。通过对不同角色授予不同权限,进而可以控制不同用户的操作权限。1. 操作日志查询:该功能可以记录用户的登录时间、用户信息及操作内容,通过记录操作日志,可以详细了解系统数据的变化。5. 数据备份恢复:为了确保数据的安全,需定期进行数据的备份,如果发生数据库的异常,应选用最近的数据库备份文件进行恢复。图 1.9 基础信息管理模块图以上主要对企业设备管理系统的各功能模块的详细设计进行了分析,根据设计,要实现各项功能,需要建立完整的数据库系统,本系统的数据库设计,数据库表和各表之间的关系将在下一节做详细介绍。1.2.10 设备维护管理设备维护管理指系统中所有需定义的各级、各类设备和零件的类别,例如:复烤机、小车、摆把台皮带传动电机等等。管理员可以按照实际需求,通过对设备参数种类的增加、删除、修改达到动态维护设备参数种类的目的。1.2.11 设备备品备件管理设备科工作人员可以根据经验,对每种型号的备件设置一个最低的库存预警值,为系统预警提供条件。1.2.12 设备运行风险分析通过备件库存预警的最低值,通过系统自身运算查询库存信息,与预警值对比,当库存小于预警值后,会以综合报表的形式展现出来。1.3数据库的设计1.3.1CouchDB建模(1)CouchDB概述CouchDB是Apache Software Foundation的一个开源的面文档的数据库管理系统,可以通过RESTfuI JavaScript Object Notation ( JSON ) API访问。 “ Couch”是“Cluster Of Unreliable Commodity Hardware”的首字一母缩写,它反映了CouehDB的目标具有高度可伸缩性,提供了高可用性和高可靠性,即使运行在容易出现故障的硬件上也是如此。CouchDB最初是用C+编写的,但在2008年4月,这个项目转移到Erlang OTP平台进行容错测试25。CouchDB可以安装在大部分POSIX系统上,包括Linux和 Mac OS X。(2)CouchDB特点分析1)提供RESTFuI API对CouchDB的访问是以HTTP GET/PUT/POST/DELETE + JSON的形式进行的。2)基于文档存储数据之间没有关系范式要求,一个CouchDB文档是一个包含名字域的对象,所有域值形成一个列表,可能包含字符串、数字和数据。一个CouchDB数据库是一个普通的文档集合类,每个文档都由一个唯一ID即DocID来标识,文档是独立的存储元素,有ID和版本号。3) MVCC( Multi-Version-Concurrency-Control)CouchDB是一个带有乐观锁的多版本并发控制(MVCC)系统,可以实现一个客户端看见一个数据的快照并使用该快照,即使该快照同时正在被另外一个不同的客户端进行修改。4)用户自定义View在CouchDB中用户可以自定义View,通过View实现一个类似于Map-Reduce的过程,以此来汇集和统计数据。CouchDB的View针对每个Database,但是其与Database关联性不是很大,View是一些用户自定义函数,它存储在design Document中,需要注意的是design Document和View Index两者的概念是不同的。.design Document保存的是view的定义。.View Index保存的是针对某个Database进行View操作,产生的结果。5)内建备份机制CouchDB的备份机制是通过复制来实现的,而且在CouchDB中复制也是分布式的。一个服务器在离线并且数据发生改变后可以更新期数据。如果存在冲突,CouchDB将会选择一个获胜者并在之后保存为最新数据。用户可以手动的覆盖这个冲突解决策略,最重要的是,应一该保证冲突解决方法在哪里都产生相同的结果来保证离线更新会被恰当的处理。6)支持附件每个文档都可以有附件,且对附件大小没有限制。7)使用Erlang开发设想在我们的生活中的一个应用场景,有很多document,比如信件,账单,笔一记等,它们只是简单的信息,没有关系的需求,我们可能仅仅需要存储这些数据。这样的情况下,CouchDB应该是很好的选择。当然其它使用关系型数据库的环境,也可以使用CouchDB来解决。 根据CouchDB的特性,在某些偶尔连接网络的应用中,我们可以用CouchDB暂存数据,随后进行同步;也可以在云计算环境中,作为分布式的数据存储。使用CouchDB,意味着我们不需要在像使用RMDBS时一样,在设计应用前首先设计表示数据结构的Tabl e,这样我们的开发将会更加快速,灵活。(3) CouchDB与关系数据库的比较对很多人而言,刚接触面向文档的数据库这个概念时很难理解它,尤其是长期与关系数据库打交道的人员,这是因为这两个模型具有非常大的差异性。1)数据存储形式顾名思义,面向文档的数据库是由一系列自包含的文档组成的。这意味着所有相关的数据都储存在该文档中,而不是关系数据库的关系表中。事实上,面向文档的数据库中根本不存在表、行、列或关系,这意味着它们是与模式无关的,不需要在实际使用数据库之前定义严格的模式。如果某个文档需要添加一个新字段,它仅需包含该字段,从而不影响到数据库中的其它文档。因此,文档不必为没有值的字段储存空数据值。假设现在需要将大量名片存入数抓库,每张名片上的信息包括人名、所属公司名称、担任职务以及联系方式(可能包括座机号码、手机号码、传真)等。在关系数据库中,您需要使用4个以上的表来储存这些数据:一个“Person"表、一个“Company”表、一个“Contact Details”表和一个用于储存名片本身的表。这些表都有严格定义的列和键,并且使用一系列的连接(join )组装数据。虽然这样做的优势是每段数据都有一个惟一真实的版本,但这同时为以后的修改带来很大不便。此外,也不能修改其中的一记录以用于不同的环境。例如,一个人可能有传真号码,而另一个人没有。在名片上不应该显示“传真:没有”,而是忽略任何关于传真的细节。在面向文档的数据库中,每个名片都储存在各自的文档中,并且每个文档都可以定义它需要使用的字段。因此,对于没有传真号码的人而启,就不需要定义传真的值,而对于有传真号码的人,则根据他们的意愿定义该值。2)唯一标识符这两种数据库的另一个不同点是惟一标识符的储存。在关系数据库中通常可以使用主键,它山一个自动递增特性或序列生成器生成。当然,这些标识符仅相对于所使用的表或数据库是惟一的,其它表或数据库还可以使用它们。如果同时对不同网络上的两个数据库执行更新操作,这两个数据库不会同时准确地获取下一个惟一标识符。CouchDB没有自动递增或序列特性,相反,它为每个文档分配一个通用惟一标识符(Universally Unique Identifier, UUID ),这就杜绝了其它数据库意外地选择相同的惟一标识符的情况。3)是否支持连接面向文档数据库和关系数据库的另一个重要区别就是面向文档数据库不支持连接,因此CouchDB中没有主键和外键,没有基于连接的键。这并不意味着不能从CouchDB数据库获取一组关系数据。一个称为视图的特性允许您为没有在数据库中定义的文档创建一种任意关系。这意味着您能够获得典型的SQL联合查询的所有好处,但又不需要在数据库层预定义它们的关系。一定要注意,虽然面向文档数据库的操作方式不同于关系数据库,但这并不意味着它们是可以替换的。CouchDB的目的并不是替换关系数据库,而是为那些更适合使用面向文档模型(而不是传统的关系数据模型)的项目提供一种选择,比如wiki、博客和文档管理系统等。1.3.2CouchDB实体关系描述CouchDB能够适应非常广泛的应用场景,在某些偶尔连接网络的应用中我们可以用CouchDB暂存数据,随后进行同步。也可以在Cloud环境中,作为大型的分布式的数据存储。接下来我们将从CouchDB的体系结构l对CouchDB进行详细的解析26,其体系结构如图1.10所示、:图1.10 CouchDB的体系结构(1)Erlang VM环境CouchDB是用Erlang编写的,因此,CouchDB必须运行在一个Erlang VM环境中。Erlang是一种健壮的函数式编程语言,非常适合于构建并发的分布式系统,Erlang的设计非常灵活,其可伸缩性与可扩展性都非常棒。在Windows中安装使用CouchDB时要先安装Erlang,但在Ubuntu 9.10中,默认已经安装有Erlang环境了。(2)Erlang HTTP接口 正如前面所提到的,CouchDB以RESTfuI API的格式提供服务。CouchDB所有的读写能力都可以通过简单的调用Erlang HTTP请求来实现。这个API可以通过HTTP GET和POST请求访问,并巨使用JSON以JavaScript对象的返回数据。这使执行数据库操作非常容易,并且与应用程序用什么语言开发无关。正因为采用那么一种统一且简洁的服务接口,可以很方便地开发各种语言的HTTP客户端,以方便不同程序员的使用,目前CouchDB已经支持例如Java, C+, C#, Python等多种常用语言。(3)文档引擎文档引擎,实现对文档数据管理。1)文档(Document )文档是CouchDB中的核心概念。一个CouchDB数据库实际上是一系列文档的集合,而这些文档之间并不存在层次结构。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。每个文档都有一个全局惟一的标识符(ID)以及一个修订版本号(revisionnumber )。ID用来惟一标识一个文档,而修订版本号则用来实现多版本并发控制(Multiversion concurrency control MVVC )。在CouchDB,文档是以JSON对象的形式保存的。一篇博文的CouchDB文档可以表示如下:"Subject": "How to"Author": "Adam"implement a blog system" "PostedDate": "6/12/2009" "Tags": "blog system","java development","web" "Body": "Develop a blog system based on java.” 在上面这个文档里,Subject域包含一个字符串,其值为"How to implement ablog system ", PostedDate域为时间,其值为"6/12/2009" ,Tags域包含一个列表,其列表有三个值,分别为"blog system"."Java development","web",Body域为博文主体,其值为"Develop a blog system based on Java."。2)数据库(Storage File )在CouchDB中,Database表示一个数据库,每个Database对应一个”Storage"(后缀为.couch ) , Database Storage中可以存储任意的Document。数据库文件的后缀为.couch,由Header和Body组成,如图1.11所示。图1.11 一个couch文件.Header包含两个完全相同的Header信息,每个Header的Size为1024,因此Header总长度为:单个Header * 2 = 2048 。.Body由两个B+Tree组成,其中一个B+Tree根据Document id进行组织,另一个B+Tree以seqnum ( CouchDB内部使用的序号,用来指示最新Revision的文档)为key。所有的更新操作(包括document的创建,修改和删除)都是以在couch文件尾部追加的方式(即Append方式)进行。我们进行更新时,首先拷贝原有的数据信息(仅仅针对修改,如果是Create那么就没有copy可言了),随后将其追加到文件的结尾,这个时候就激发B+Tree从leaf到root的更新过程,更新的Node信息也是采用Append的方式写入到文件的结尾,到达根节点时,我们将根节点信息写入到Header中。这样一次更新操作涉及1次数据写入,以及 LogN次节点更新,所以其复杂度为O(IogN) 。(4)视图引擎视图引擎,实现对视图索引的管理。视图是CouchDB中文档的呈现方式。在很多情况下,应用都需要对文档进行一定的处理,包括过滤、组织、聚合和生成报表等。在关系数据库中,这通常是通过SQL语句来完成的。CouchDB中的视图声明了如何从文档中提取数据,以及如何对提取出来的数据进行处理。1)视图模型通过用户自定义View,我们一可以汇集,统计数据,采用一个类似Map/Reduce的过程。这里的Map将原始的Document进行映射处理,Reduce将Map的中间结果进行重新归并统计,总而生成最终结果。这里和并行计算中的Map/Reduce有些不同。CouchDB的View针对每个Database,但是其与Database关联性不是很大,View是一些用户自定义函数,处理从数据库的Document输入,产生中间数据 (如果没有reduce过程则为最终数据),然后再通过Reduce处理中间输出,产生最终结果。同样的View可以使用在不同的Database上。View存储在design Document中,请注意这里design Document和View Index是不同的。design Document保存的是view的定义,View Index保存的是针对某个Database进行View操作,产生的结果。2) Spider-Monkey引擎SpiderMonkey是一种功能非常强大的JavaScript引擎。CouchDB内部默认使用JavaScript作为View的编写语言,之所以采用Javascript,新口CouchDB面向Web发相关的。CouchDB使用Mozilla的spider-monkey作为JavaScript的解析运行平台。View中包含两个函数:.map函数,必须 function(doc) emit(null, doc); .reduce函数,可选 function (key, values, rereduce) return sum(values); doc,为我们数据库对应的Document,因为我们采用JSON格式存储数据,所以Document在JavaScript中转化为Objecto emit(null, doc) 用来生成map的中间结果,其中第一个参数null表示结果的key,第二个参数为结果的value ,上面的例子中我们的结果为:null, value 1null, valueN在function (key. values. rereduce) 中,根据rereduce变量不通这堆有两种情况:第一种:rereduce为false.key为array ,element为:key,id), key为map function产生的key, id为Document对应id.values为array, elements为map function产生的结果.比如reduce( keyl,idl. key2,id2. key3,id3 . valuel,value2,value3, false)第二种:rereduce为true.key为null.values为array, element为前一次reduce返回的结果.比如reduce(null, intermediatel,intermediate2,intermediate3, true).很多时候,我们一次调用reduce就可以生成最终结果,我们会忽略rereduce参数。3) ICU UTF8 Collation实现对字符集的管理。除了极为出色的复制特性,CouchDB的可靠性和可扩展性也通过Erlang编程语言增强了。Erlang本身内嵌了对并发、分布式、容错的支持,而且有多年在通信领域构建可靠系统的实践。复制机制CouchDB是一个完全平等的分布式数据库系统,它最强大的特性之一就是它的复制框架Replicator。该框架提供了一套综合的复制特征:.Master->Maste:复制.过滤复制.带双向冲突检测的渐增式复制它允许用户和服务器在未连接时访问和更新相同的共享数据,然后在服务器连接到网络后双向复制这些改变的数据。其复制过程是渐增式的,在每次系统连接到网络后,Replicator都要检查上次更新之后又被更新的文档,然后仅仅那些发生变化的field额blob被复制,如果由于网络问题此次复制失败,那么Replicator会在下一次复制时重新从上次失败的点开始继续复制。这些特征可以组合使用来创建出强大的方案解决IT领域的很多难题,像可靠性和可扩展性。(5)CouchDB访问和编程接口CouchDB提供REST API来供客户端程序使用CouchDB的功能,并对数据库进行操作。REST API主要针对CouchDB中的三钟资源:数据库、文档和视图,下面分别介绍这三种REST API。1)数据库REST API数据库REST API用来查询、创建和删除数据库。CouchDB中数据库的名称只能是小写字母、数字以及特殊字符_$()+-/。需要注意的是大写字母是不允许的,这是由于某些操作系统的文件系统是大小写不敏感的。CouchDB为了避免可能出现的问题,限制了不能使用大写字母。数据库REST API的具体用法如下:.通过GET请求访问URL/_all_dbs可以查询CouchDB中所有的数据库名称。该请求返回的是一个JSON数组,其中每个元素表示一个数据库名称。.通过GET请求访lbJURL/databasename/可以查询名为databasename的数据库的具体信息。该请求返回的是一个JSON对象。.通过PUT请求访问.URL/databasename/ 可以创建名为databasename的数据库。如果数据库创建成功的话,返回HTTP状态代码201;如果已有一个同名数据库的话,返回HTTP状态代码412。.通过DELETE请求访URL/databasename/可以删除名为databasename的数据库。如果数据库删除成功的话,返回HTTP状态代码200;如果数据库不存在,返回HTTP状态代码404。2)文档REST API文档REST API用来查询、创建、更新和删除文档。具体的用法如下:.通过GET请求访问URL/databasename/doc id可以获取名称为databasename的数据库中ID为doc id文档的内容。文档的内容是一个JSON对象,其中以“”作为前缀的顶层字段是由CouchDB保留使用的,如id和rev 。.通过PUT请求访Ip7 URL/databasename/doc id可以在名称为databasename的数据库中创建ID为doc id的文档。通过POST请求访问URL/databasename/也可以创建新文档,不过是由CouchDB来生成文档的ID。.通过PUT请求访问URL/databasename/doc记可以更新己有的文档。在PUT请求内容的文档中需要包含rev字段,表示文档的修订版本号。CouchDB使用该字段来做更新时的冲突检测。如果该字段的值与CouchDB 中保存的该文档的修订版本号一致,则表明没有冲突,可以进行更新。当更新完成之后,返回HTTP状态代码201;否则返回I4TTP状态代码409表示有版本冲突。.通过DELETE请求访Ip URL/databasename/doc id?rev=rev id可以删除数据库databasename,扣ID为doc id,并且修订版本号为:ev id的文档。3)视图REST API视图是CouchDB中文档的呈现方式。在CouchDB中保存的是视图的定义。CouchDB中有两种视图:永久视图和临时视图。永久视图保存在设计文档的views字段中。如果需要修改永久视图的定义,只需要通过文档KEST API来修改设计文档即可。临时视图是通过发送POST请求到URL/databasename/ temp_view来执行的。在POST请求N需要包含视图的定义。一般来说,临时视图只在开发测试中使用,因为它是即时生成的,性能比较差;永久视图的运行结果可以被CouchDB缓存,因此一般用在生产坏境中。4)附件REST APICouchDB有内嵌型和独立型两种附件存储方式。