MYSQL网站制作之XML和数据库之间的干系
你可以配置MySQL运行在微小的嵌入式应用程序中,处理的数据可能不足1Mb??而你也可以用它来处理数Tb的数据。MySQL获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。xml|数据|数据库1.0简介本论文扼要的切磋了XML和数据库之间的干系,同时列出一些可使用数据库处置XML文档的软件。固然这里不盘算细致地先容这些软件,可是笔者但愿它可以形貌利用数据库处置XML文档中的次要部分。这里有点倾向与干系数据库,由于我的履历云云。2.0XML是数据库吗?在入手下手会商XML和数据库之前,我们必要回覆一个环绕在良多心头的成绩:"XML是数据库吗?"在严厉意义大将,假如"XML"是指XML文档时,谜底是"否"。只管XML文档包括了数据,可是假如没有其他的软件来处置这些数据,它关于数据库的意义和其他文本文件没有甚么区分。假如在更加广泛一些的意义大将,当"XML是指XML文档和一切相干的XML的工具和手艺时,谜底则是"是"。之以是一定是因为XML供应了很多数据库中所必要的部分:存储(XML文档),布局(DTD,XMLschema言语),查询言语(XQL,XML-QL,QUILT等),编程接口(SAX,DOM),等等。不外...XML还短少良多在实在的数据库中所必备的内容:无效的存储、索引、平安、买卖、数据完整性、多用户会见、触发、多文档查询等。因而假如在数据量一样平常、用户较少、功能请求不高的情况下能够把XML看成数据库来利用;而在年夜多产物的情况中,请求有很多的用户利用、必要严厉的数据完全性而且对功能有很高的请求,XML就不克不及胜任了。并且,思索到象dBase和Access等数据库既廉价又非常易用,因而乃至在第一种情形下XML都很少有来由充任数据库的脚色。3.0为何利用数据库?当在思索利用XML和数据库时,第一个要问本人的成绩应当是:为何我必要利用数据库?你必要将原本的数据导出?你必要保留你的Web主页?你是要在一个电子商务使用中利用数据库,并且个中XML当作传输的数据格局?这些成绩的谜底都将间接影响到你对数据库和两头件(假如有的话)的选择。比方,假定你在电子商务使用程序中利用XML来举行数据传输。这是很好的计划,由于你的数据具有高度标准的布局,而XML中的那些实体和编码对你而言其实不主要了。究竟样你体贴的仅仅是数据而不在于这些数据怎样在文档中举行物理的存储。假如你的使用程序绝对对照复杂的话,干系数据库和数据传输两头件将能够满意你的需求;假如使用程序复杂并且庞大,那末你就必要一个完整撑持XML的开辟情况了。从另外一方面来讲,假定你有一个从零星的XML文件创立的网站。你不但必要办理这个网站,你还要供应办法让用户能够查询个中的内容。这时候你的文件将十分的不标准,而实体的利用对你来讲将变得很主要,由于这些文件的布局是网站的基本。在这个例子中,你就必要某类"原生XML"数据库能够实行版本化、跟踪实体的利用而且撑持如XQL如许的查询言语。4.0数据和文档的对照笔者以为,在选择数据库时,最主要的判别要素多是你是使用数据库来保留数据仍是保留文档。假如你想保留数据,你必要的数据库次要是面向数据存储(比方干系型数据库大概面向工具型数据库)和在数据库和XML文档之间互相转换。从另外一个角度来将,假如你想存储文档,你必要一个专门计划用来存储文件的内容办理体系。固然你能够本人把文件保留在干系数据库或面向工具数据库中,但是你常会发明你的事情是在反复内容办理体系的功效。相似的,固然一个内容办理体系一般是创建在面向工具数据库或干系数据库之上,但如果把一个内容办理体系当作数据库来利用便可能十分的使人包围。你必要存储数据仍是文档,谜底经常取决于你的XML文档。缘故原由是XML文件分为两年夜类:以数据为中央和以文档为中央。.4.1以数据为中央的文件以数据为中央的文件的特性是布局相称标准、数据颗粒度好(也就是说,数据中最小的自力单位是PCDATA元素大概是属性)、很少大概没有夹杂内容。个中同条理元素和PCDATA的呈现按次其实不主要。典范的例子是,XML文档包括了发卖订单、航行布置、餐馆菜单等等。数据为中央的文档常被用于呆板的利用,这时候XML多是过剩的---它仅仅是数据传输的手腕罢了。比方,上面的发卖订单的文档就是以数据为中央的:ABCIndustries123MainSt.ChicagoIL60609981215Turkeywrench:Stainlesssteel,one-piececonstruction,lifetimeguarantee.9.9510Stuffingseparator:Aluminum,one-yearguarantee.13.275在XML的天下中,很多内容丰厚的文档实践上都是数据为中央的。我们以显现图手札息的Amazon.com网站为例。固然这个页面是相称伟大的文本,可是这个文本的布局是高度标准的,个中很多的部分对任何的书籍形貌页面都是不异的,而且特性页面中的各部分的巨细都是无限的。也就是说,该页面能够经由过程一个复杂的、数据为中央的XML文档来创建,个中包括了从数据库中检索失掉的文本信息和一个XSL款式表。一般,今朝任何经由过程在模板中添补数据库数据而静态机关HTML页面的网站都能够被下面先容的用以数据为中央的XML文档和一个大概多个的XSL款式表体例替换。ABCIndustriesagreestoleasethepropertyat123MainSt.,Chicago,ILfromXYZPropertiesforatermofnotlessthanTimeUnit="Months">18atacostofCurrency="USD"TimeUnit="Months">1000能够从上面的XML文档和复杂的款式表失掉:ABCIndustries123MainSt.,Chicago,ILXYZProperties1810004.2以文档为中央的文件以文档为中央的文档的特性是:布局不标准、数据颗粒度更年夜(即,最小的自力数据单位是包括有夹杂内容的元素大概就是全部XML文档)和含有大批的夹杂内容。个中不异条理的元素和PCDATA呈现按次长短常主要的。典范的例子是书、电子邮件、告白和年夜多半XHTML文档。以文档为中央的文档是用于人的利用。比方,上面的产物形貌文档就是以文档为中央:TurkeyWrenchFullFabricationLabs,Inc.Likeamonkeywrench,butnotasbig.Theturkeywrench,whichcomesinbothright-andleft-handedversions(skyhookoptional),ismadeofthefineststainlesssteel.TheReadi-griprubberizedhandlequicklyadaptstoyourhands,eveninthegreasiestsituations.Adjustmentispossiblethroughavarietyofcustomdials.Youcan:OrderyourownturkeywrenchReadmoreaboutwrenchesDownloadthecatalogTheturkeywrenchcostsjust$19.99and,ifyouordernow,comeswithahand-craftedshrimphammerasabonusgift.4.3数据、文档和数据库在实际情形中,以数据为中央的文件和文档为中央的文件之间的区分并非很严厉。比方,一个以数据为中央的文件(如一张发票),也有大概包括粗颗粒度、不划定规矩的数据(如发票的形貌部分)。而一个以文档为中央文件(如用户手册)也大概包括有优秀颗粒度、划定规矩的布局化数据(一般是元数据),比方作者和订正日期。除此以外,让你的文档具有以数据为中央大概以文档为中央的特性有助于你判别是体贴数据仍是文档,这也将决意你必要接纳甚么样的体系。要存储或检索数据,你可使用一个数据库(一般是干系型、面向工具型大概是条理型)和两头件(字带大概是接纳第三方),你也能够利用XML服务器(即创立散布式使用的平台,比方使用XML举行数据传输的电子商务使用)。要保留文档,你将必要一个内容办理体系大概是分歧性的DOM完成体系。有关各种体系的切磋在5.0"存储和检索数据"大节和6.0"href="#storingretrievingdocs">存储和检索文档"大节。你也可以在href="http://www.rpbourret.com/xml/XMLDatabaseProds.htm">XML数据库产物中懂得具体的相干产物列表。5.0存储和检索数据在以数据为中央的文档中的数据内容大概来自数据库(此时你想把数据导出为XML格局),也多是XML文档(此时你想把数据存储在数据库中)。前者的例子是在干系型数据库中存储的大批现无数据(或称遗产数据);后者的例子是将数据作为XML公布在Web中,并且你想要在你的数据库中举行存储以举行更多的处置。云云,依据你的需求,你大概必要将XML文档转移到数据库的软件,也大概必要从数据库转移到XML文档的软件,大概二者都撑持。5.1转移数据将数据存储在数据库中时,常常必要抛弃大批与文档有关的信息,比方文档称号和DTD,同时另有其物理布局,比方实体的界说和利用、属性值和同层元素的按次、二进制数据的存储体例(是Base64编码、是未析实体或他体例)、字符数据段和其他的编码信息。相似的,当从数据库中检索数据时,天生的XML文档了局除非预界说实体lt(<"),gt(">"),amp("&"),apos("’"),quot(""")不包括任何CDATA或实体援用。而同层元素和属性的呈现按次也经常就是从数据库中前往的数据的序次。只管一入手下手有些让你受惊,可是这经常是公道的。比方,假定你必要用XML作为数据格局把一张发卖从一个数据库直达移到另外一个数据库中。在这类情形下,在XML文档中其实不体贴发卖单的编号是保留在发卖单的日期的后面仍是前面,也不必体贴是不是将主顾的称号保留在字符数据(CDATA)段仍是作为一个内部实体,大概间接当做一个PCDATA。最主要的在于相干的数据是从第一个数据库转移到第二个数据库中。如许,这个数据传输软件就必要思索数据的条理布局(该布局将发卖单的有关举行举行了分组),而其他则不用过量思索。疏忽文档信息和其物理布局的成果之一是文档的"逆反回回"的纷歧致效应,行将一个文档的数据存储在数据库中,然后依据这些数据从头构造成新的文档。而即使是依据尺度格局处置,失掉的也经常是和后面分歧的文档。这是不是能够承受要取决于你的需求,并且也将影响到你对数据库和数据传输两头件的选择。5.2从文档布局到数据库布局的映照为了在XML和数据库之间传输数据,必要在文档布局和数据库布局之间举行互相的映照。如许的映照一般分为两年夜类:模板驱动和形式驱动。5.2.1模板驱动的映照在以模板驱动的映照中,没有事后界说文档布局和数据库布局之间的映照干系,而是利用将命令语句内嵌进模板的办法,让数据传输两头件来处置该模板。比方,思索上面的模板(注重该模板其实不合用任何实践的产物),在<SelectStmt>元素中内嵌了SELECT语句:<?xmlversion="1.0"?><FlightInfo><Intro>Thefollowingflightshaveavailableseats:</Intro><SelectStmt>SELECTAirline,FltNumber,Depart,ArriveFROMFlights</SelectStmt><Conclude>Wehopeoneofthesemeetsyourneeds</Conclude></FlightInfo>当数据传输两头件处置到该文档时,每一个SELECT语句都将被各自的实行了局所交换,失掉上面的XML格局:<?xmlversion="1.0"?><FlightInfo><Intro>Thefollowingflightshaveavailableseats:</Intro><Flights><Row><Airline>ACME</Airline><FltNumber>123</FltNumber><Depart>Dec12,199813:43</Depart><Arrive>Dec13,199801:21</Arrive></Row>...</Flights><Conclude>Wehopeoneofthesemeetsyourneeds</Conclude></FlightInfo>这类以模板驱动的映照能够相称的天真。比方,有些产物能够同意你在任何了局汇合中交换你想要的内容(包含在SELECT中利用参数),而不是象下面的例子中复杂地格局化了局。别的它还撑持利用编程来举行机关,比方轮回和前提判别布局。另有一些还撑持SELECT语句的参数化,比方经由过程HTTP来传送参数。今朝,以模板驱动的映照只撑持从一个干系型数据库转换成XML文档的情形。5.2.2模子驱动的映照在以模子驱动的映照中,使用XML文档布局对应的数据模子显式或隐式地将映照成数据库的布局,并且反之亦然。它的弱点是天真性不敷,可是却复杂易用,这是由于它是基于详细的数据模子来举行映照的,一般可以为用户完成良多地转换事情。因为将数据从数据库转换成XML的了局按照了单个模子,因而一般在这类体例下一般分离XSL来供应模板驱动的体系中所具有的天真性。在XML文档中的数据视图一般有两种模子:表格模子和特定命据工具模子。偶然候也大概会呈现其他的模子。比方,经由过程接纳ID和IDREF属性,一个XML文档能够用来一个指定的图形。不外,良多现有的两头件其实不撑持这些模子。5.2.2.1表格模子很多两头件软件包都接纳表格模子在XML和干系型数据库之间举行转换。它把XML的模子当作是一个独自的表格大概是一系列的表格。也就是说,XML的文档的布局和上面的例子相相似,个中在单个表格的情形下,<database>其实不呈现:<database><table><row><column1>...</column1><column2>...</column2>...</row>...</table>...</database>个中的术语"table"可了解为单个的了局集(当从数据库向XML直达换数据时),大概是一个独自的表格或可更新的视图(当从XML向数据库转换数据时)。假如数据必要来自多个了局集(当数据来自数据库中时)大概与仅仅表告竣一系列表格的汇合(当转换数据到数据库时)比拟,XML的文档包括有更深条理的嵌套元素,那末相似的转换几近是不成能的。5.2.2.2特定命据工具模子XML文档中第二种广泛的数据模子是特定命据工具的树型布局。在该模子中,元素范例一般对应工具,而XML中的内容模子、属性和PCDATA则对应工具的属性。这类模子间接映照成面向工具的数据库和条理型数据库,固然借助于传统的工具-干系映照手艺和SQL3工具视图也能够映照成干系数据库。要注重的是,这类模子并非文档工具模子(DOM)。DOM是对文档自己举行建模,而不是对文档中的数据。如href="#writeyourown">6.1.2大节所述,DOM用来在干系型数据库的基本上创建内容办理体系。比方,下面的发卖订单文档就能够看做是由五个类所构成的树型布局。以下面的视图所示,包含Orders,SalesOrder,Customer,Line和Part类:Orders|SalesOrder/|CustomerLineLine||PartPart当把一个XML文档建模为一棵特定命据工具树时,就没有需要请求元素必定要对应于工具。比方,假如一个元素只包括PCDATA,如发卖订单文档中的CustName元素,它能够看成一个属性举行处置,因而属性只包括单一的、标量型数值。相似的,偶然将夹杂元素或元素内容模子化成属性也长短常有效的。一个现成的例子就是在发卖订单文档中对Description元素的处置:只管它在XHTML的格局中有夹杂内容,可是将Description元素看做单个的属性会更有效些,由于它的构成部分自己并没有甚么意义。5.3数据范例、空值、字符汇合和别的本节将切磋一些有关来自数据库的XML文档的存储成绩。一般,你决意不了你选择的两头件是怎样办理这些成绩的,可是你最好应当意想到这些成绩的存在,由于这有助于你准确选择你的两头件。5.3.1数据范例XML不撑持任何有实践意义的数据范例。除未析实体,一切XML文档中的数据都被当做文原本看待,即使它可以用其他的数据范例(如日期大概整数)来暗示。一般,数据转换两头件将把XML文档中的文本转换成别的数据库中的数据范例,反之亦然。但是,特定的数据范例所辨认的文本格局是无限制的,比方遭到供应的JDBCDriver所撑持的数据范例的限定。在这些浩瀚的数据范例中,日期范例一般会招致贫苦。分歧国际区域的数字格局的差别也大概发生成绩。5.3.2二进制数据一般有两种办法将二进制数据保留到XML文档中的:未析实体和Base64编码处置(一种MIME编码办法,能够将二进制数据映照成US-ASCII的子集)。关于干系型数据库,这两种办法都大概存在成绩,由于从数据库中保留和检索二进制数据的划定规矩十分的严厉,如许对会招致两头件呈现成绩。别的,并没有一种尺度的标记用来讲明一个XML文档中的元素包括有Base64编码数据,从而使得两头件大概基本就不克不及够辨认这类编码。最初,在存储数据到数据库时,大概会疏忽与未析实体或Base64编码元素相干的标记。以是,假如对你而言二进制数据十分主要的话,请务需要确认你的两头件是不是撑持二进制数据。5.3.3空值在数据库天下中,空值(null)数据意味着数据不存在值。可是这与一个值为0的数字或长度为0的字符串有很年夜的区分。比方,假定你的数据来自一个景象站,假如景象站的温度计出了偏差读不出温度值,那末你的数据库中将存储一个null值而不是一个0。明显,值为0完整是别的一回事了XML中空值观点的撑持能够经由过程设置可选的元素范例或属性来完成。假如元素范例或属性值为null,XML只需在文档不包括该元素大概属性就能够了。可是对数据库而言,空的元素或包括0长度字符串的属性并非空值null:它们的值为长度为0的字符串。当在XML文档和数据库布局之间互相映照过程当中,你必需出格注重那些可选的元素范例或属性是不是对应于数据库中的空值项。假如不这么做的话,极可能呈现拔出毛病(当将数据转换到数据库中时)大概有效文档毛病(当将数据从数据库读出时)。由于一样要用标记空值,XML中绝对与数据库而言更加天真。详细来说,很多XML用户极可能包括空字符串的空元素或属性是空值。这个时分你必需思索怎样选择符合的两头件来办理这个成绩。一些两头件可让用户选择在XML文档中界说用甚么来构成空值。5.3.4字符集依据界说,除一些把持字符,XML文档可以包括任何的Unicode字符。可是不幸的是,很多数据库都限定或则不撑持Unicode,并且必要一些特别的设置才干够处置非ASCII编码的字符数据。假如你的数据包括了非ASCII字符,那末务需要核实你的数据库和两头件是不是可以处置这些字符。5.3.5处置指令处置指令其实不属于XML文档中的“数据”部分,因而今朝很多两头件大概不克不及一般的处置。成绩是,特别是在将XML文档布局严厉映照成数据库布局时,处置指令一般是很难处置的,由于它们能够假造地呈现在文档的任何地位。因而,两头件就很难判别将它们保留到甚么地位和在甚么时分检索读掏出来。假如处置指令和文档的轮回复兴("round-tripping")对你而言长短常主要的话,就务必反省你的两头件是如办理这个成绩的。5.3.6存储标志在href="#markup">4href="#markup">.2.2大节中提到,偶然候将包括元素大概夹杂内容的元素不作进一步的剖析而间接保留到数据库中长短常有效的。最多见的办法是复杂的把这个标志自己间接保留到数据库中。不幸的是,当从数据库中检索数据时将发生成绩:不成能判别数据库中的标志究竟是真的标志仍是代表了标志字符的实体,如由lt和gt本义的字符。比方,上面的description元素:<description><b>Confusingexample:</b><foo/></description>在数据库中存储为:<b>Confusingexample:</b><foo/>这时候数据库就不克不及判别<b>和<foo>是标志仍是文本。有几种大概的办理办法,如以必定的体例来标记标志大概对非标志的标志字符利用实体。可是这时候你要分外注重如许的体例是不是和利用这些的数据的别的使用兼容。比方,假如你想查询数据库中的小于号("<")和lt实体("<")时就要出格把稳。5.4从数据库的布局天生DTD及其互逆历程在XML文档和数据库之间转换数据时,一个广泛成绩是:怎样从数据库的布局(Schema)天生XML的DTD,假如从XML的DTD发生数据库的布局。简而言之,这长短常间接的操纵,可是发生的了局一般离很多用户的希冀值另有一些间隔。(还要注重这一般是一次性操纵,而年夜多半使用,特别是一切的垂直性使用都分离了已知的DTD和干系型Schema的汇合。不言而喻的惯例是在干系数据库中存储随机XML文档大概将干系型数据公布为XML文档的工具;而在前面的情形中,DTD的感化其实不分明。)关于元素范例中每一个有单一数值的属性和只包括有PCDATA内容的子元素范例在该table中新创建一列(字段)。假如子元素范例或则属性是可选的,让该字段同意为空。关于每一个有多值的属性或则多仅含有PCDATA内容的子元素范例,再创建一个分隔的table来保留他们的值,经由过程它们的父表的主关头字毗连到父表。关于每一个子元素,这些子元素自己另有元素或则夹杂内容,利用父表中的关头字将父元素表毗连到子元素表中。而上面则是一个从干系数据库的布局天生XML文档的历程(简化过的):对每一个table,新建一个元素。对表中的每列,创建一个属性或则只含PCDATA的子元素对每一个包括有在主键/外键关头字干系中主键值的列,新建一个子元素。比方,上面的历程(经简化)申明了怎样从一个DTD天生一个干系型布局:关于每种包括元素大概夹杂内容的元素范例,新建一个表格和一个主键字段。关于每一个包括夹杂内容的元素范例,创立一个独自的表格,个中寄存未析数据,经由过程父元素主键链接到父表格。关于此元素范例的每一个单值属性和只包括未析数据内容、只呈现一次的子元素,在该表格中创立一个字段。假如元素范例大概属性是可选的,可让设置该字段为空值。关于每一个多值属性和屡次呈现的子元素,创立一个独自的表格来存储数值,而且经由过程父元素主键链接到父表格。对每一个有元素大概夹杂内容的子元素,经由过程父元素主键将父元素表格和子元素表格相毗连。上面的历程(经简化)申明了怎样从一个干系型的布局天生一个DTD:关于每一个表格,新建一个元素;关于表格中的每一个字段,新建一个属性大概是只包括未析数据的子元素;关于每一个表格字段中供应主键的主键/外键的干系都新建一个子元素。不幸的是,这些历程还存在着一些缺点。比方,DTD中没无方法事后正确地划定数据范例大概字段长度。由于任何的事后界说(比方经由过程读取一个示例文档)在读取别的“范例”的文档大概其他文档中包括有凌驾字长内容的文档时就会发生毛病。(久长之策是利用XMLschema文档的数据范例。)复杂来讲,当从一干系型布局天生DTD时,是没有举措事后判别子元素“应当”呈现的按次大概字段(如数据库外部的行标识)是不是该举行完整转换。在以上两种情形中都大概发生定名的抵触。只管有如许那样的缺点,可是这些办法仍旧可以很好地奠基在干系型布局和DTD之间相互转换的出发点。“MySQL实际上是一个数据库家族,你可以从选择一个并将其配置成可以满足你的大多数情况,”开源顾问公司Ethiqa的总裁如此表示,“因此,你可以在开始的时候选择一个小巧的版本产品,以后再根据需要来对其进行性能或大小上的扩展。” varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。 可以动态传入参数,省却了动态SQL的拼写。 对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。 作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题! 另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程); 光写几个SQL实在叫无知。 如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录. 入门没那么困难,精通没那么容易
页:
[1]