李成亮
(扬中市人民医院信息科,江苏 镇江 212200)
InterSystems 公司研发的高性能Caché 数据库不仅速度快、接口全面、升级扩容方便,而且还是功能齐全的关系型数据库。Caché 数据库可以将存储的多维数据映射为二维表,提供的接口支持许多基于SQL的访问工具,让开发者使用标准的SQL 语句进行增加、删除、修改、查询。
Caché 数据库是面向对象的“后关系型”数据库,可以直接用面向对象的方法进行建表,也可以利用关系型数据库的方法进行建表。本文详述了Caché数据库建表的五种方法,并从存储结构、表结构、应用场景方面详细分析,为Caché数据库的开发提供了参考。
Caché 数据库的类可以映射为对应的表,其映射关系如表1所示。
表1 对象数据库与关系数据库之间的映射关系
Caché数据库建表的方法分为两大类:一类是利用面向对象的方法,另外一类是基于数据库语言的方法。
Caché 数据库的持久类(%Persistent)用来存储数据,我们自己定义的类一定继承于持久类,定义类的方法为:
当编译持久类的时候,Caché 数据库会自动将类映射为表。
Caché数据库提供了多种接口让开发者调用,基于数据库语言的建表方法主要是采用SQL 语言,具体可以分为四种方法,如表2所示。
表2 基于数据库语言的建表方法
在Caché 数据库中通过SQL 语言建表,是一个高级别的操作,必须有管理员的权限。Caché 数据库会自动创建相应的持久类,同时映射为相应的表。
本文举例的表名为:Test.Student,字段名分别为:字符型Name、字符型Sex、日期型DateOfBirth。
在相应地命名空间下,可以根据向导一步一步地创建类,也可以直接在Studio中写代码完成。
在类方法中嵌入使用DDL 语句,在建表前先用管理员的权限登录。
在terminal 中执行此类方法,当建表成功,SQLCODE返回值为0,否则建表失败。
首先用管理员的权限登录,其次准备好建表的SQL字符串,最后执行语句。
在terminal 中执行此类方法,当建表成功,rset返回值为0,否则建表失败。
Caché 数据库提供了抽象类%SYSTEM.SQL,该类提供了一套管理SQL 的接口,其中包含107 个类方法。本文主要用DDLImport 类方法来导入SQL脚本,其语法为$SYSTEM.SQL.DDLImport(DDLMode,SQLUser,infile,outfile,nosup,nosupfile,deos,errpause)。
各参数含义如下。
DDLMode:数据库类型,必填。
SQLUser:Caché SQL用户名,必填。
infile:带路径的文件名,必填。
outfile:程序执行过程中的错误日志,非必填。
nosup:当Caché 数据库不支持脚本文件中的语句时,决定是否记录到文件中,非必填。
nosupfile:当nosup 为true 时,用于记录不支持的执行语句,非必填。
deos:语句结束的分隔符,非必填。
errpause:当错误发生时程序暂停执行的时间,默认为5秒,非必填。
本文用SQL Server语句创建SQL脚本,其语句为:
创建完脚本后将其保存在D 盘,文件名为SQLServer.sql。
导入脚本过程为:①在terminal 中切换到相应的命名空间;②执行命令Do $SYSTEM.SQL.DDLImport("MSSQLServer","_system","D:SQLServer.sql");③在相应的命名空间下可以看到Test.Student类。
SQL GateWay 将第三方关系数据库中的表结构导入到Caché 数据库持久类中,并且将第三方数据库表中的数据映射到Caché数据库中。
SQL GateWay 由四部分组成,分别为连接管理、SQL GateWay 接口、外部表查询器、SQL 存储类。通过SQL GateWay建表的方法就是利用这四部分。
第一:建立数据源,通过ODBC 数据源管理器建立好数据源,如图1所示。
图1 建立ODBC数据源
第 二:在System Management Portal 中,通 过SQL GateWay 建立外部数据库连接。具体方法为:在[Home]>[Configuration]>[SQL Gateway Connections]中找到Create New Connection,根据向导填入相应的连接名、数据源、用户名、密码,然后保存,如图2所示。
图2 建立外部数据库连接
第三:使用外部数据库连接建表。具体方法为:在[Home]>[SQL]>[Link Table Wizard]中根据向导选择相应的表、字段及主键。
Caché 数据库提供了两种存储类,即%Library.CacheStorage、% Library.CacheSQLStorage,其 中,%Library.CacheStorage是系统默认的存储类,采用列表编码的形式存储多维数据;%Library.CacheSQLStorage比%Library.CacheStorage 有局限性,采用字符分隔符的形式存储多维数据。
方法一~方法四均采用系统默认的存储方式,数据存储在^Test.StudentD()、索引存储在^Test.StudentI(),Global 节点形如:^Test.StudentD=ID,^Test.StudentD(ID)=$listbuild("",value1,value2,……),其 中^Test.StudentD为计数节点,ID为主索引,是自增型计数变量,^Test.StudentD(i)为数据节点,$listbuild()中第一位用于存储子类的类名,若无则为空,其余为节点值。
方法五采用%Library.CacheSQLStorage,将对象映射为原来的数据结构,比如对象中的属性直接映射为表中的字段。Caché 数据库通过SQL GateWay 随第三方数据库的变化而变化,第三方数据库也会随Caché数据库中的变化而变化,但是默认情况下Caché数据库并不存储第三方数据库的数据。
%Library.CacheStorage 存储结构中主索引ID 为单一的变量,缺乏一定的灵活性,适用于单表。而%Library.CacheSQLStorage 可通过SqlIdExpression 关键字扩展主索引ID,结合SQL storage map,一方面让ID 形成树形结构的存储,提高检索速度;另一方面可以与其他表的ID 形成关联,比如父子表,提高表之间的检索效率。
Caché 数据库默认以ID 为主索引,也可以重命名主索引,各种方法映射表的区别如表3所示。
表3 各种方法映射表的区别
每种方法映射的表字段虽然略有差异,但可以根据实际情况通过关键字SqlRowIdPrivate 对ID 显示或隐 藏,当SqlRowIdPrivate 为True 时,表结构中ID 隐藏;当SqlRowIdPrivate 为False 时,表结构中ID 显示。SqlRowIdPrivate不会影响Global的存储结构。
方法一是Caché 数据库常规的建表方法,既可以用面向对象的方法进行增加、删除、修改、查询,也可以用SQL语句,应用场景十分广泛。
方法二直接把Caché 数据库当作关系数据库使用,嵌入SQL语句简洁、直观。
方法三在程序运行的过程中动态建表,适合于充当临时表以缩减原始数据量,也常配合Web Service接口使用。
方法四导入第三方数据库的SQL 脚本建表,适合于做第三方数据的迁移。
方法五中SQL GateWay 充当“桥梁”作用,可以直接在Caché数据库处理第三方数据库的数据,方便、快捷。
本文详细介绍了Caché 数据库的五种建表方法,并对每种方法从存储结构、表结构、应用场景三个角度进行了分析,可以得出以下结论:
⑴Caché数据库兼容关系数据库,方法二~方法五最终都会生成方法一中面向对象的建表代码;
⑵在复杂的情形下,结合具体的应用场景,可以对每种方法灵活修改,并且可以混合运用。