具体实施方式
在现有技术中,为了保证任何时候从物化视图中查询到的数据的版本总是最新的,通常会当监测到物化视图的基表中某个记录被更新时,就立刻对物化视图中与该记录相关联的记录进行相应的更新。但是,在有些业务场景下,物化视图的有些基表存在特殊性(本文称之为指定基表),这种特殊性体现为,指定基表中的一个记录往往与物化视图中的大量记录都具有关联关系。假设对指定基表中的某个记录进行更新,那么就需要同时对物化视图中与该记录关联的大量记录都进行相应的更新,这会导致很大的系统开销。
为了更好地对现有技术存在的问题进行介绍,以电商网站的用户收藏商品的业务场景为例。表1示出了电商网站的数据库中的用户收藏表,表2示出了电商网站的数据库中的商品信息表,表3示出了以表1和表2为基表,以“商品标识相同”为join条件,执行join操作得到的物化视图。
用户姓名 |
商品标识 |
张三 |
1 |
张三 |
2 |
李四 |
3 |
王五 |
2 |
表1
商品标识 |
商品名称 |
商品价格 |
1 |
书包 |
50 |
2 |
钢笔 |
8 |
3 |
鼠标 |
70 |
表2
用户姓名 |
商品标识 |
商品名称 |
商品价格 |
张三 |
1 |
书包 |
50 |
张三 |
2 |
钢笔 |
8 |
李四 |
3 |
鼠标 |
70 |
王五 |
2 |
钢笔 |
8 |
表3
当用户需要查询自己收藏的商品有哪些,价格如何时,就可以直接从表3中进行查询。例如,当需要查询用户张三的商品收藏情况,可以根据查询条件(用户姓名为张三),从表3中直接进行查询,得到的查询结果如下:
通常,为得到物化视图,对各基表执行join操作所依据的字段为join字段。例如,对表1和表2进行join操作,join语句的逻辑为“select用户姓名、商品标识、商品名称、商品价格,from表1join表2,using(商品标识)”。其中,using的“商品标识”即是join字段,该join语句的含义为,若表1中的任一记录的join字段值与表2中的任一记录的join字段值相同,则将这两个记录连接为一个记录。
基于此,一个表中的一个记录(记为记录A)与另一个表中的一个记录(记为记录B)相关联,是指记录A和记录B都包含join字段,并且,记录A和记录B包含的join字段的值相同。例如,若join字段是商品标识,则表1中的第一行记录与表2中的第一行记录是相关联的,表2中的第一行记录与表3中的第一行记录也是相关联的。
在表3所示的物化视图中,每个记录对应于一个用户,且对应于一种商品。一个用户可以收藏不止一种商品,一种商品也可以被不止一个用户收藏。
当表1被更新时,同时对表3进行相应的更新,所花费的系统开销较少。例如,表1被更新为如下所示的表1*。
用户姓名 |
商品标识 |
张三 |
1 |
张三 |
2 |
李四 |
3 |
王五 |
2 |
王五
|
3
|
表1*
如表1*所示,用户王五新收藏了商品3(即鼠标),已经在表1*中对新增的记录以下划线加粗的方式进行了标示。此时,也需要对表3进行更新,得到表4。
表4
可见,由于表1是用户表,因此倘若在表1中新增一个记录,那么也仅需要在表3中也新增一条记录即可,执行此操作的系统开销是可以接受的。
但是,当表2被更新时,同时对表3进行相应的更新,所花费的系统开销往往就很大。例如,表2被更新为如下表2*所示。
商品标识 |
商品名称 |
商品价格 |
1 |
书包 |
50 |
2 |
钢笔 |
15
|
3 |
鼠标 |
70 |
表2*
如表2*所示,电商网站修改了商品2(即钢笔)的价格,已经在表2*中对修改的商品价格以下划线加粗的方式进行了标示。此时,也需要对表3进行更新,得到表5。
用户姓名 |
商品标识 |
商品名称 |
商品价格 |
张三 |
1 |
书包 |
50 |
张三 |
2 |
钢笔 |
15
|
李四 |
3 |
鼠标 |
70 |
王五 |
2 |
钢笔 |
15
|
表5
可见,由于表2是商品信息表,一种商品往往被不知一个用户收藏,因此倘若修改了表2中某种商品的价格,那么就需要对表3中所有包含这种商品的记录进行相应修改。事实上,在实践中,收藏同一种商品的用户数量是巨大的,假设有10万个用户都收藏了商品2(钢笔),那么当电商网站对商品2的价格进行修改后,就需要立刻对表3中的10万个记录逐一进行相应的修改,这导致的系统开销是难以接受的。可见,表2即是前文所述的指定基表。
综上,现有的更新物化视图的方法存在以下问题:在有些业务场景下,物化视图的至少一个基表为指定基表,更新指定基表的一个记录,往往会导致物化视图中的大量记录都需要相应地更新,这会导致很大的系统开销。
而本发明的核心思想是,针对每个指定基表,当有请求写入该指定基表的记录时,不立刻对物化视图进行相应的更新,而是将请求写入该指定基表的记录存入该指定基表对应的增量集合中。当需要针对物化视图进行数据查询时,先根据查询条件从物化视图中查询到符合查询条件的记录,然后再根据指定基表对应的增量集合中与查询到的记录相关联的记录,对查询到的记录进行即时更新,以得到查询结果。
也就是说,在本说明书实施例中,只对当前从物化视图中读取的数据进行即时更新,以确保查询到的数据的版本总是最新的,而只更新当前查询的数据所耗费的系统开销是较少的。这就既可以保证任何时候从物化视图中查询到的数据的版本总是最新的,又可以使得指定基表被更新时,不会为了相应地更新物化视图而耗费大量系统开销。
为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。
以下结合附图,详细说明本说明书各实施例提供的技术方案。
图1是本说明书实施例提供的一种数据存储方法流程示意图,包括以下步骤:
S100:针对每个指定基表,获取请求写入该指定基表的记录。
本方法的执行主体可以是对数据库进行管理的设备(如个人计算机、服务器、服务器集群等),所述设备可以具体通过安装的数据库管理系统执行本方法。
众所周知,数据库的物化视图是对若干数据表执行join操作得到的,通常将join操作所针对的若干数据表称为物化视图的基表。其中,至少一个基表为指定基表。指定基表具有如下特点:针对指定基表中的每个记录,该记录往往与物化视图中的多个记录相关联。因此,当指定基表中的某个记录被更新时,若立刻对物化视图进行相应的更新,有时会涉及到物化视图中的大量记录的更新,这会导致很大的系统开销。
此外需要说明的是,通常将物化视图的基表中,除指定基表之外的其他基表称为非指定基表。
在本说明书实施例中,“写入”这种更新数据表的方式,具体可以是向数据表中添加记录,或对数据表中的记录进行修改。此外,从数据表中删除记录,也是一种常见的数据表更新方式。
S102:将请求写入该指定基表的记录存入预先创建的,对应于该指定基表的第一增量集合中。
在本说明书实施例中,可以预先分别为每个指定基表创建其对应的第一增量集合。针对每个指定基表,该指定基表对应的第一增量集合可以是预先在数据库管理设备的磁盘中划定的存储空间。
进一步地,针对每个指定基表,也可以预先在内存中创建对应于该指定基表的第一增量集合。这种情况下,可以更快速地向第一增量集合中存入记录,也可以更快速地从第一增量集合中获取记录。
在本步骤S102中,针对每个指定基表,数据库管理系统当接收到向该指定基表写入记录的请求时,可以将请求写入该指定基表的记录写入该指定基表,也可以暂时不将该记录写入该指定基表。但是,数据库管理系统不会同时根据请求写入该指定基表的记录对物化视图进行相应的更新,而是将该记录存入该指定基表对应的第一增量集合中,具体示例可参见图2(图中虚线连接的两个表具有对应关系)。如此,在后文将要说明的数据查询方法中,就可以根据根据所述物化视图和各指定基表分别对应的第一增量集合,进行数据查询。
进一步地,针对每个指定基表,数据库管理系统当接收到从该指定基表中删除记录的请求时,可以从该指定基表中删除相应的记录,也可以暂时不从该指定基表中删除相应的记录。但是,数据库管理系统不会根据请求从该指定基表中删除的记录,对物化视图进行相应的更新,而是将请求从该指定基表中删除的记录存入对应于该指定基表的第一增量集合中。
图3是本说明书实施例提供的一种数据查询方法的流程示意图,包括以下步骤:
S300:接收包含查询条件的数据查询请求。
图3所示的数据查询方法是以图1所示的数据存储方法为前提的。前文对数据存储阶段进行了说明,后文对数据查询阶段进行说明。
众所周知,所述查询条件是对数据库进行查询时,要查询的数据所应当满足的条件,所述查询条件可以根据业务的实际需要指定。例如,在表1~3所涉及的业务场景下,用户通常想要知道自己收藏的商品有哪些,因此,所述查询条件一般是用户姓名。
S302:根据所述查询条件,针对所述物化视图进行数据查询,得到符合所述查询条件的各目标记录。
在本步骤中,可以根据所述查询条件,直接从物化视图中读取满足所述查询条件的记录,作为各目标记录。
S304:针对每个目标记录,从预先创建的,各指定基表分别对应的第一增量集合中,获取与该目标记录相关联的记录,作为该目标记录对应的增量记录。
S306:根据该目标记录对应的增量记录,更新该目标记录,并将更新后的该目标记录作为查询结果。
由于在前文所述的数据存储方法中,并没有将指定基表的更新数据同步更新到物化视图中,因此,在步骤S302中,得到的满足查询条件的各目标记录有可能不是最新版本的数据,因此,还需要针对每个目标记录,从指定基表对应的第一增量集合中,获取与该目标记录相关联的记录,然后对该目标记录进行更新,得到查询结果。
以图2为例,以“用户姓名=张三”为查询条件,在步骤S302中,得到的两个目标记录:
然后,针对第一个目标记录,第一增量集合中并不存在与该目标记录相关联的记录。针对第二个目标记录,第一增量集合中存在与该目标记录相关联的记录,即:
因此,可以根据与第二个目标记录相关联的记录,更新第二个目标记录。最终,得到的查询结果为:
此外需要说明的是,如前文所述,指定基表对应的第一增量集合中不仅有请求写入指定基表的记录,还是请求从指定基表中删除的记录。在实际操作中,可以对存入第一增量集合的请求从指定基表中删除的记录进行标记,以便将其与第一增量集合中的请求写入指定基表的记录区分开。在步骤S304中,针对每个目标记录,如果从第一增量集合中确定出的与目标记录相关联的记录具有标记(为了描述的方便,将具有标记的记录称为标记记录),则根据确定出的该记录更新该目标记录的方式,可以是将该目标记录中包含的,该标记记录的字段的字段值进行清空。
举例来说,倘若各目标记录为:
对于第二个目标记录,倘若从指定基表对应的第一增量集合中确定出的,与该目标记录相关联的标记记录为:
那么,根据该标记记录,对该目标记录进行更新,更新后的该目标记录为
其中,“null”表示值不存在。由于在本例中,仅存在一个指定基表,因此如果该标记记录是请求从指定基表中删除的记录,那么根据该标记记录对相关联的目标记录进行更新后,实际上得到了一条空的记录。
通过图1所示的数据存储方法和图3所示的数据查询方法,将请求写入指定基表的记录存入指定基表对应的第一增量集合中。当需要基于物化视图进行数据查询时,就可以先根据查询条件,针对物化视图进行数据查询,得到符合所述查询条件的各目标记录。然后,再针对每个目标记录,从指定基表对应的第一增量集合中确定出与该目标记录相关联的记录,作为该目标记录对应的增量记录,进而根据该目标记录对应的增量记录,更新该目标记录。如此,一方面,在每次基于物化视图进行数据查询时,查询到的总是最新版本的数据;另一方面,当指定基表被更新时,无需立刻对物化视图进行相应的更新,这节省了很多系统开销。
此外,虽然非指定基表被更新时,同时相应地更新物化视图不会耗费太多系统开销,但是,若想要节省这部分系统开销,则不妨也可以暂时不根据非指定基表的更新数据更新物化视图,而是将非指定基表的更新数据存入预先创建的,对应于物化视图的第二增量集合中。
具体地,针对每个非指定基表,可以获取请求写入该非指定基表的记录,将请求写入该非指定基表的记录存入预先创建的,对应于所述物化视图的第二增量集合中。其中,类似于指定基表对应的第一增量集合,所述物化视图对应的第二增量集合既可以是预先在磁盘中创建的,也可以是预先在内存中创建的。
待到需要针对物化视图进行数据查询时,再根据查询条件,临时对物化视图中符合所述查询条件和第二增量集合中符合所述查询条件的记录进行合并,得到各目标记录。
具体地,根据查询条件,一方面从物化视图中,读取符合所述查询条件的记录,另一方面从所述物化视图对应的第二增量集合中,获取符合所述查询条件的记录,然后根据从所述第二增量集合中获取的记录和从所述物化视图中读取的记录,确定符合所述查询条件的各目标记录。
图4是本说明书实施例提供的数据存储方法的示例图。图中虚线连接的两个表具有对应关系。如图4所示,将请求写入指定基表的记录存入指定基表对应的第一增量集合。以及,将请求写入非指定基表的记录存入物化视图对应的第二增量集合。存入所述第二增量集合的记录的格式一般需要被调整为物化视图中的记录的格式。
从图4中可以看出,由于第二增量集合中的记录实际上是请求写入非指定基表的记录,其相关联的商品名称和商品价格都是空值,因此,要求指定基表对应的第一增量集合中,应当存在与该请求写入非指定基表的记录相关联的记录。为此,在将请求写入非指定基表的记录存入所述第二增量集合的同时,可以执行以下步骤:
针对每个指定基表,当确定该指定基表对应的第一增量集合中不存在与请求写入该非指定基表的记录相关联的记录时,从该指定基表中读取与请求写入该非指定基表的记录相关联的记录,并存入该指定基表对应的第一增量集合。如此,在后文将要说明的数据查询方法中,就可以根据所述物化视图、所述第二增量集合和各指定基表分别对应的第一增量集合,进行数据查询。
下面以图4为例,进行更为详细的说明。当查询数据时,以“用户姓名=张三”为查询条件,执行以下步骤:
1、从物化视图中获取记录:
2、从物化视图对应的第二增量集合中获取记录:
3、将步骤1和步骤2获取的记录进行合并,得到各目标记录:
张三 |
1 |
书包 |
50 |
张三 |
2 |
钢笔 |
8 |
张三 |
3 |
null |
null |
4、针对每个目标记录,从指定基表对应的第一增量集合中获取与该目标记录相关联的记录。由图4可知,指定基表对应的第一增量集合中,存在与第三个目标记录相关联的记录:
5、对第三个目标记录进行更新,最终得到的查询结果为:
张三 |
1 |
书包 |
50 |
张三 |
2 |
钢笔 |
8 |
张三 |
3 |
鼠标 |
77 |
基于图1所示的数据存储方法,本说明书实施例还提供的一种更新物化视图的方法,如图5所示,包括以下步骤:
S500:当确定触发预设的物化视图更新条件时,根据预先创建的,各指定基表分别对应的第一增量集合,更新所述物化视图。
S502:清空各指定基表分别对应的第一增量集合。
在图1所示的数据存储方法中,将请求写入指定基表的记录存入指定基表对应的第一增量集合,却暂时不会根据该记录更新物化视图。
事实上,在本说明书实施例中,可以当确定触发预设的物化视图更新条件时,再根据指定基表对应的第一增量集合中积攒的若干记录,一次性地对物化视图完成更新。更新完成后,可以清空指定基表对应的第一增量集合,以便为以后的数据进行存储腾出空间。其中,触发物化视图更新条件,具体可以是经过指定周期,或指定基表对应的第一增量集合中的记录的数量达到指定数量。
具体地,可以针对所述物化视图中的每个记录,从各指定基表分别对应的第一增量集合中获取与该记录相关联的记录,作为该记录对应的增量记录,根据该记录对应的增量记录,更新该记录。
进一步地,如果请求写入非指定基表的记录也被存入物化视图对应的第二增量集合中,那么,就可以根据所述物化视图对应的第二增量集合和各指定基表分别对应的第一增量集合,更新所述物化视图。
基于图1所示的数据存储方法,本说明书实施例还对应提供了一种数据存储装置,如图6所示,物化视图的至少一个基表为指定基表,所述装置包括:
获取模块601,针对每个指定基表,获取请求写入该指定基表的记录;
存储模块602,将请求写入该指定基表的记录存入预先创建的,对应于该指定基表的第一增量集合中,以便根据所述物化视图和各指定基表分别对应的第一增量集合,进行数据查询。
所述获取模块601,获取请求从该指定基表中删除的记录;
所述存储模块602,将请求从该指定基表中删除的记录存入对应于该指定基表的第一增量集合中。
预先创建对应于该指定基表的第一增量集合,具体包括:
预先在内存中创建对应于该指定基表的第一增量集合。
所述物化视图的基表中,除所述指定基表外的其他基表为非指定基表;
所述装置还包括:处理模块603,针对每个非指定基表,获取请求写入该非指定基表的记录;将请求写入该非指定基表的记录存入预先创建的,对应于所述物化视图的第二增量集合中;针对每个指定基表,当确定该指定基表对应的第一增量集合中不存在与请求写入该非指定基表的记录相关联的记录时,从该指定基表中读取与请求写入该非指定基表的记录相关联的记录,并存入该指定基表对应的第一增量集合,以便根据所述物化视图、所述第二增量集合和各指定基表分别对应的第一增量集合,进行数据查询。
基于图3所示的数据查询方法,本说明书实施例还对应提供了一种数据查询装置,如图7所示,基于图1所示的数据存储方法,所述装置包括:
接收模块701,接收包含查询条件的数据查询请求;
确定模块702,根据所述查询条件,针对所述物化视图进行数据查询,得到符合所述查询条件的各目标记录;
获取模块703,针对每个目标记录,从预先创建的,各指定基表分别对应的第一增量集合中,获取与该目标记录相关联的记录,作为该目标记录对应的增量记录;
更新模块704,根据该目标记录对应的增量记录,更新该目标记录,并将更新后的该目标记录作为查询结果。
所述确定模块702,从所述物化视图中,读取符合所述查询条件的记录,以及从预先创建的对应于所述物化视图的第二增量集合中,获取符合所述查询条件的记录;根据从所述第二增量集合中获取的记录和从所述物化视图中读取的记录,确定符合所述查询条件的各目标记录。
基于图5所示的更新物化视图的方法,本说明书实施例还对应提供了一种更新物化视图的装置,如图8所示,基于图1所示的数据存储方法,所述装置包括:
更新模块801,当确定触发预设的物化视图更新条件时,根据预先创建的,各指定基表分别对应的第一增量集合,更新所述物化视图;
清空模块802,清空各指定基表分别对应的第一增量集合。
所述更新模块801,针对所述物化视图中的每个记录,从各指定基表分别对应的第一增量集合中获取与该记录相关联的记录,作为该记录对应的增量记录;根据该记录对应的增量记录,更新该记录。
所述更新模块801,根据所述物化视图对应的第二增量集合和各指定基表分别对应的第一增量集合,更新所述物化视图。
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现图1所示的数据存储方法、图2所示的数据查询方法以及图5所示的更新物化视图的方法。
图9示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现图1所示的数据存储方法、图2所示的数据查询方法以及图5所示的更新物化视图的方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的系统、方法、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的方法实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。