同步数据变更信息的方法及装置与流程

文档序号:14950758发布日期:2018-07-17 22:29阅读:197来源:国知局

本说明书一个或多个实施例涉及计算机和数据库领域,更具体地,涉及同步数据库中的数据变更信息的方法和装置。



背景技术:

随着互联网的升级,人们越来越多地使用搜索引擎对网络上的海量数据进行搜索。搜索引擎为了进行快速搜索,需要对数据库中的文档建立索引,以便在接收到查询请求时,根据索引快速搜索数据库中的文档。一般地,数据库中存在大量的数据表来记录与文档相关的各种数据项,为了对文档构建索引,通常会将多个数据表进行连接(join),形成一个宽表,基于该宽表来构建索引。

随着网络上数据量的激增,数据库中的数据表也急速增加,并且经常性地发生变更。面对海量数据表的频繁变更,如何更有效地将变更信息同步到搜索引擎,如何更新索引,成为有待解决的问题。



技术实现要素:

本说明书一个或多个实施例描述了一种方法和装置,能够对数据库中的数据变更进行高效同步,降低更新索引的成本,提高性能和效率。

根据第一方面,提供了同步数据库中的变更信息的方法,包括:

接收来自数据库的第一数据变更消息,所述第一数据变更消息指示出发生变更的第一数据表中的第一数据项;

根据所述第一数据变更消息,在与所述第一数据表对应的第一镜像表中更新与所述第一数据项对应的记录;

确定与所述第一镜像表相关联的上级表,所述上级表包含与所述第一镜像表的主键相关联的外键;

对所述上级表和与所述上级表相关联的下级表进行重新连接,生成更新的宽表,其中所述下级表的主键与所述上级表的外键相关联。

在一种可能的设计中,确定与所述数据表相关联的上级表的步骤包括:

确定所述第一镜像表的主键;确定第一主表作为所述上级表,所述第一主表以所述第一镜像表的主键为外键。

在进一步的设计中,所述确定与所述数据表相关联的上级表还包括:

确定所述第一主表的主键;确定第二主表作为所述上级表,所述第二主表以所述第一主表的主键为外键。

在一种可能的设计中,对所述上级表和与所述上级表相关联的下级表进行重新连接的步骤包括:

确定与所述上级表相关联的下级表;将所述上级表与所述下级表进行连接。

在进一步的设计中,所述上级表包括第一外键,所述确定与所述上级表相关联的下级表包括:确定第一辅表作为所述下级表,所述第一辅表的主键等于所述第一外键。

在更进一步的设计中,上述第一辅表包括第二外键,所述确定与所述上级表相关联的下级表还包括:确定第二辅表作为所述下级表,所述第二辅表的主键等于所述第二外键。

在一种可能的设计中,将所述上级表与所述下级表进行连接包括:采取内连接、外连接、自然连接之一,对所述上级表和所述下级表进行连接。

在一种设计中,所述上级表和所述下级表分别为数据库中对应数据表的镜像表。

在一种可能的设计中,方法还包括:在预定时间间隔内接收第二数据变更消息,所述第二数据变更消息指示出发生变更的第二数据表中的第二数据项,所述第二数据表与所述第一数据表具有相同的主键;

将所述第二数据变更消息路由到用于处理所述第一数据变更消息的线程。

在一种可能的设计中,上述方法还包括:将所述更新的宽表发送到搜索引擎,用于更新数据索引。

根据第二方面,提供一种同步数据库中的变更信息的装置,包括:

接收单元,配置为接收来自数据库的第一数据变更消息,所述第一数据变更消息指示出发生变更的第一数据表中的第一数据项;

更新单元,配置为根据所述第一数据变更消息,在与所述第一数据表对应的第一镜像表中更新与所述第一数据项对应的记录;

上级表确定单元,配置为确定与所述第一镜像表相关联的上级表,所述上级表包含与所述第一镜像表的主键相关联的外键;

多连接单元,配置为对所述上级表和与所述上级表相关联的下级表进行重新连接,生成更新的宽表,其中所述下级表的主键与所述上级表的外键相关联。

根据第三方面,提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面所述的方法。

根据第四方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面的方法。

通过本说明书实施例提供的方法及装置,一旦数据库中发生数据变更,在镜像空间中更新修改的数据表,并确定出相关联的数据表而进行重新连接。如此,避免了频繁查询原数据表对原数据库带来的查询压力和性能压力,并且宽表的更新仅基于与修改相关联的数据表,且重新连接的过程不受不同数据库的格式和连接逻辑的限制,具有更好的通用性,以及更好的性能。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1示出本说明书披露的一个实施例的实施场景示意图;

