为关系数据库表建立索引结构并进行查询的方法和装置制造方法

文档序号:6506184阅读:175来源:国知局
为关系数据库表建立索引结构并进行查询的方法和装置制造方法
【专利摘要】本发明公开了一种为关系数据库表建立索引结构并进行查询的方法和装置。建立索引结构的方法包括:获取关系数据库表中包含的JSON文档;识别JSON文档中的JSON对象,并为其分配标识;根据所述JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。对关系数据库表进行查询的方法包括:接收包含特定指示符的查询请求,该指示符指示对JSON对象进行查询;以及基于查询请求中的查询条件,搜索根据之前方法建立的索引结构,从而确定满足查询条件的目标JSON对象。还公开了与上述方法对应的装置。通过针对JSON对象建立索引并进行查询,降低了查询粒度,提高了查询精确性。
【专利说明】为关系数据库表建立索弓I结构并进行查询的方法和装置

【技术领域】
[0001 ] 本发明涉及关系数据库和JSON对象,更具体而言,涉及针对包含JSON文档的关系数据库表建立索引结构并进行查询的方法和装置。

【背景技术】
[0002]关系数据库RDB (rat1nal database)是将现实世界中的各种实体以及实体之间的各种联系用关系模型来表示,并基于这样的关系模型而构建的数据库,是目前使用最为广泛的数据库。关系数据库用表的形式来存储数据,并用标准数据查询语言SQL来执行数据查询。
[0003]随着互联网web2.0网站的兴起,非关系型的数据库,又称为NoSQL(notonlySQL),越来越多地应用于网络数据存取。与传统的关系数据库管理系统RDBMS相比,非关系型数据库NoSQL不局限于固定的表结构,具有更加灵活的数据存储形式。相应地,NoSQL并不将SQL语言作为主要的查询语言。通常,NoSQL具有分布式弹性架构,因而具有高可扩展性和高可用性。并且,NoSQL能够针对海量数据进行高效率存储并处理高并发的读写访问需求,因而在海量数据存取方面比传统的关系数据库RDB具有更大的优势。
[0004]为了使得关系数据库RDB也能够如同NoSQL —样更加灵活地支持多种形式的数据存储,已经提出在关系数据库中引入JSON文档。JSON(JavaScriptObject Notat1n)是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,易于发开人员的阅读和编写,同时也易于机器解析和生成,是一种理想的数据交换语言。通过引入JSON文档,可以在表的一个项目中记录多个对象,从而扩展关系数据库的记录能力。
[0005]图1示例性示出关系数据库中用于存储患者医疗数据的表,其中图1A示出包含JSON文档的表,图1B示出存储同样数据内容的传统的表。具体地,图1A所示的表在3列中分别定义了 3个字段:患者ID,患者名字,以及就医记录,其中患者ID,患者名字为常规字段,而就医记录一列被定义为长字段(或称为blob),从而包含JSON文档。根据JSON语言的特点,在JSON文档中用“ {} ”定义JSON对象,JSON对象可以用一个或多个关键字/键值的对来表示。例如,在表的第一行(记为RowO)中用一个JSON文档描述了第一个患者(userl)的就医记录,该JSON文档包含了 2个JSON对象,第一个JSON对象通过两个关键字/键值的对来表示:“hospitalName”: “医院A”以及“symptom”: “症状A”,也就是说,第一个JSON对象对应于userl因为“症状A”到“医院A”就诊的就医记录;第二个JSON对象同样通过两个关键字/键值的对来表示,对应于userl因为“症状B”到“医院B”就诊的就医记录。因此,这个JSON文档实际上描述了两条就诊记录。类似的,在表的第二行(记为Rowl)中用另一个JSON文档描述了第二个患者的4条就医记录,在表的第三行(记为Row2)中用又一JSON文档记录了第三个患者的3条就医记录。对于传统的关系数据库表来说,如果要存储以上的患者信息和就医记录,就需要采用至少4列来分别记录患者ID、患者名字、医院名称和症状,并用至少9行来分别记录以上9条就医记录,如图1B所示。对比图1A和图1B可以看到,通过引入JSON文档,关系数据库的表达更加灵活,可以支持更多的存储形式。
[0006]然而,对于引入有JSON文档的数据库表,适用于传统数据库表的查询方法常常表现出不足。例如,对于图1A所示的表,在一个例子中,希望查询因为“症状A”到“医院A”就诊的患者。根据现有的SQL查询方式,典型地,只能通过以下查询条件进行查询:where JS0N_VAL( “records.hospitalName”)= “医院 A,,AND JS0N_VAL( “records, symptom”)= “症状A”。该查询条件相当于在就诊记录字段中选择同时包含“医院A”和“症状A”的JSON文档。可以看到,除了患者userl之外,患者userf所对应的JSON文档也包含了 “医院A”和“症状A”,尽管实际上userf是因为“症状C”而到“医院A”就诊,因为“症状A”而到“医院C”就诊。也就是说,上述查询会同时返回userl和user2,但是user2并不是期望的正确结果。因此,对于包含有JSON文档的表,现有的查询方法的查询粒度并不能够满足精确查询的需求。
[0007]为此,希望提出新的方案,能够更加有效地针对包含有JSON文档的关系数据库表进行查询。


