如何使用多记录类型为NoSQL类型数据提供SQL访问

引言

随着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的外太空应用的各种各样事物都使用了该技术。

时间: 2024-12-02 22:47:24

如何使用多记录类型为NoSQL类型数据提供SQL访问的相关文章

[CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系

原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自System.Object class Employee { ..... } //显示派生子 System.Object class Employee : System.Object { ..... } 由于所有类型最终都是从System.Object派生的,所以可以保证每个类型的每个对象都有一组最基本

编程-python内建类型与内部类型的区别

问题描述 python内建类型与内部类型的区别 python核心编程(第二版)书中第四章python对象中的两个概念 解决方案 内部类型是指定义在类型内的类型.内建类型是指语言提供的基本类型,无需定义,比如整数或者字符串. 解决方案二: 内建类型是python类库提供给你的基本数据类型内部类型是面向对象的,类的内部类型,它是类内部使用的

Whidbey 初体验之局部类型 ( partial 类型)

Whidbey 初体验 之 局部类型 ( partial 类型) Visual Studio 2005 [Whidbey] 抢先体验版 [Express Beta 1 ] 出来有一段时间了,并且在微软的官方网站上有免费的下载(下载地址:http://lab.msdn.microsoft.com/vs2005/).就本人而言是非常喜欢c#这一新生的语言的.也许并不能说它是新生的,它是对以往各种语言的提炼,或许它是站在巨人的肩膀上的,所以才显得如此的优秀.伴随体验版而来的c# 2.0 给我们带来了新

有关swift函数类型作为返回类型疑惑

问题描述 有关swift函数类型作为返回类型疑惑 func chooseStepFunction (backwards:Bool)->(Int)->Int{ return backwards ? a :b } 我想请问下这里的(Int)->Int 具体是什么意思,小白刚开始学swift不懂 解决方案 参数为Int,返回值为Int的函数, 按照你上面所写, a和b 分别代表一个参数为Int,返回值也为Int的函数 解决方案二: Swift 函数类型作为返回值使用swift 中 函数类型参数

String类型怎么装换为java.sql.Date类型

问题描述 String类型怎么装换为java.sql.Date类型 在java中如何将String类型转换成java.sql.Date类型 解决方案 问题出在你的格式化字符串上.参考官网文档Class SimpleDateFormat格式化字符串是有保留字符的,每个字符代表不同的意义,区分大小写.大写的M表示的是月份,不是说你用在的时间的位置它就表示时间了.所以把时间格式化字符串改成yyyy-MM-dd HH:mm:ss,就能正确输出了. 解决方案二: 在java中如何将String类型转换成j

javascript-JavaScript数组值去重,但是返回的类型和原类型不一样, 怎么转换

问题描述 JavaScript数组值去重,但是返回的类型和原类型不一样, 怎么转换 var arr = [2,1,2,10,2,3,4,1,85,321,3,4,65,10,24]; function uniq(newarr){ function toObject(arr) { var obj = { }; for(var i=0 ;i<arr.length ;i++){ obj[ arr[ i ] ]=true; } return obj ; } function keys(obj){ var

数据结构 二叉树-二叉树 节点类型为结构类型 如何初始化和赋值?

问题描述 二叉树 节点类型为结构类型 如何初始化和赋值? struct ItemNode { int id; string name; }; typedef struct BNode { ItemNode node; BNode *lChild; BNode *rChild; }BNode; 解决方案 ItemNode i1, i2, i3; i1.id = 1; i1.name = "a"; i1.id = 2; i1.name = "b"; i1.id = 3;

class-java中字符类型与数字类型比较的问题

问题描述 java中字符类型与数字类型比较的问题 编写程序将由数字及字符组成的字符串中的数字截取出来并按顺序输出,例如: "ABC137GMNQQ2049PN5FFF"输出结果应该为 01234579. 代码如下 求解排序后的for循环输出为什么要这样写,有点不懂! public class www { public static void main(String[] args) { String str="ABC137GMNQQ2049PN5FFF"; char[

《精通SNMP》——2.4 标签类型和子类型

2.4 标签类型和子类型 除前面介绍的简单类型和结构类型外,还存在标签类型和子类型,它们是ASN.1从不同应用角度定义的两种类型. 2.4.1 标签类型 一般地,用户在定义类型时,除了名字外,Tag.传输编码都继承基础类型原有的定义.标签类型(Tagged Type )是这样一种类型:用户在利用已有的类型定义新类型时,也为新类型定义了新的Tag. 例如下面的类型定义语句: Age ::= INTEGER 其中,类型Age也是整型类型,Tag.传输编码都不改变.再看下面的类型定义语句: IpAdd