图2根据一个实施例的同步数据库变更信息的方法的流程图;

图3a和3b示出镜像表修改的一个例子;

图4示出根据一个实施例的上级表的示意图;

图5示出确定下级表的示意图;

图6示出根据数据表b确定出的下级表的示意图;

图7示出根据一个实施例的同步装置的示意性框图。

具体实施方式

下面结合附图,对本说明书提供的方案进行描述。

图1为本说明书披露的一个实施例的实施场景示意图。如图1所示,在数据库存储平台100中存储有大量的数据表。一般地,数据库存储平台为分布式存储系统,例如hdfs,各个数据表可以存储在不同的物理存储空间。并且,各个数据表可以位于不同格式的数据库中,例如mysql,oracle,oceanbase等。为了应对这些数据表的变更,为数据库中的数据表建立镜像空间200,在其中存储各个数据表的镜像表。在一个实施例中,镜像空间200也可以采用分布式数据库,例如hbase(hadoopdatabase)实现。计算平台300维护镜像空间200中的镜像表与存储平台100中的数据表的同步,并基于镜像空间200中的镜像表进行数据表的连接(join),将生成的宽表提供给搜索引擎400。具体地,在存储平台100中的数据表发生变更时,会发出一条变更消息。计算平台300获取到这样的变更信息后,首先相应地修改镜像空间中的镜像表,然后在镜像空间中将该修改扩散到相关联的上级表,对于相关联的上级表调用多连接引擎。上述多连接引擎可以将上述上级表与其下级表进行多维多级的连接,由此生成更新的宽表。该更新的宽表可以提供给搜索引擎,用于更新数据索引。通过以上的方式,避免对原始数据表进行大量的查询,提升了性能;并且数据表的连接过程不受原始数据表所在数据库的格式约束,具有更好的通用性。下面描述计算平台的具体执行过程。

图2示出根据一个实施例的同步数据库变更信息的方法的流程图。该方法可以通过任何具有计算和处理能力的装置、设备或系统来执行,例如由图1所示的计算平台300。如图2所示,该方法包括以下步骤:步骤21,接收来自数据库的数据变更消息,所述数据变更消息指示出发生变更的特定数据表中的特定数据项;步骤22,根据所述数据变更消息,在与所述特定数据表对应的特定镜像表中更新与所述特定数据项对应的记录;步骤23,确定与所述特定镜像表相关联的上级表,所述上级表包含与所述特定镜像表的主键相关联的外键;步骤24,对所述上级表和与所述上级表相关联的下级表进行重新连接,生成更新的宽表,其中所述下级表的主键与所述上级表的外键相关联。下面具体描述以上各个步骤的执行。

如前所述,在数据库存储平台(例如图1的存储平台100)中存储的数据表发生变更时,数据库会发出一条变更消息。相应地,在步骤21,接收来自数据库的数据变更消息。一般地,一条数据变更消息对应一个数据表中的一条修改记录。更具体地,在一个例子中,数据变更消息可以包含以下字段内容:发生变更的数据库名,发生变更的数据表名,发生变更的数据项位置,例如变更的字段(列)和记录(行)。换而言之,数据变更消息可以指示出,哪个数据库中的哪个数据表中的哪个位置的数据项发生了变更。此处将接收到的数据变更消息指示出的数据表称为特定数据表,修改的数据项称为特定数据项。

一旦在步骤21接收到上述数据变更消息,在步骤22,根据接收到的数据变更消息,在与所述特定数据表对应的特定镜像表中更新与所述特定数据项对应的记录。在该步骤中,保持镜像空间中的镜像表内容与对应的数据表内容同步一致。具体地,在一个实施例中,在步骤22,首先从数据变更消息中提取出发生变更的数据库名,发生变更的数据表名,以及发生变更的数据项位置,根据发生变更的数据库名和发生变更的数据表名,在镜像空间中确定出发生变更的特定数据表所对应的特定镜像表,然后根据发生变更的特定数据项位置,更新特定镜像表中对应的记录。如此使得,一旦原数据库中的数据表内容发生变化,镜像空间中的镜像表内容随之进行修改,镜像表保持与原数据表的同步一致。

图3a和3b示出镜像表修改的一个例子。图3a示出一个客户信息表a,其中包括两个字段,n个记录。假定在步骤21,接收到的数据变更消息指示出,数据库aaa中的数据表a中的第二条记录的第二字段(客户昵称)变更为“丽丽”。图3a示意性示出该处修改。那么相应地,在步骤22,将镜像空间中与数据表a对应的镜像表a’进行更新,修改对应的记录。图3b示意性示出更新的镜像表a’。可以看到,镜像表a’与原数据表a保持一致。