【发明内容】

[0008]鉴于以上提出的问题,提出本发明,旨在提供一种方案,能够针对关系数据库表中的JSON对象进行查询,从而提高查询的精确性。
[0009]根据本发明一个实施例,提出了一种为包含JSON文档的关系数据库表建立索引结构的方法,包括:获取所述关系数据库表中包含的至少一个JSON文档;识别所述至少一个JSON文档中的多个JSON对象,并为所述多个JSON对象分配标识;根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。
[0010]根据另一实施例,提出了一种对包含JSON文档的关系数据库表进行查询的方法,包括:接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;以及基于所述查询请求中的查询条件,搜索根据前一实施例的方法所建立的索引结构,从而确定满足查询条件的目标JSON对象。
[0011]根据本发明一个实施例,提出了一种为包含JSON文档的关系数据库表建立索引结构的装置,包括:文档获取单元,配置为获取所述关系数据库表中包含的至少一个JSON文档;识别单元,配置为识别所述至少一个JSON文档中的多个JSON对象,并为所述多个JSON对象分配标识;以及索引建立单元,配置为根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。
[0012]根据另一实施例,提出了一种对包含JSON文档的关系数据库表进行查询的装置,包括:接收单元,配置为接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;以及查询单元,配置为基于所述查询请求中的查询条件,搜索利用前一实施例的装置所建立的索引结构,从而确定满足查询条件的目标JSON对象。
[0013]利用上述方法和装置,可以针对关系数据库表中的JSON对象建立索引并进行查询,由此降低查询粒度,提高查询的精确性。

【专利附图】

【附图说明】
[0014]通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
[0015]图1示例性示出关系数据库表;
[0016]图2示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图;
[0017]图3示出根据本发明一个实施例的建立索引结构的方法的流程图;
[0018]图4示例性示出根据本发明一个实施例为JSON对象分配的标识;
[0019]图5示出根据本发明一个实施例所建立的索引结构的例子;
[0020]图6示出根据本发明一个实施例对关系数据库表进行查询的方法的流程图;
[0021]图7示出根据本发明一个实施例的建立索引结构的装置的框图;以及
[0022]图8示出根据本发明一个实施例的查询装置的框图。

