李成亮
(揚中市人民醫(yī)院信息科,江蘇 鎮(zhèn)江 212200)
InterSystems 公司研發(fā)的高性能Caché 數(shù)據(jù)庫不僅速度快、接口全面、升級擴容方便,而且還是功能齊全的關系型數(shù)據(jù)庫。Caché 數(shù)據(jù)庫可以將存儲的多維數(shù)據(jù)映射為二維表,提供的接口支持許多基于SQL的訪問工具,讓開發(fā)者使用標準的SQL 語句進行增加、刪除、修改、查詢。
Caché 數(shù)據(jù)庫是面向對象的“后關系型”數(shù)據(jù)庫,可以直接用面向對象的方法進行建表,也可以利用關系型數(shù)據(jù)庫的方法進行建表。本文詳述了Caché數(shù)據(jù)庫建表的五種方法,并從存儲結構、表結構、應用場景方面詳細分析,為Caché數(shù)據(jù)庫的開發(fā)提供了參考。
Caché 數(shù)據(jù)庫的類可以映射為對應的表,其映射關系如表1所示。
表1 對象數(shù)據(jù)庫與關系數(shù)據(jù)庫之間的映射關系
Caché數(shù)據(jù)庫建表的方法分為兩大類:一類是利用面向對象的方法,另外一類是基于數(shù)據(jù)庫語言的方法。
Caché 數(shù)據(jù)庫的持久類(%Persistent)用來存儲數(shù)據(jù),我們自己定義的類一定繼承于持久類,定義類的方法為:
當編譯持久類的時候,Caché 數(shù)據(jù)庫會自動將類映射為表。
Caché數(shù)據(jù)庫提供了多種接口讓開發(fā)者調用,基于數(shù)據(jù)庫語言的建表方法主要是采用SQL 語言,具體可以分為四種方法,如表2所示。
表2 基于數(shù)據(jù)庫語言的建表方法
在Caché 數(shù)據(jù)庫中通過SQL 語言建表,是一個高級別的操作,必須有管理員的權限。Caché 數(shù)據(jù)庫會自動創(chuàng)建相應的持久類,同時映射為相應的表。
本文舉例的表名為:Test.Student,字段名分別為:字符型Name、字符型Sex、日期型DateOfBirth。
在相應地命名空間下,可以根據(jù)向導一步一步地創(chuàng)建類,也可以直接在Studio中寫代碼完成。
在類方法中嵌入使用DDL 語句,在建表前先用管理員的權限登錄。
在terminal 中執(zhí)行此類方法,當建表成功,SQLCODE返回值為0,否則建表失敗。
首先用管理員的權限登錄,其次準備好建表的SQL字符串,最后執(zhí)行語句。
在terminal 中執(zhí)行此類方法,當建表成功,rset返回值為0,否則建表失敗。
Caché 數(shù)據(jù)庫提供了抽象類%SYSTEM.SQL,該類提供了一套管理SQL 的接口,其中包含107 個類方法。本文主要用DDLImport 類方法來導入SQL腳本,其語法為$SYSTEM.SQL.DDLImport(DDLMode,SQLUser,infile,outfile,nosup,nosupfile,deos,errpause)。
各參數(shù)含義如下。
DDLMode:數(shù)據(jù)庫類型,必填。
SQLUser:Caché SQL用戶名,必填。
infile:帶路徑的文件名,必填。
outfile:程序執(zhí)行過程中的錯誤日志,非必填。
nosup:當Caché 數(shù)據(jù)庫不支持腳本文件中的語句時,決定是否記錄到文件中,非必填。
nosupfile:當nosup 為true 時,用于記錄不支持的執(zhí)行語句,非必填。
deos:語句結束的分隔符,非必填。
errpause:當錯誤發(fā)生時程序暫停執(zhí)行的時間,默認為5秒,非必填。
本文用SQL Server語句創(chuàng)建SQL腳本,其語句為:
創(chuàng)建完腳本后將其保存在D 盤,文件名為SQLServer.sql。
導入腳本過程為:①在terminal 中切換到相應的命名空間;②執(zhí)行命令Do $SYSTEM.SQL.DDLImport("MSSQLServer","_system","D:SQLServer.sql");③在相應的命名空間下可以看到Test.Student類。
SQL GateWay 將第三方關系數(shù)據(jù)庫中的表結構導入到Caché 數(shù)據(jù)庫持久類中,并且將第三方數(shù)據(jù)庫表中的數(shù)據(jù)映射到Caché數(shù)據(jù)庫中。
SQL GateWay 由四部分組成,分別為連接管理、SQL GateWay 接口、外部表查詢器、SQL 存儲類。通過SQL GateWay建表的方法就是利用這四部分。
第一:建立數(shù)據(jù)源,通過ODBC 數(shù)據(jù)源管理器建立好數(shù)據(jù)源,如圖1所示。
圖1 建立ODBC數(shù)據(jù)源
第 二:在System Management Portal 中,通 過SQL GateWay 建立外部數(shù)據(jù)庫連接。具體方法為:在[Home]>[Configuration]>[SQL Gateway Connections]中找到Create New Connection,根據(jù)向導填入相應的連接名、數(shù)據(jù)源、用戶名、密碼,然后保存,如圖2所示。
圖2 建立外部數(shù)據(jù)庫連接
第三:使用外部數(shù)據(jù)庫連接建表。具體方法為:在[Home]>[SQL]>[Link Table Wizard]中根據(jù)向導選擇相應的表、字段及主鍵。
Caché 數(shù)據(jù)庫提供了兩種存儲類,即%Library.CacheStorage、% Library.CacheSQLStorage,其 中,%Library.CacheStorage是系統(tǒng)默認的存儲類,采用列表編碼的形式存儲多維數(shù)據(jù);%Library.CacheSQLStorage比%Library.CacheStorage 有局限性,采用字符分隔符的形式存儲多維數(shù)據(jù)。
方法一~方法四均采用系統(tǒng)默認的存儲方式,數(shù)據(jù)存儲在^Test.StudentD()、索引存儲在^Test.StudentI(),Global 節(jié)點形如:^Test.StudentD=ID,^Test.StudentD(ID)=$listbuild("",value1,value2,……),其 中^Test.StudentD為計數(shù)節(jié)點,ID為主索引,是自增型計數(shù)變量,^Test.StudentD(i)為數(shù)據(jù)節(jié)點,$listbuild()中第一位用于存儲子類的類名,若無則為空,其余為節(jié)點值。
方法五采用%Library.CacheSQLStorage,將對象映射為原來的數(shù)據(jù)結構,比如對象中的屬性直接映射為表中的字段。Caché 數(shù)據(jù)庫通過SQL GateWay 隨第三方數(shù)據(jù)庫的變化而變化,第三方數(shù)據(jù)庫也會隨Caché數(shù)據(jù)庫中的變化而變化,但是默認情況下Caché數(shù)據(jù)庫并不存儲第三方數(shù)據(jù)庫的數(shù)據(jù)。
%Library.CacheStorage 存儲結構中主索引ID 為單一的變量,缺乏一定的靈活性,適用于單表。而%Library.CacheSQLStorage 可通過SqlIdExpression 關鍵字擴展主索引ID,結合SQL storage map,一方面讓ID 形成樹形結構的存儲,提高檢索速度;另一方面可以與其他表的ID 形成關聯(lián),比如父子表,提高表之間的檢索效率。
Caché 數(shù)據(jù)庫默認以ID 為主索引,也可以重命名主索引,各種方法映射表的區(qū)別如表3所示。
表3 各種方法映射表的區(qū)別
每種方法映射的表字段雖然略有差異,但可以根據(jù)實際情況通過關鍵字SqlRowIdPrivate 對ID 顯示或隱 藏,當SqlRowIdPrivate 為True 時,表結構中ID 隱藏;當SqlRowIdPrivate 為False 時,表結構中ID 顯示。SqlRowIdPrivate不會影響Global的存儲結構。
方法一是Caché 數(shù)據(jù)庫常規(guī)的建表方法,既可以用面向對象的方法進行增加、刪除、修改、查詢,也可以用SQL語句,應用場景十分廣泛。
方法二直接把Caché 數(shù)據(jù)庫當作關系數(shù)據(jù)庫使用,嵌入SQL語句簡潔、直觀。
方法三在程序運行的過程中動態(tài)建表,適合于充當臨時表以縮減原始數(shù)據(jù)量,也常配合Web Service接口使用。
方法四導入第三方數(shù)據(jù)庫的SQL 腳本建表,適合于做第三方數(shù)據(jù)的遷移。
方法五中SQL GateWay 充當“橋梁”作用,可以直接在Caché數(shù)據(jù)庫處理第三方數(shù)據(jù)庫的數(shù)據(jù),方便、快捷。
本文詳細介紹了Caché 數(shù)據(jù)庫的五種建表方法,并對每種方法從存儲結構、表結構、應用場景三個角度進行了分析,可以得出以下結論:
⑴Caché數(shù)據(jù)庫兼容關系數(shù)據(jù)庫,方法二~方法五最終都會生成方法一中面向對象的建表代碼;
⑵在復雜的情形下,結合具體的應用場景,可以對每種方法靈活修改,并且可以混合運用。