接着,在步骤23,确定与上述特定镜像表相关联的上级表,所述上级表包含与所述特定镜像表的主键相关联的外键。

如本领域技术人员所知,根据数据表的数据结构,会为每个数据表指定一列字段作为主键(primarykey),其他字段作为外键。一般地,主键是能唯一标识一条记录的属性字段。例如,假定学生成绩表包含学号,学生姓名和成绩等级三个字段(成绩等级为a-e的五等),那么学生姓名和学生成绩都有可能出现相等的值,例如同名同姓或等级相等的情况,而学号可以唯一地标识一个学生或者一条记录,那么学号就会被确定为主键。主键之外的其他字段为外键。一个数据表只能有一个主键,但可以有多个外键。外键可以用于与其他表进行关联和连接。根据各个数据表中的主键和外键的设置,可以认为数据表之间存在主表、辅表的关联关系。具体地,表1和表2各自具有其主键和外键,假定表1的外键为表2的主键,那么在本文中,将表1称为表2的主表,将表2称为表1的辅表。如果以上的学生成绩表为表1,那么表1的主键为学号,外键包括学生姓名和成绩等级。假定存在另一表2,其主键为成绩等级,外键为等级对应的分数范围,那么由于表1的外键(成绩等级)为表2的主键,就认为表1为表2的主表,表2为表1的辅表。

基于以上对主键和外键,以及主表和辅表的关系描述,在步骤23,可以确定与步骤22中的特定镜像表相关联的上级表,该上级表包含与所述特定镜像表的主键相关联的外键。换而言之,该上级表通过其外键与特定镜像表的主键相关联。相应地,在该步骤中,可以首先确定上述特定镜像表的主键pk,然后根据该主键pk进行查询和检索,由此确定出其外键与上述主键pk直接或间接关联的数据表作为上级表。在一个实施例中,可以预先存储各个表之间的关联关系和发生关联的键。在这样的情况下,通过查询这样的关联关系可以快速地确定出上级表。

在一个实施例中,该上级表即为步骤22中的特定镜像表的主表,或称直接主表。也就是说,该表的外键等于上述特定镜像表的主键,由此与该特定镜像表的主键直接关联。

在另一实施例中,该上级表还包括步骤22中的特定镜像表的间接主表或称多层级主表,比如主表的主表,其外键通过中间表与所述特定镜像表的主键实现关联。例如,在一个例子中,上级表包括第一主表和第二主表,第一主表为所述特定镜像表的直接主表,以该特定镜像表的主键为外键;而第二主表以第一主表的主键为外键,因此是第一主表的直接主表,而是特定镜像表的间接主表。

在一个实施例中,在步骤23,将确定出的所述特定镜像表的所有层级的主表均作为上级表。在另一实施例中,在该步骤中,确定出所述特定镜像表的最高层级的主表作为上级表(这两种方式并不会影响宽表的生成结果)。

下面结合具体例子来说明上述上级表。如前所述,在步骤22,更新了镜像表a’,如图3b所示。假定该镜像表a’的主键为客户id。因此,在步骤23,可以以“客户id”进行检索,查询哪些表包含“客户id”作为外键,或者哪些表包含的外键通过中间表间接地关联到“客户id”。图4示出根据一个实施例的上级表的示意图。具体地,图4示出了表b,一个销售订单表,该表包含至少4个字段:订单号,客户id,区域id,产品id等,其中订单号为其主键,其他字段为外键。由于表a’的主键“客户id”作为了表b的外键,因此,在步骤23中,将表b作为表a’的上级表。更具体地,表b实际上是表a’的直接主表。如果表b还有更进一步的主表,那么这样的更进一步的主表可以认为通过表b与表a’间接关联,该表也可以作为表a’的上级表。

在如上所述确定了上级表的基础上,在步骤24,对所述上级表和与所述上级表相关联的下级表进行重新连接,生成更新的宽表,其中所述下级表的主键与所述上级表的外键相关联。

在一个实施例中,预先训练一个多连接(multijoin)引擎,该多连接引擎可以将输入的数据表与其下级表进行多维多级的连接。如此,在步骤24中,可以将步骤23确定出的上级表输入该多连接引擎,通过该引擎对输入的上级表和与所述上级表相关联的下级表进行连接,生成宽表。下面描述以上多连接引擎的执行过程。

在一个实施例中,上述多连接引擎接收到步骤23确定出的上级表,由该上级表确定出相关联的下级表,并将所述上级表与所述下级表进行连接(join)。之前结合步骤23对上级表进行了描述,步骤24中的下级表与上级表具有相对应的含义。具体地,下级表的主键与所述上级表的外键直接或间接关联。

