俞海
摘要:該文重點(diǎn)介紹面向?qū)ο驝ache數(shù)據(jù)庫的面向?qū)ο蠡靖拍?,并利用Cach6數(shù)據(jù)庫的面向?qū)ο蟮莫?dú)特結(jié)構(gòu)定義類(class)和方法(methods),并介紹了其具體的定義方法,并解釋Cache數(shù)據(jù)庫高性能的結(jié)構(gòu)特性,進(jìn)行簡單應(yīng)用設(shè)計(jì)的分析,對(duì)面向?qū)ο箝_發(fā)的有較好的引導(dǎo)作用。
關(guān)鍵詞:Cache;面向?qū)ο?;class;methods;table;property
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)17-0001-03
Cach6數(shù)據(jù)庫是一款面向?qū)ο髷?shù)據(jù)庫,通過使用用戶定義的數(shù)據(jù)模型,并利用面向?qū)ο蟮腃ache數(shù)據(jù)庫進(jìn)行應(yīng)用的開發(fā),Cache是美國Intersystems公司產(chǎn)品,被稱為后關(guān)系型數(shù)據(jù)庫(Post Relational database)中的領(lǐng)導(dǎo)者。Cache數(shù)據(jù)庫作為面向?qū)ο蟮腃ache,使用比較主流的領(lǐng)域主要是美國和歐洲的HIS系統(tǒng)(醫(yī)療衛(wèi)生管理信息系統(tǒng)),Cache數(shù)據(jù)庫所占的比例是最大,被醫(yī)療界公認(rèn)為首選數(shù)據(jù)庫。
官方數(shù)據(jù)顯示,CACHE數(shù)據(jù)庫的數(shù)據(jù)查詢速度約為oracle的7~20倍,支持關(guān)系型數(shù)據(jù)和面向?qū)ο笮偷臄?shù)據(jù)庫。
Cache數(shù)據(jù)庫的主要特點(diǎn)如下:
1)速度快。Cache數(shù)據(jù)庫在同等條件下查詢相同數(shù)據(jù)比Oracle等普通數(shù)據(jù)庫要快。
2)使用簡單。Cache數(shù)據(jù)庫支持標(biāo)準(zhǔn)SQL語句。
3)接口容易。Cache數(shù)據(jù)庫支持ODBC標(biāo)準(zhǔn)接口。
4)支持3層結(jié)構(gòu)。Cache數(shù)據(jù)庫能夠真正意義上實(shí)現(xiàn)3層結(jié)構(gòu),實(shí)現(xiàn)真正的分布式服務(wù)。
升級(jí)擴(kuò)容方便。正因?yàn)橛缮鲜龇植际?層結(jié)構(gòu),所以當(dāng)醫(yī)院需要增加客戶端PC或醫(yī)院進(jìn)行擴(kuò)大規(guī)模時(shí),其靈活的伸縮性可幫助用戶節(jié)約資金減少重復(fù)投資。
5)對(duì)象型編輯。Cache數(shù)據(jù)庫是真正的面向?qū)ο笮蛿?shù)據(jù)庫,開發(fā)時(shí)用戶可直接用數(shù)據(jù)庫定義特定的對(duì)象,然后再在其它開發(fā)工具中調(diào)用該對(duì)象的方法(method)和屬性(attributes)即可完成開發(fā)工作,非常方便。
Cache數(shù)據(jù)庫支持遠(yuǎn)程映射(mapping)和鏡像(mirror)。
6)能快速進(jìn)行WEB開發(fā)。Cache數(shù)據(jù)庫提供自帶的Web開發(fā)工具,使用維護(hù)非常方便。
7)價(jià)格便宜。Cache數(shù)據(jù)庫的價(jià)格比Oracle要便宜許多。那么Cache數(shù)據(jù)庫應(yīng)用開發(fā)醫(yī)院信息管理系統(tǒng)或其他行業(yè)的面向?qū)ο蟮臄?shù)據(jù)庫應(yīng)用是有現(xiàn)實(shí)意義的。
1 Cache數(shù)據(jù)庫類(class)定義操作方法
1.1通過Cache的GUI方式創(chuàng)建數(shù)據(jù)操作
Cach6是一款面向?qū)ο蟮年P(guān)系型數(shù)據(jù)庫,可通過其自帶的GUI(Graphic User Interface)建類(Class Definition),在Cache中把類(Class)和表(table)聯(lián)系在一起,建立類就是建表(Create Ta-ble)。
Cach6 GUI界面如下:
點(diǎn)擊Cach6 class Definition(類定義模塊)可輸人用戶包和類名,類名為Person;
可選擇持久類(Choose Persistent Class),也可以選擇其他類(Class Type)類型。也可輸人用戶的表名,如圖2所示輸入對(duì)應(yīng)SQL中的表名t_person:
在Cache數(shù)據(jù)庫中,建立了類就相當(dāng)于建立了表對(duì)象,而表對(duì)象中就需要定義表的屬性(Attributes),一個(gè)屬性(Attribute)就是表的一列(Column),下面是屬性名(Name of Property)就對(duì)應(yīng)于表中的列(column)。屬性(Property)的類型即列或字段的類型:
此處name字段定義為串類型(%String),在oracle或其他關(guān)系數(shù)據(jù)庫(RDBMS)中可使用Char(n),或varchar(n)來定義固定長度n個(gè)字符或可變長度為n的字符串。
同時(shí)在創(chuàng)建類(class)時(shí),可選擇表的列名或字段的值要求,如姓名能否為空,Name是否唯一(unique),是否要建索引(indexed)或計(jì)算時(shí)該列是否存儲(chǔ)在內(nèi)存中。
這樣可通過定義類的方法和步驟,使用Cach6面向?qū)ο髷?shù)據(jù)庫自帶的Studio可視化來創(chuàng)建,也可寫下如下的代碼來實(shí)現(xiàn)。
1.2用代碼定義
以上的類寫好后,通過編譯(compile)創(chuàng)建好以上的類(class)對(duì)象,就要進(jìn)行編譯,選擇Studio中的compile,如圖3所示:
如果類(class)定義有錯(cuò)(errors),則需修改其中的錯(cuò)誤,再次編譯,如果成功了,則由該類自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫對(duì)應(yīng)的表,并且可以通過SQL來插入(insert),修改(update)或刪除(delete)該對(duì)象中的數(shù)據(jù)(data).另外還創(chuàng)建一個(gè)例程routine,這個(gè)就是利用cache創(chuàng)建CACHE applications的高效的原因所在,比其他傳統(tǒng)數(shù)據(jù)庫快的重要原因。
這樣就可在Cach6System Management Portal(相當(dāng)于數(shù)據(jù)庫查詢分析器)中選擇sql→Execute SQL Query,在左側(cè)選擇自己的命名空間,并輸入查詢的sql語句可以看到自己建的表的結(jié)構(gòu)和數(shù)據(jù)了。
以上是使用面向?qū)ο髷?shù)據(jù)庫CACHE來創(chuàng)建類和相應(yīng)的數(shù)據(jù)庫的表(即創(chuàng)建了持久(persistent)類,系統(tǒng)也就隱含了創(chuàng)建了數(shù)據(jù)庫的對(duì)象表table)同時(shí)也可在類(class)中加入方法(method),如下程序代碼就包含了通過Person類來擴(kuò)展定義一個(gè)新類,即Employee類(即表Employee),并創(chuàng)建顯示某個(gè)員工的姓名和職位情況。
Class Ueser.Employee Extends t Person
以上在類中定義了方法(method),這個(gè)方法是可重寫Per-son類中的相同方法。
這是面向?qū)ο蟮奶匦?,其含義是如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overrid-ing)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)其而言,父類中的定義如同被“屏蔽”了。
這樣在定義類(class)時(shí)也把常用的數(shù)據(jù)庫操作用方法來調(diào)用該方法的請(qǐng)求來使用,本例中就是將員工信息打印出來。
這樣就極大地?cái)U(kuò)展了數(shù)據(jù)庫操作的靈活性和編程性,對(duì)數(shù)據(jù)庫應(yīng)用的開發(fā)提供了新的存取路徑和方法。同時(shí),也可進(jìn)行用戶自定義的數(shù)據(jù)類型,能使用面向?qū)ο蟮姆椒ǎ╩ethods)和繼承性(inheritance)和多態(tài)性(polymorphism),通過面向關(guān)系的SQL或面向?qū)ο筮^程的方法method的結(jié)合來取得各自的性能和平衡。
Cache用戶既可使用系統(tǒng)類(system classes),也可采用自定義用戶的類對(duì)象(user classes)。
所以在類的定義中,可以包含屬性(相當(dāng)于表的字段或列),也可定義方法,以及參數(shù),也可在類中使用如觸發(fā)器,查詢或索引等定義。
2 Cace數(shù)據(jù)庫的物理特性
Cache是一款高性能的面向?qū)ο蟮臄?shù)據(jù)庫,其主要原因就是使用類對(duì)象代替了關(guān)系數(shù)據(jù)庫中的表對(duì)象.同時(shí)存儲(chǔ)的數(shù)據(jù)完全以globals全局變量結(jié)構(gòu)進(jìn)行存儲(chǔ)和處理,這是其速度快速的內(nèi)因。面向?qū)ο蟮哪J揭约懊嫦虼a的直接全局(Globals)變量結(jié)構(gòu),使應(yīng)用程序和系統(tǒng)在使用Cache引擎中,數(shù)據(jù)庫數(shù)據(jù)的存取通過全局變量結(jié)構(gòu)這一物理內(nèi)存結(jié)構(gòu)來實(shí)現(xiàn)的,甚至程序的代碼也存儲(chǔ)在該內(nèi)存結(jié)構(gòu)中,可通過命令的方式或內(nèi)嵌的函數(shù)或方法實(shí)現(xiàn)調(diào)用。當(dāng)創(chuàng)建好一個(gè)持久(persistent)的數(shù)據(jù)庫類(class)對(duì)象時(shí)(即傳統(tǒng)數(shù)據(jù)庫的表table),數(shù)據(jù)的增刪改操作可用Cache SQL來操作,更可以通過類定義時(shí)繼承的%New(),%Save(),%Open(),and%Delete()的方法(methods)來實(shí)現(xiàn)增刪改操作(Data manipulation),這就是該數(shù)據(jù)庫是面向?qū)ο蟮臄?shù)據(jù)庫,和傳統(tǒng)的數(shù)據(jù)庫相比,其查詢速度很快的原因之一。
3使用Globals結(jié)構(gòu)變量
Globals結(jié)構(gòu)變量是一個(gè)高度調(diào)優(yōu)的一塊物理內(nèi)存結(jié)構(gòu),而Cach6中的代碼運(yùn)行時(shí)則獨(dú)立使用該結(jié)構(gòu)變量,這些優(yōu)化的結(jié)構(gòu)確保了其高的并發(fā)性和高的吞吐率,使內(nèi)存的使用更高效,并且持續(xù)運(yùn)行時(shí)數(shù)據(jù)庫的器性能不需進(jìn)行索引的重建或系統(tǒng)的重建(rebuilding)或合并文件、清除刪除、過期、多余版本的數(shù)據(jù),提高讀寫數(shù)據(jù)的效率,而且其物理結(jié)構(gòu)是完全封裝好的,開發(fā)使用時(shí)不需考慮其物理的數(shù)據(jù)結(jié)構(gòu)。并且其存儲(chǔ)空間是稀疏的,意即只有結(jié)點(diǎn)有數(shù)據(jù)值才存儲(chǔ)在數(shù)據(jù)庫中,因此Cache常常所需的內(nèi)存空間比傳統(tǒng)的關(guān)系數(shù)據(jù)庫要少一半的空間。稀疏的本質(zhì)是新字段可以添加而無需重構(gòu)原數(shù)據(jù)庫所需的開銷(overhead),而H.Cache的全局變量結(jié)構(gòu)比傳統(tǒng)數(shù)據(jù)庫中的表存儲(chǔ)的表信息更接近現(xiàn)實(shí)的數(shù)據(jù)模型,這樣把相關(guān)的信息存儲(chǔ)在該物理內(nèi)存中比通過I/O存取的數(shù)據(jù)效率要高很多。
同時(shí)Cach6面向?qū)ο髷?shù)據(jù)庫支持SQL,即Cach6動(dòng)態(tài)SQL,可采用如下二種方式進(jìn)行存取數(shù)據(jù)庫:%SQL.Statement和%SQL.StatementResuh類來存取,下面就是從員工表(employee)中取出年齡最小的5名員工的姓名和所在城市:
先定義查詢SQL語句變量myquery:
SET myquery=”select top 5 name,city from HR.employee or-der by age”
再通過%SQL.Statement類屬性%New()來創(chuàng)建一個(gè)動(dòng)態(tài)SQL語句并采用
%Prepare(myquery)加載并最后執(zhí)行%Execute().以上的動(dòng)態(tài)查詢執(zhí)行可寫成如下語句:
SET myquery=”select top 5 name,ciIy from HR.employee or-der bv age”
SET tStatement=##class(%SQL.Statement).%New()
SET tStatus=tStatement.%Prepare(myquery)
SET resuh_emp=tStatement.%Execute()∥執(zhí)行SQL
DO resuh_emp.%Display()∥顯示name,city信息
也可以采用嵌入SQL(Embedded SQL),例如:
&sql(select count(*)into:coutvar from HR.employee)
所以,利用Cach6數(shù)據(jù)庫進(jìn)行編程或SQL使用非常簡潔、靈活、高效。
4創(chuàng)建高效的Web應(yīng)用開發(fā)程序(building Web appli-cations)
Cache數(shù)據(jù)庫的面向?qū)ο蟮奶攸c(diǎn)不僅表現(xiàn)在數(shù)據(jù)庫的表對(duì)象類(class)來實(shí)現(xiàn),在開發(fā)web applications的應(yīng)用中,也比較深刻體現(xiàn)出WEB設(shè)計(jì)應(yīng)用中的面向?qū)ο蟮奶匦浴?/p>
Cache web application在創(chuàng)建的web頁面采用CSP(Cacheservlet page)嵌入式語言,類似于JSP(java servlet page),在創(chuàng)建CSP文件后,要進(jìn)行編譯(compile),其過程就是通過CSP Engine要把CSP對(duì)應(yīng)的頁面文件轉(zhuǎn)化為類(class)的定義。另外使用類編譯時(shí)采用了類定義的方式并且生成中間代碼(INT)CODE,CacheMVBasic code代碼,以及Cache Basic code,這就要看你在定義類的方法時(shí)使用的哪種語言了。中間代碼存取數(shù)據(jù)通過Globals結(jié)構(gòu)高效處理。
通過使用CacheObjectScript腳本語言,Cache SQL語言或者CacheMVBasic,macros,class definitions,routines等等,Cache不直接使用你寫的以上代碼,而是當(dāng)你完成編譯后(compile)而生成產(chǎn)生的OBJ代碼,通過Cache的虛擬機(jī)運(yùn)行。
5 Cache數(shù)據(jù)庫在行業(yè)使用
Cache數(shù)據(jù)庫具有高性能、龐大的可擴(kuò)展性以及扎實(shí)的可靠性等優(yōu)勢(shì),是一種可提供多種數(shù)據(jù)存取模式的新一代數(shù)據(jù)庫技術(shù),比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫有更高的使用效率。使用比較多的行業(yè)是醫(yī)院信息管理系統(tǒng)(HIS),InterSystems公司的Cache數(shù)據(jù)庫在北美和歐洲有龐大的高等級(jí)醫(yī)院已被開發(fā)部署。隨著時(shí)間的推移,相信Cache數(shù)據(jù)庫必定會(huì)拓展到其他行業(yè)。Cache將強(qiáng)大的對(duì)象數(shù)據(jù)庫與健壯的SQL技術(shù)融為一體,為復(fù)雜應(yīng)用提供了快速開發(fā)環(huán)境以及快速多維引擎。Cache安全可靠,目前已成為全球臨床醫(yī)療應(yīng)用系統(tǒng)的首選數(shù)據(jù)庫。
6結(jié)論
通過傳統(tǒng)關(guān)系數(shù)據(jù)庫的應(yīng)用,人們發(fā)現(xiàn)關(guān)系數(shù)據(jù)系統(tǒng)雖然技術(shù)很成熟,但其局限性也是顯而易見:它能很好地處理所謂的“表格型數(shù)據(jù)”,卻對(duì)越來越多復(fù)雜類型的數(shù)據(jù)無能為力?!懊嫦?qū)ο蟮臄?shù)據(jù)庫”(Obiect—Oriented Database)涉及面向?qū)ο蠹夹g(shù)。面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)的推廣有一定的難度,其主要原因在于,設(shè)計(jì)思路和以前傳統(tǒng)的數(shù)據(jù)庫概念有較大區(qū)別,采用面向?qū)ο蟮母拍睿喝珙悾–lass)、方法(Method)、繼承、封裝等面向?qū)ο蟮男g(shù)語來設(shè)計(jì)數(shù)據(jù)庫對(duì)象表、屬性、函數(shù)等,用新型數(shù)據(jù)庫系統(tǒng)概念來取代現(xiàn)有的數(shù)據(jù)庫系統(tǒng)概念。這對(duì)許多已經(jīng)運(yùn)用傳統(tǒng)關(guān)系數(shù)據(jù)庫系統(tǒng)并積累了大量工作數(shù)據(jù)的客戶,尤其是大客戶來說,無法承受新舊數(shù)據(jù)間的轉(zhuǎn)換而帶來的巨大工作量及巨額開支。另外,面向?qū)ο蟮年P(guān)系型數(shù)據(jù)庫系統(tǒng)使查詢語言變得復(fù)雜,從而使得無論是數(shù)據(jù)庫的開發(fā)商家還是應(yīng)用客戶都視其復(fù)雜的面向?qū)ο蟮膽?yīng)用技術(shù)為畏途。
面向?qū)ο竽P褪敲嫦驅(qū)ο蟾拍钆c數(shù)據(jù)庫技術(shù)相結(jié)合的產(chǎn)物。它的基本目標(biāo)是以更接近人類思維的方式描述客觀世界的事物及其聯(lián)系,且使描述問題的問題空間和解決問題的方法空間在結(jié)構(gòu)上盡可能一致,以便對(duì)客觀實(shí)體進(jìn)行結(jié)構(gòu)模擬和行為模擬。相信未來的數(shù)據(jù)庫發(fā)展一定有一片空間屬于面向?qū)ο蟮臄?shù)據(jù)庫技術(shù),會(huì)有越來越多的客戶選擇諸如Cache面向?qū)ο蟮臄?shù)據(jù)庫。