引言
随着web访问、移动设备、报表和分析包以及其他应用的发展,数据库市场正在快速地创新。然而,数量众多的系统因为不是以关系方式来组织自己的数据,它们仍无法充分参与到这些创新中。由于无法使用关系APIs(如SQL、ODBS、JDBC、PHP、ADO.Net等)有效率地访问数据,很多系统不能有效地应用这些创新。
本文将为一个很特殊的挑战提供一个解决方案:在同一个文件中混合着不同的记录结构,并使用某个字段告知应用程序如何解释每条记录。如果你拥有现代关系数据库相关的技能,你听到这些可能会觉得很奇怪。你学到要遵循某个严格的模式,并通过将数据分离到不同的表来规范化数据。然而并不总是按照这种方式编写业务软件的。在不远的过去,曾经在操作系统级别就限制了文件句柄总数。比如,在DOS操作系统时代,文件句柄数加上stdin、stdout、stderr等最大总数为20个。
虽然对于非关系或NoSQL APIs来说,混合记录结构是适当的,因为这儿不需要模式,但开发者经常会面临要使用某个需要一个模式的技术的场合。对于某些使用SQL(或ODBC等)的软件一个一致的模式定义是必需的,比如大量的第三方报表和分析工具,包括水晶报表和Excel,以及很多web和移动设备应用。
当某个业务需要使用SQL来访问该类型数据时,它们通常借助于运行批处理程序来提取数据这样的技巧将数据转换成某个关系格式,再将它们加载进关系数据库表。这些批处理程序可能不得不彻夜运行,所以这些被导入的数据很少能保持处于最新的状态。另外一个选择就是添加一个SQL API,而这需要将每种记录结构分解到自己单独的物理文件中,这会导致对应用程序的现有代码做有风险的变更。另外一个替代方法是重写整个应用程序。很多时候,这些代码已经没有任何变更地工作了数年甚至数十年,所以代码变更影响越小越好。
为了避免这些问题,并让开发者能够将现有的、非关系数据映射成关系数据,FairCom公司的 c-treeACE数据库引入了对多记录类型(MRT)表的支持。MRT表支持为那些无法融入到单个SQL模式的数据提供了一种处理方法。MRT表是为了和最开始就是以非关系表保存的已有数据一起使用的。虽然很怀疑现在是否还有某个开发者会基于MRT表来创建一个全新的应用,但是任何与前面所说的传统应用打交道的开发者将会发现这是非常有价值的。如将前面提到的批处理程序设想为某种类型的ETL(抽取,转换,加载),则可将MRT表设想为某种类型的“虚”ETL(抽取,转换,创建一组可通过SQL实时访问的虚拟表)。FairCom的技术的魔力在于转换是即时进行的,而不用将数据拷贝到外部表格,所以数据一直是最新的。
本文在一个例子中展示了如何使用MRT表来实时地为非关系c-tree数据提供NoSQL和SQL的并发访问。其目的是为了这些应用程序开发者和应用程序管理员,他们正在为c-treeACE数据、或那些可以容易迁移到c-treeACE的应用程序提供SQL访问而寻找一个简单机制。
c-treeACE
在深入细节之前,我们先简要介绍下FairCom的c-treeACE数据库,c-treeACE是一个高性能的NoSQL和SQL数据库引擎,其在NoSQL API层次上提供了很多传统数据库的概念,比如通过事务处理所提供的全部ACID属性、前滚、回滚、记录和键级锁、死锁检测、热备份、自动灾难恢复等。因为这些数据基本概念是在NoSQL层次实现的, c-treeACE使得可以从各种各样的面向NoSQL记录的API和关系API来并发访问同样的数据文件。
下图展示了c-treeACE所支持的API和框架:
图2- NoSQL API包括ISAM API、一个名为JTDB的在ISAM之上的本地Java实现、一个名为c-treeDB for .NET在ISAM之上的.NET实现以及其他几个。而SQL API则包括SQL、JDBC、ODBC、PHP、ADO.NET等。
就像我们将在下面探讨的,从NoSQL和SQL并发访问数据的能力给那些不是以关系格式保存的数据的访问带来了好处。在本文中,我们将会使用标准的SQL命令来访问数据,并用这种方式演示如何使用SQL访问非关系数据。在实际中,我们可以用任何使用工业标准SQL的应用程序来访问这些数据。这也为优化数据访问以获取相对于只支持SQL的数据引擎的性能改善提供了机会,不过这会是另外一篇文章的主题。
在本文中所提供的示例代码使用了NoSQL c-treeDB C API,该API在ISAM API之上提供一个了更高的层次,其通过提供用于缓冲管理的例程、会话建立、将应用数据和索引文件组合到一个数据库中而节省了程序员的时间和努力。经过三十多年的努力,FairCom已经为垂直市场应用、企业范围应用、全球范围的嵌入式处理提供了这类底层数据库技术。c-treeACE是用于高速数据索引和抽取的引擎级的解决方案。从苛刻的Visa的信用卡事务处理工作到NASA的外太空应用的各种各样事物都使用了该技术。