在直接关联的情况下,下级表的主键等于所述上级表的某个外键。也就是说,上级表包括外键k,如果存在某个数据表(此处称为第一辅表),其主键等于该外键k,那么确定该第一辅表作为下级表。

在间接关联的情况下,下级表的主键通过中间表关联到上级表的某个外键。例如,假定上述直接关联的第一辅表包括外键m,如果存在某个数据表(此处称为第二辅表),其主键等于该第一辅表的外键m,那么该第二辅表可以作为第一辅表的直接辅表,并作为所述上级表的间接关联的下级表。

图5示出确定下级表的示意图。如图5所示,从上级表确定其关联的下级表的过程可以用一个有向无环图dag(directedacyclicgraph)来表示。在图5中的例子中,假定上级表t包含4个外键k1,k2,k3,k4,分别针对这些外键进行查询。例如,对于外键k1,假定确定出辅表a1,其主键等于k1,那么该辅表a1即作为上级表t的一个下级表(更具体地,为其直接辅表)。接着,针对该辅表a1的各个外键进行查询。假定存在辅表a2,其主键等于辅表a1的外键a1,那么该辅表a2也作为上级表t的一个下级表(更具体地,为其间接辅表)。类似地,对于外键k2,k3,k4都进行这样的查询。

在一个实施例中,在确定下级表的执行过程中,遵循深度优先的原则。即,对于上级表的某个外键,逐层确定以该外键进行关联的下级表,直到不存在进一步层极的下级表。例如,在图5中,对于外键k1,逐层确定出关联的下级表a1和a2,直到辅表a2不存在更进一步的辅表,才针对外键k2进行查询。

在另一实施例中,在确定下级表的执行过程中,也可以遵循广度优先的原则。例如在图5中,分别针对外键k1,k2,k3和k4确定出第一层级的下级表,即直接辅表a1,a3,a6,a8,然后分别针对这些第一层级的下级表继续查询其进一步的辅表。这样的方案需要对查询出的中间表进行记录和缓存,因此更适用于数据表之间的关联深度不够深的情况。

更具体地,结合图4所示的上级表,即数据表b,进行描述。图6示出根据数据表b确定出的下级表的示意图。如图所示,数据表b为一个销售订单表,该表包含至少4个字段:订单号,客户id,区域id,产品id等,其中订单号为其主键,其他字段为外键。

根据数据表b中“客户id”这一外键,可以确定出辅表a’为一个下级表。可以理解,数据表b正是根据镜像表a’确定出的上级表,反向地,从数据表b确定出的下级表中一定会包含该表a’。

根据表b中“区域id”这一外键,可以确定出表c为表b的直接辅表,作为一个下级表。具体地,表c为区域信息表,它以表b的外键“区域id”为主键,进一步扩充区域信息。

根据上级表b中“产品id”这一外键,可以确定出表d为表b的直接辅表,作为一个下级表。具体地,表d为产品说明表,它以表b的外键“产品id”为主键,进一步扩充产品信息。此外,表d还包括了外键“供应商id”和“价格”。针对表d的外键“供应商id”进行查询,又可以确定出表e为表d的辅表。具体地,表e为供应商信息表,它以表d的外键“供应商id”为主键,进一步扩充供应商信息。如此,表e是表d的直接辅表,表b的间接辅表,因此也作为表b的一个下级表。

如此,针对上级表的各个外键,逐层确定出下级表。

在一个实施例中,每确定出一个下级表,即将上级表与确定出的下级表进行连接。在另一实施例中,从上级表确定出所有下级表,并对上级表和所有下级表进行连接。

如本领域人员所知,在对两个数据表进行连接的时候,根据数据表的数据结构,可以采取不同的连接方式,例如内连接、外连接、自然连接之一,其中外连接又包括左连接、右连接和全连接。可以针对上述上级表和下级表的结构,从以上连接方式中选择适当的方式进行连接。

通过对上级表和关联的下级表重新进行连接,可以生成更新的宽表。在一个实施例中,将该更新的宽表发送给搜索引擎,用于更新数据索引。

在一个实施例中,以上查询确定上级表,将上级表与关联的下级表连接的操作均在镜像空间中执行。换而言之,上述上级表、下级表均为数据库中原始数据表的对应镜像表。如此,避免了频繁查询原数据表对原数据库带来的查询压力和性能压力。

此外,通过图2中的步骤23和24,可以快速确定出与修改的数据表存在直接或间接关联关系的所有其他表,进而对这些相关的表进行重新连接。如此,不必在每次数据修改时基于全量数据表重新生成整个宽表。并且,上述重新连接的过程并不受限于各个数据库的格式和连接逻辑,具有更好的通用性,以及更好的性能。