【具体实施方式】
[0023]在附图中显示了本公开的一些优选实施方式,下面将参照附图更详细地描述这些优选实施方式。然而,可以以各种形式实现本公开,其不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
[0024]所属【技术领域】的技术人员知道,本发明可以实现为系统、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:可以是完全的硬件、也可以是完全的软件(包括固件、驻留软件、微代码等),还可以是硬件和软件结合的形式,本文一般称为“电路”、“模块”或“系统”。此外,在一些实施例中,本发明还可以实现为在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读的程序代码。
[0025]可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是一但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0026]计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0027]计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括一但不限于一无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0028]可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言一诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络一包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0029]下面将参照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,这些计算机程序指令通过计算机或其它可编程数据处理装置执行,产生了实现流程图和/或框图中的方框中规定的功能/操作的装置。
[0030]也可以把这些计算机程序指令存储在能使得计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令就产生出一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruct1nmeans)的制造品(manufacture)。
[0031]也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其它可编程装置上执行的指令能够提供实现流程图和/或框图中的方框中规定的功能/操作的过程。
[0032]图2示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图2显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
[0033]如图2所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
[0034]总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
[0035]计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
[0036]系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图2中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如⑶-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施例的功能。
[0037]具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
[0038]计算机系统/服务器12也可以与一个或多个外部设备14 (例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口 22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
[0039]下面结合附图描述本发明的各个实施例。在这些实施例中,对于引入有JSON文档的关系数据库表,识别JSON文档中的JSON对象,为其分配标识,并针对这些JSON对象建立索引结构。具体而言,在索引结构中,使得节点包含JSON对象的标识作为指针。由此,可以通过索引结构直接指向特定的JSON对象。与之相应地,可以定义新的查询语法,来指示对关系数据库表中的JSON对象进行查询。在接收到包含这样的查询语法的查询请求时,就可以基于以上建立的索引结构,对表中的JSON对象进行查询。于是,利用以上全新建立的索引结构,可以实现在关系数据库表中对JSON对象的查询,从而降低查询粒度,提高查询的精确性。
[0040]现在参看图3,其示出根据本发明一个实施例的为关系数据表建立索引结构的方法的流程图。如图所示,该实施例中建立索引结构的方法包括以下步骤:在步骤31,获取关系数据库表中包含的至少一个JSON文档;在步骤33,识别所述至少一个JSON文档中的多个JSON对象,并为其分配标识;在步骤35,根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象的键值并包含该特定JSON对象的标识。下面结合具体例子描述以上各个步骤的执行方式。
[0041]首先,在步骤31,获取关系数据库表中包含的至少一个JSON文档。如图1A所示,现有技术已经提出在关系数据库表的长字段中插入JSON文档作为表的项目。因此,通过读取数据库表中定义长字段的列中的内容,就可以获取引入到关系数据库表中的JSON文档。
[0042]接着,在步骤33,识别所获取的JSON文档中的多个JSON对象,并为其分配标识。具体地,在一个实施例中,步骤33包括,识别JSON文档中的JSON对象。如本领域技术人员所知,JSON文档采用特定的标示性的符号来定义JSON对象和数组。具体地,JSON采用一对“ H ”来定义一个JSON对象,一个JSON对象是若干个无序的“关键字/键值”的对(key/value pair)的集合。每个对表示为“关键字”:“键值”的形式。JSON文档还用一对“[]”来定义一个数组,数组是值的有序集合。构成数组的值可以是双引号括起来的字符串、数值(number)、布尔值、对象或者另一数组。通过用对象或数组作为值构建进一步的数组,JSON文档可以定义嵌套的结构。
[0043]基于以上的JSON语言的特点,可以容易地辨识出标示性的符号,例如“ {} ”,从而识别出JSON文档中定义的JSON对象。例如,在图1A中,通过辨识JSON文档中的标示性符号可以确定,表的第一行中的JSON文档定义了一个数组,该数组包含了 2个JSON对象,每个JSON对象都通过2个关键字/键值的对来表示。类似的,表的第二行的JSON文档定义了 4个JSON对象,表的第三行的JSON文档定义了 3个JSON对象。
[0044]在识别出JSON文档中包含的JSON对象的基础上,在一个实施例中,步骤33还包括,为识别出的JSON对象分配标识。
[0045]在一个例子中,上述分配标识的步骤包括,为识别出的JSON对象分配全局标识。具体地,可以全局地考虑步骤31所获取的一个或多个JSON文档中的多个JSON对象,对于其中的任意JSON对象,用单一 ID唯一地对其进行标识,从而形成全局标识。更具体地,在图1A的例子中,第一行的JSON文档定义了 2个JSON对象,第二行的JSON文档定义了 4个JSON对象,第三行的JSON文档定义了 3个JSON对象。对于这9个JSON对象,可以统一地为其分配全局标识,例如01,02,-09,使得一个全局标识唯一地对应于整个“就医记录”字段中的某个JSON对象。由此,通过全局标识来标识各个JSON对象。
[0046]在一个例子中,上述分配标识的步骤包括,确定识别出的JSON对象所对应的JSON文档的文档ID,并为该识别出的JSON对象分配文档内的对象ID,将文档ID和对象ID的组合作为标识。可以理解,对于插入到关系数据库表中的JSON文档,可以用该JSON文档所在的行来标识该JSON文档。例如,图1A中记录userl的就医记录的JSON文档的文档ID可以表示为RowO,与user2对应的JSON文档的文档ID可以表示为Rowl。进一步地,在某个JSON文档之内,用对象ID标识出不同的JSON对象。
[0047]在一个例子中,在JSON文档之内,针对各个JSON对象生成对象ID,用以在文档之内标识不同的JSON对象。图4示例性示出根据一个实施例为JSON对象分配的标识。具体地,在图4中,采用文档ID和对象ID的组合的方式为图1A的表中的JSON对象分配了标识。例如,JSON 对象{ “hospitalName”: “医院 B”,“symptom”: “症状 B”}对应的 JSON 文档为第一行中的文档,其文档ID为RowO ;在该文档之内,该JSON对象为第二个JSON对象,因此为其生成OIDl作为其对象ID。因此,可以通过(Row0,0IDl)或者(0,I)的形式标识出该JSON对象;换而言之,可以为该JSON对象分配(0,I)形式的标识。
[0048]在一个实施例中,用JSON对象所对应的JSON路径作为其对象ID。如本领域技术人员所知,与用于XML文档的X路径(XPath )类似地,已经提出用于JSON文档的JSON路径。JSON路径采用JSON语言约定的符号来限定JSON文档中的元素,并用于从JSON文档中提取数据。例如,JSON路径用$表示根对象/元素,用@表示当前的对象/元素,用[]作为数组操作符。每个JSON对象具有其独有的JSON路径,相应地,该JSON路径可以用于标识对应的JSON对象。例如,在一个例子中,图1A中的JSON对象{ “hospitalName”: “医院B”,“symptom”: “症状 B”}可能具有如下 JSON 路径:/records/hospital [I]/symptom[l];相应地,该JSON路径可以用于标识以上的JSON对象,从而用作该JSON对象的对象ID。由于JSON对象自然地对应于一个JSON路径,并可通过该JSON路径来访问,因此,将JSON路径作为JSON对象的对象ID避免了如图4所示的重新生成对象ID的过程。在采用JSON路径作为对象ID的情况下,可以用文档ID和JSON路径的组合标识出各个JSON对象。
[0049]可以理解,除了以上所举例的标识方法之外,本领域技术人员在阅读本说明书的情况下,有可能采用其他或更多种方式来标识JSON对象。这些方式都应认为涵盖在本发明构思范围之内。
[0050]在识别出各个JSON对象,并为其分配标识的基础上,执行步骤35,根据JSON对象中的键值,建立索引结构,使得该索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象的键值并包含该特定JSON对象的标识。可以理解,现有技术中已经提出多种方法针对关系数据库表中的项目来建立索引结构。索引结构常常表现为树的形式,例如二叉树,B树(平衡树),B+树等等。下面结合B树和B+树的例子描述索引结构的建立。
[0051]B树是一种常见的数据结构。在B树中,内部(非叶子)节点可以拥有预先设定范围内的多个(例如多于2个)子节点。例如,在一个2-3B树(通常简称2-3树),每一个内部节点只能有2或3个子节点。B树中每一个内部节点会包含一定数量的键值。一个节点的分支(或子节点)的数量会比其存储的键值的数量大I。例如,在2-3B树中,存储I个键值的内部节点可以具有2个子节点,存储2个键值的内部节点可以具有3个子节点。
[0052]在生成B树的过程中,动态地调整根节点以及相应的子树,使得所有叶节点位于相同的深度,以此保持B树的平衡。由于B树的平衡性,使用B树作为关系数据库表的索引结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。
[0053]在B树的基础上还提出了与此类似的B+树。B+和B树的不同在于节点上存储的键值的数目不同,因而具有的子节点的数目也不同。以上不同使得B树和B+树具有以下不同的特点。在B树中,任何一个键值出现且仅出现在一个节点中(该节点有可能不是叶节点),因而搜索有可能在非叶节点,即内部节点处结束。而在B+树中,键值有可能出现在多个节点中,且一定会出现在叶节点中,因此,搜索必然结束于叶节点处,具有固定的搜索深度。
[0054]根据现有技术,可以利用B树或B+树为关系数据库表的特定字段的项目,也就是,表的特定列中的项目,建立索引结构。在此过程中,一般地,根据该特定列中各个项目的键值,将这些键值分别记录在B树或B+树的各个节点中,并使得节点包含所记录的项目的行ID。在已经限定上述特定列的情况下,行ID就能够唯一地定位出节点所记录的项目。由此,在搜索进行至满足条件的节点时,根据节点包含的行ID就可以在数据库表中迅速定位出要搜索的项目。
[0055]在关系数据库表中引入JSON文档的情况下,一个JSON文档整体作为一个项目插入到表中。根据上述现有技术,以表中的项目为分析对象来建立索引结构,这对应于基于整个JSON文档来建立索引结构。然而,如【背景技术】部分所述,JSON文档包含多个JSON对象,以整个JSON文档为分析对象的方式不能满足细粒度查询的要求。因此,在之前的步骤33,识别出了各个JSON对象,并为其分配了标识。这为步骤35中基于JSON对象建立索引结构提供了基础。
[0056]具体地,在步骤35中,根据JSON对象中的键值,建立索引结构。如前所述,JSON对象由一个或多个关键字/键值的对构成,其中的键值可以作为建立索引结构的基础。这与现有技术中基于表的各个项目的键值建立索引结构的过程是类似的。然而,不同的是,在本发明实施例的方法中,索引结构是针对JSON对象而建立的,因此,索引结构中包含至少一个这样的节点,该节点至少记录一特定JSON对象的键值并包含该特定JSON对象的标识。这样的索引结构为针对JSON对象进行的查询提供了基础。在搜索进行至满足条件的节点时,将节点包含的JSON对象的标识作为指针,就可以在数据库表中定位出要搜索的JSON对象。
[0057]图5示出根据一个实施例所建立的索引结构的例子,该例子中的索引结构基于图1A所示的表而建立。在图5所示的索引结构中,节点A存储有2个JSON对象的键值,并具有3个子节点B1,B2和B3。记录在节点A中的键值分别为键值I 医院A,症状C”和键值2:“医院B,症状C”。相应地,子节点BI中可以记录键值不大于上述键值I的JSON对象,节点B2可以记录键值在上述键值I和键值2之间的JSON对象,节点B3可以记录键值大于上述键值2的JSON对象。假定节点BI,B2和B3作为叶节点位于索引结构的最下一层。为了清楚和简单,图5中仅示出了节点BI和B2的细节。如图5所示,节点BI记录了 2个JSON对象的键值,这些键值都不大于上述键值I。并且,节点BI相应地包含了所记录的2个JSON对象的标识。类似的,节点B2中记录了 3个JSON对象的键值,这些键值都大于以上的键值I且小于或等于键值2。另外,节点B2相应地包含了所记录的3个JSON对象的标识。在图5的例子中,JSON对象的标识体现为文档ID和JSON路径的组合的方式。这些标识可以作为指针将所记录的JSON对象定位到数据库表的相应位置。例如,节点B2中记录了某特定JSON对象的键值“医院B,症状A”,并包含了该JSON对象的标识(I, /records/hospital [3] /symptom[3])。通过这样的标识,可以将该JSON对象定位为表的第2行的JSON文档中的第4个JSON对象,如图1A所示。尽管在图5的例子中,示出了文档ID和对象ID的组合作为JSON对象的标识,但是可以理解,JSON对象的标识也可以体现为其他形式,只要该标识能够作为指针指向对应的JSON对象。可以理解,图5所示例性示出的索引结构可以是针对某列JSON文档生成的一个完整的索引结构,也可以是一个完整索引结构的一部分。相应地,节点A可以是一个索引结构的根节点,也可以是一个中间节点。
[0058]此外,如前所述,步骤35建立的索引结构例如可以是B树形式或B+树形式。在索引结构为B树形式的情况下,典型地,使得索引结构中的每个节点都包含所记录的JSON对象的完整标识,因为沿B树进行的搜索和查询有可能结束于中间节点。在索引结构为B+树的情况下,由于搜索和查询总是结束于叶节点,因此应至少使得B+树的叶节点包含所记录的JSON对象的完整标识。例如,假定图5所示的索引结构为B+树,那么应使得叶节点BI,B2和B3包含所记录的JSON对象的标识。对于非叶节点,例如节点A,在一个例子中,节点A同样地包含所记录的JSON对象的标识。而在另一例子中,节点A也可以仅包含所记录的JSON对象的部分标识(例如,仅包含文档ID)或者不包含所记录的JSON对象的标识。此时,节点A作为中间节点,仅用于划分子树和判断分支。
[0059]可以理解,尽管以上结合B树和B+树的例子描述了索引结构,但是索引结构也可以是其他结构形式。不管采用何种形式,步骤35所建立的索引结构是以各个JSON对象的键值为基础的,而不是将整个JSON文档作为分析对象。并且,索引结构中的节点可以包含所记录的JSON对象的标识,由此可以将所记录的JSON对象定位到数据库表的对应位置。
[0060]基于利用以上方法建立的索引结构,本发明的一个实施例还提供了对包含JSON文档的关系数据库表进行查询的方法。图6示出根据一个实施例对关系数据库表进行查询的方法的流程图。如图6所示,首先在步骤61,接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;接着,在步骤63,基于所述查询请求中的查询条件,搜索利用图3的方法所建立的索引结构,确定满足查询条件的目标JSON对象。
[0061]可以理解,根据现有技术,查询请求默认地以表中的项目为查询对象。对于包含有JSON文档的表,查询请求典型地针对JSON文档进行。例如,在【背景技术】部分描述了针对图1A的表进行查询的传统查询请求:where JS0N_VAL( “records.hospitalName”)= “医院A”AND JS0N_VAL( “records, symptom”)= “症状A”。为了使得查询能够针对JSON对象进行,可以约定一个特定指示符,用该指示符指示对关系数据库表中的JSON对象进行查询。相应地,查询引擎在接收到查询请求时,可以首先判断查询请求是否包含上述特定指示符。如果不包含,则按照常规方式进行查询;如果查询请求包含约定的特定指示符,则执行针对JSON对象的查询,即步骤63。
[0062]可以理解,以上的特定指示符可以是约定的任意指示符,只要该指示符不与已有的查询语法相冲突。例如,在一个具体例子中,将“&&”作为上述特定指示符。相应地,通过将前述的传统查询请求中的“AND”替换为特定指示符“&&”,来指示针对JSON对象的查询。具体地,例如,可以利用查询条件whereJS0N_VAL( “records.hospitalName”)= “医院A”&&JS0N_VAL( “records, symptom”)= “症状 A”来查询键值为“医院 A,症状 A”的 JSON 对象。
[0063]在步骤61接收到包含上述特定指示符的查询请求的情况下,在步骤63,通过搜索利用图3的方法所建立的索引结构,对JSON对象进行查询。具体地,在一个实施例中,步骤63可以包括(未示出),步骤631,基于查询条件中指定的键值确定索引结构中记录目标JSON对象的目标节点;以及步骤633,利用目标节点中记录的标识,在关系数据库表中定位出所述目标JSON对象。
[0064]可以理解,一般地,查询请求通过限定查询条件来指定希望返回的结果,查询条件一般地关联于要查询的项目的键值。在针对JSON对象进行查询的情况下,查询条件涉及要查询的JSON对象的键值。另一方面,如前所述,根据图3的方法所建立的索引结构中的节点可以记录各个JSON对象的键值。因此,通过遍历索引结构,将索引结构中各个节点中记录的键值与查询条件中指定的键值进行比较,就可以确定出目标节点,该目标节点记录有满足查询条件的目标JSON对象。进一步地,如前所述,索引结构中的节点还包含所记录的JSON对象的标识。因此,在步骤633,利用目标节点中记录的标识,就可以在数据库表中定位出该目标JSON对象,并获取其相关信息。
[0065]具体地,假定基于图1A的表建立了图5所示的索引结构。如前所述,可以利用查询条件 where JS0N_VAL( “records.hospitalName”)= “医院 A,,&&JS0N_VAL( “records.symptom”)= “症状A”来查询键值为“医院A,症状A”的JSON对象。对于这样的查询请求,在步骤631,遍历图5所示的索引结构,将查询条件中指定的键值“医院A,症状A”与各个节点中记录的键值进行比较。具体地,节点A中记录了 2个键值,即键值I 医院A,症状C”和键值2 医院B,症状C”。通过比较可知,查询条件中的指定键值小于键值1,因此,前进至节点A的第一个子节点BI继续进行比较,因为节点BI用于记录键值不大于键值I的JSON对象。通过比较指定键值和节点BI中的记录,可以确定,节点BI中记录的键值“医院A,症状A”与指定键值相匹配,因此,具有该键值的JSON对象即为目标JSON对象,记录该目标JSON对象的节点BI即为目标节点。接着,在步骤633,根据目标节点BI中记录的目标JSON对象的标识(0,/records/hospital [O]/symptom[O]),可以将该目标JSON对象定位在图1A的表中,即定位为表的第一行(RowO)的JSON文档中的第一个JSON对象。在此基础上,可选地,可以进一步地获取与该目标JSON对象相关的信息,例如对应的用户(userl)等坐寸ο
[0066]通过以上示例性查询过程可以看出,在针对JSON对象查询“医院A,症状A”的情况下,仅仅会返回与userl相关的就医记录。尽管与user2对应的JSON文档也包含了 “医院A”和“症状A”,但是由于“医院A”和“症状A”并不位于同一 JSON对象中,userf的就医记录并不满足查询条件,因而不会被选择。由此,现有技术中针对JSON文档进行查询所可能产生的错误结果得到了避免和消除。因此,通过针对JSON对象建立索引并进行查询,查询粒度得到降低,查询的精确性得到了提高。
[0067]基于同样的发明构思,本发明还提供一种用于为包含JSON文档的关系数据库表建立索引结构的装置。图7示出根据本发明一个实施例的建立索引结构的装置的框图。如图所示,用于建立索引结构的装置总体上标注为700。具体地,装置700包括:文档获取单元701,配置为获取所述关系数据库表中包含的至少一个JSON文档;识别单元702,配置为识别所述至少一个JSON文档中的多个JSON对象,并为所述多个JSON对象分配标识;以及索引建立单元703,配置为根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。
[0068]在一个实施例中,上述文档识别单元701配置为,通过辨识所述至少一个JSON文档中标示性的符号,识别所述多个JSON对象。
[0069]根据一个实施例,上述识别单元703配置为,为识别出的JSON对象分配全局标识。
[0070]根据另一个实施例,上述识别单元703配置为,确定识别出的JSON对象所对应的JSON文档的文档ID,并为该识别出的JSON对象分配文档内的对象ID,将文档ID和对象ID的组合作为标识。
[0071]在一个实施例中,上述识别单元703进一步配置为,针对该识别出的JSON对象生成对象ID。
[0072]在另一实施例中,上述识别单元703进一步配置为,用该识别出的JSON对象所对应的JSON路径作为其对象ID。
[0073]根据一个实施例,上述节点为所述索引结构的叶节点。
[0074]根据另一方面的实施例,本发明还提供一种对包含JSON文档的关系数据库表进行查询的装置。图8示出根据本发明一个实施例的查询装置的框图。如图所示,对包含JSON文档的关系数据库表进行查询的装置总体上标注为800,并包括:接收单元801,配置为接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;以及查询单元803,配置为基于所述查询请求中的查询条件,搜索利用前述的装置700所建立的索引结构,从而确定满足查询条件的目标JSON对象。
[0075]根据一个实施例,上述查询单元803配置为,基于查询条件中指定的键值确定索引结构中记录目标JSON对象的目标节点;以及,利用目标节点中记录的标识,在关系数据库表中定位出所述目标JSON对象。
[0076]可以理解,图7和图8中的各个单元是以功能进行划分的,因此各个单元可以位于相同或者不同的物理平台上。在一个实施例中,装置700和装置800各自作为独立的装置和工具。在另一实施例中,装置700和装置800可以集成在一起,整体作为增强查询功能的工具。在一个实施例中,装置800可以包含在现有的查询引擎中;而在另一实施例中,装置800也可以表现为与现有查询引擎相独立的工具部件。图7和图8中各个单元的具体执行方式对应于结合具体例子对图3和图6的各个步骤的描述,在此不再赘述。
[0077]利用图7的装置可以针对关系数据库表中的JSON对象建立索引结构,利用图8的装置可以基于所建立的索引结构实现对JSON对象的查询,由此,对于包含JSON文档的关系数据库表来说,查询粒度得到降低,查询的精确性得到了提高。
[0078]附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0079]以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本【技术领域】的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本【技术领域】的其它普通技术人员能理解本文披露的各实施例。
【权利要求】
1.一种为包含JSON文档的关系数据库表建立索引结构的方法,包括: 获取所述关系数据库表中包含的至少一个JSON文档; 识别所述至少一个JSON文档中的多个JSON对象,并为所述多个JSON对象分配标识; 根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。
2.根据权利要求1的方法,其中识别所述至少一个JSON文档中的多个JSON对象包括,通过辨识所述至少一个JSON文档中的标示性的符号,识别所述多个JSON对象。
3.根据权利要求1的方法,其中为所述多个JSON对象分配标识包括,为识别出的JSON对象分配全局标识。
4.根据权利要求1的方法,其中为所述多个JSON对象分配标识包括,确定识别出的JSON对象所对应的JSON文档的文档ID,并为该识别出的JSON对象分配文档内的对象ID,将文档ID和对象ID的组合作为标识。
5.根据权利要求4的方法,其中为该识别出的JSON对象分配文档内的对象ID包括,针对该识别出的JSON对象生成对象ID。
6.根据权利要求4的方法,其中为该识别出的JSON对象分配文档内的对象ID包括,用该识别出的JSON对象所对应的JSON路径作为其对象ID。
7.根据权利要求1的方法,其中所述节点为所述索引结构的叶节点。
8.—种对包含JSON文档的关系数据库表进行查询的方法,包括: 接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;以及 基于所述查询请求中的查询条件,搜索根据权利要求1-7中任一项的方法所建立的索引结构,从而确定满足查询条件的目标JSON对象。
9.根据权利要求8的方法,其中确定满足查询条件的目标JSON对象包括:基于查询条件中指定的键值确定索引结构中记录目标JSON对象的目标节点;以及,利用目标节点中记录的标识,在关系数据库表中定位出所述目标JSON对象。
10.一种为包含JSON文档的关系数据库表建立索引结构的装置,包括: 文档获取单元,配置为获取所述关系数据库表中包含的至少一个JSON文档; 识别单元,配置为识别所述至少一个JSON文档中的多个JSON对象,并为所述多个JSON对象分配标识; 索引建立单元,配置为根据所述多个JSON对象中的键值,建立索引结构,使得所述索引结构包括至少一个这样的节点,该节点至少记录一特定JSON对象中的键值并包含该特定JSON对象的标识。
11.根据权利要求10的装置,其中所述文档识别单元配置为,通过辨识所述至少一个JSON文档中标示性的符号,识别所述多个JSON对象。
12.根据权利要求10的装置,其中所述识别单元配置为,为识别出的JSON对象分配全局标识。
13.根据权利要求10的装置,其中所述识别单元配置为,确定识别出的JSON对象所对应的JSON文档的文档ID,并为该识别出的JSON对象分配文档内的对象ID,将文档ID和对象ID的组合作为标识。
14.根据权利要求13的装置,其中所述识别单元进一步配置为,针对该识别出的JSON对象生成对象ID。
15.根据权利要求13的装置,其中所述识别单元进一步配置为,用该识别出的JSON对象所对应的JSON路径作为其对象ID。
16.根据权利要求10的装置,其中所述节点为所述索引结构的叶节点。
17.—种对包含JSON文档的关系数据库表进行查询的装置,包括: 接收单元,配置为接收包含特定指示符的查询请求,该特定指示符指示对关系数据库表中包含的至少一个JSON文档中的JSON对象进行查询;以及 查询单元,配置为基于所述查询请求中的查询条件,搜索利用权利要求10-16中任一项的装置所建立的索引结构,从而确定满足查询条件的目标JSON对象。
18.根据权利要求17的装置,其中所述查询单元配置为,基于查询条件中指定的键值确定索引结构中记录目标JSON对象的目标节点;以及,利用目标节点中记录的标识,在关系数据库表中定位出所述目标JSON对象。
【文档编号】G06F17/30GK104298690SQ201310306279
【公开日】2015年1月21日 申请日期:2013年7月19日 优先权日:2013年7月19日
【发明者】李磊, 周英华, 李鹏, 王夕宁, 吴亚鑫 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1