可以理解,在海量数据库的情况下,数据的更新可能会非常频繁,因此,计算平台有可能在很短的时间内接收到指向同一数据表或关联数据表的多条数据变更消息。为了避免数据冲突,在一个实施例中,在同一进程同一线程下处理针对同一数据表或关联数据表的修改。

具体地,假定在t0时刻接收到一条数据变更消息。为了区分,将该条消息称为第一数据变更消息。第一数据变更信息指示出对第一数据表的修改。接收到该消息后,计算平台在某个进程下的某个线程中对该消息进行处理,执行图2所示的方法。假定在t0之后的时刻t1,其中t1与t0的差值小于预定时间间隔t,计算平台收到另一条数据变更消息,此处称为第二数据变更消息。计算平台可以从该第二数据变更消息中提取出,所指示出的发生变更的数据表,即第二数据表,并确定该第二数据表的主键。如果第二数据表与第一数据变更消息指示的第一数据表具有相同的主键,那么将该第二数据变更消息路由到用于处理所述第一数据变更消息的线程中。如此保证第二数据变更消息和第一数据变更消息的处理时序,避免两者并行执行可能导致的数据冲突。

根据另一方面的实施例中,还提供用于同步数据库中的变更信息的装置。图7示出根据一个实施例的同步装置的示意性框图。如图7所示,同步数据库中的变更信息的装置700包括:接收单元71,配置为接收来自数据库的第一数据变更消息,所述第一数据变更消息指示出发生变更的第一数据表中的第一数据项;更新单元72,配置为根据所述第一数据变更消息,在与所述第一数据表对应的第一镜像表中更新与所述第一数据项对应的记录;上级表确定单元73,配置为确定与所述第一镜像表相关联的上级表,所述上级表包含与所述第一镜像表的主键相关联的外键;多连接单元74,配置为对所述上级表和与所述上级表相关联的下级表进行重新连接,生成更新的宽表,其中所述下级表的主键与所述上级表的外键相关联。

在一个实施例中,上述上级表确定单元73包括:主键确定模块731,配置为确定所述第一镜像表的主键;主表确定模块732,配置为确定第一主表作为所述上级表,所述第一主表以所述第一镜像表的主键为外键。换而言之,主表确定单元将第一镜像表的主表确定为上级表。

在一个进一步的实施例中,上述主键确定模块731还配置为,确定所述第一主表的主键;所述主表确定模块732还配置为:确定第二主表作为所述上级表,所述第二主表以所述第一主表的主键为外键。换而言之,主表确定单元还可以将第一镜像表的主表的主表,即间接主表,确定为上级表。

在一个实施例中,所述多连接单元74包括:下级表确定模块741,配置为确定与所述上级表相关联的下级表;连接模块742,配置为将所述上级表与所述下级表进行连接。

在一个实施例中,所述上级表包括第一外键,所述下级表确定模块741配置为:确定第一辅表作为所述下级表,所述第一辅表的主键等于所述第一外键。换而言之,下级表确定模块将所述上级表的辅表确定为下级表。

在一个进一步的实施例中,所述第一辅表包括第二外键,所述下级表确定模块741还配置为:确定第二辅表作为所述下级表,所述第二辅表的主键等于所述第二外键。换而言之,下级表确定模块将所述上级表的辅表的辅表,即间接辅表,确定为下级表。

在一个实施例中,连接模块742配置为:采取内连接、外连接、自然连接之一,对所述上级表和所述下级表进行连接。

在一个实施例中,所述上级表和所述下级表分别为所述数据库中对应数据表的镜像表。

根据一种实施方式,接收单元71还配置为:在预定时间间隔内接收第二数据变更消息,所述第二数据变更消息指示出发生变更的第二数据表中的第二数据项,所述第二数据表与所述第一数据表具有相同的主键;并且装置700还包括(未示出)路由单元,配置为将所述第二数据变更消息路由到用于处理所述第一数据变更消息的线程。

根据一种实施方式,装置700还包括发送单元(未示出),配置为将所述更新的宽表发送到搜索引擎,用于更新数据索引。

通过以上装置,在镜像空间中更新修改的数据表,并确定出相关联的数据表而进行重新连接。如此,避免了频繁查询原数据表对原数据库带来的查询压力和性能压力,并且宽表的更新仅基于与修改相关联的数据表,且重新连接的过程不受不同数据库的格式和连接逻辑的限制,具有更好的通用性,以及更好的性能。

根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图2所描述的方法。

根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图2所述的方法。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1