发明内容
本发明为了克服上述现有技术存在的缺陷,提供一种能够应用于树形数据结构,在同一个数据表中关联多层节点进行储存的数据服务器及数据储存方法。
本发明提供一种按列储存的数据储存方法,所述数据储存方法应用于树形数据结构,每一层节点均为其上一层节点的子节点,所述数据储存方法包括:在同一数据表中,将每个第一层节点的节点信息与该第一层节点的所有子孙节点的节点信息按列名格式储存在同一行中,每一层所述节点的节点信息全部跟随在上一层节点的节点信息之后;所述第一层节点的节点信息的列名格式至少包括该节点的标识信息;所述第二层节点的节点信息的列名格式至少包括表示该节点为所在层节点的前缀、该节点的标识信息和对于该节点的父节点的索引号;除所述第一层和所述第二层外,其余每一层所述节点的节点信息的列名格式包括该节点所在的层节点的前缀、该节点的标识信息、该节点的父节点的标识信息和对于所述父节点的索引号。
优选地,用于储存所述第一层节点的节点信息的列数固定;用于储存其余各层所述节点的节点信息的列数动态变化。
优选地,所述索引号根据同一父节点下的子节点的数量累计增长。
根据本发明的又一方面,还提供一种数据服务器,按上述的数据储存方法储存数据。
根据本发明的又一方面,还提供一种按列储存的数据储存方法,所述数据储存方法应用于树形数据结构,包括表示访问数据的第一层节点,表示页面数据的第二层节点,表示事件数据的第三层节点,其中,第二层节点为所述第一层节点的子节点,第三层节点为所述第二层节点的子节点;在同一数据表中,将每个第一层节点的节点信息与该第一层节点的所有子孙节点的节点信息按列名格式储存在同一行中,每一层所述节点的节点信息全部跟随在上一层节点的节点信息之后;所述第一层节点的节点信息通过固定列存储,所述第一层节点的节点信息的列名格式至少包括该节点的标识信息;所述第二层节点的节点信息通过动态列存储,所述第二层节点的列名格式包括节点为所在层节点的前缀、该节点的标识信息和对于该节点的父节点的索引号;所述第三层节点的节点信息通过动态列存储,所述第三层节点的节点信息的列名格式包括节点为所在层节点的前缀、该节点的父节点的标识信息和对于所述父节点的索引号。
优选地,所述索引号根据同一父节点下的子节点的数量累计增长。
优选地,所述访问数据的节点信息包括如下信息中的一个或多个:访问时间戳;访问来源;以及用户标识信息。
优选地,所述页面数据的节点信息包括页面时间戳。
优选地,所述事件数据的节点信息包括如下信息中的一个或多个:事件类型、事件描述以及事件时间戳。
根据本发明的又一方面,还提供一种数据服务器,按上述的数据储存方法储存数据。
相比现有技术,本发明具有如下优势:
1)本发明通过将树形数据结构的不同层级节点的节点信息储存在同一数据表中,并通过列名格式的设置将不同层级的节点关联起来,来避免使用join的功能,并且在同一数据表中对数据进行删除、插入等处理效率更高;
2)通过部分层级节点的列名格式中前缀来标识,进而能在数据统计时,通过前缀就可以检索到某一个层级的所有数据;
3)第一层节点的节点信息通过固定的列数来储存,其他层节点的节点信息通过动态的列数来储存进而实现数据表可扩展性。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的实施方式;相反,提供这些实施方式使得本发明将全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。在图中相同的附图标记表示相同或类似的结构,因而将省略对它们的重复描述。
本发明提供了一种能够应用于树形数据结构,在同一个数据表中关联多层节点进行储存的数据储存方法。树形数据结构参见图1。树形数据结构包括第一层节点110、第二层节点120和第三层节点130。第二层节点120为第一层节点110的子节点。第三层节点130为第二层节点120的子节点。
在一个具体的树形数据结构储存的实施例中,例如,在对网站进行分析时,通常对网站的一个访问会触发多个页面,一个页面会触发多个事件。访问、页面和事件这三个层级形成一个树形数据结构。访问作为第一层节点就是这个树形数据结构的根,页面作为第二层节点,事件作为第三层节点。如图1所示,访问节点V1、V2为第一层节点;页面节点P1至P4为第二层节点,其中,页面节点P1和P2为访问节点V1的子节点,页面节点P3和P4为访问节点V2的子节点;事件节点E1至E6为第三层节点,其中,事件节点E1和E2为页面节点P1的子节点,事件节点E3为页面节点P2的子节点,事件节点E4为页面节点P3的子节点,事件节点E5和E6为页面节点P4的子节点。
访问节点、页面节点和事件节点各自都有一些属性去描述,处于相同层级的节点所需要描述的属性相同,因此,现有技术通常使用不同的表来储存不同层级的节点信息(也就是属性)。如图2至图4所示。
图2示出了先前使用的第一层节点,也就是访问节点的数据表,其列名包括访问节点的标识Vid、访问的时间戳Time以及执行访问的用户标识Uid等。图3示出了先前使用的第二层节点,也就是页面节点的数据表,其列名包括用于区分与同一访问节点关联的页面节点的索引号(自生长ID)、关联访问节点的标识Vid、页面节点的标识Pid以及页面的时间戳Time。其中,每个第二层节点通过关联访问节点的标识Vid来与访问节点进行关联。与同一访问节点关联的页面节点,除了可以通过页面节点的标识Pid来进行区分,还可以利用自生长ID来进行区分。例如,与访问节点V1关联的页面节点P1、P2的自生长ID分别为1、2,当与访问节点V1关联的页面节点继续增加时,自生长ID可继续累计为3、4等。图4示出了先前使用的第三层节点,也就是事件节点的数据表,其列名包括用于区分与同一页面节点关联的事件节点的索引号(自生长ID)、关联访问节点的标识Vid、关联页面节点的标识Pid、事件的时间戳Time以及事件类型Cat。
然而,利用三个各自独立的表来储存不同层级节点的节点信息,并在进行数据统计时,需要通过附加的程序来实现三张表的连接。然而使用附加的程序又非常费力耗时。
为了解决这样的缺陷,本发明提供了一种数据储存方法。以hbase数据库为例,说明本发明提供的数据储存方法,本发明适用的数据库并不以此为限。为了储存类似图1所示的树形数据结构中的节点信息,本发明的数据储存方法提供如图5所示的数据表。
在图5所示的数据表中,各层级的节点都储存在同一张表里。本发明提供的数据储存方法将每个第一层节点的节点信息与该第一层节点的所有子孙节点的节点信息按列名格式储存在同一行中,每一层节点的节点信息全部跟随在上一层节点的节点信息之后。具体而言,也就是对于一个访问节点V1,访问节点V1与访问节点V1的所有子孙节点(页面节点P1、P2及页面节点P1、P2的子节点)的节点信息都按各自的列名格式储存在同一行中。列名格式指的是该列的信息都需要按列名格式所指示信息类型来储存。例如,图5所示第一列的列名格式为Vid,则该列储存的信息类型都为访问节点的标识信息。更具体地,访问节点的标识信息Vid作为数据表的主键,当用户需要检索统计同一访问节点下的所有页面节点和事件节点的信息时,只需以访问节点的标识信息Vid来进行检索,检索后与该访问节点关联的所有节点都在一行中进行显示。
由于多个页面节点对应一个访问节点,因此多个页面节点与访问节点储存在同一行中来表示页面节点和访问节点的关联关系。而在同一行中储存了多个页面节点,多个事件节点与多个页面节点的关联关系无法通过储存在同一行中来表示,因此,事件节点的节点信息的列名格式包括该事件节点的父节点(页面节点)的标识信息。如图5所示的第8至第13列用于储存事件节点的列的列名格式都包括事件节点关联的页面节点的标识信息Pid。例如,第8至第9列第一行表示的一个事件节点,其与Pid为P1的页面节点关联;第10至第11列第一行表示的一个事件节点,其与Pid为P1的页面节点关联;第12至第13列第一行表示的一个事件节点,其与Pid为P2的页面节点关联。
为了区分不同层级的节点,第二层节点和第三层节点的节点信息的列名格式包括用于区分层级的前缀。例如,图5所示的第4至第7列用于储存页面节点的节点信息,其列名格式中都包括表示页面的前缀P。图5所示的第8至第13列用于储存事件节点的节点信息,其列名格式中都包括表示事件的前缀E。当用户需要检索某一层级的节点信息时,只需利用前缀进行检索以获取某一层级的节点信息。例如,以前缀P进行检索时,所有的页面节点的节点信息都将作为结果显示在同一张表中;以前缀E进行检索时,所有的事件节点的节点信息都将作为结果显示在同一张表中。这样通过前缀进行区分,便于数据后续的检索及统计。
进一步地,对于页面节点和事件节点的列名格式还包括索引号(自生长ID)。自生长ID用于标识具有同一个父节点的多个节点。例如,图5中,第4至第5列第一行为一个页面节点的节点信息,第6至第7列第一行为另一个页面节点的节点信息,其都与Vid为V1的访问节点关联,自生长ID分别为1和2。图5中,第8至第9列第一行为一个事件节点的节点信息,第10至第11列第一行为另一个事件节点的节点信息,其都与Pid为P1的页面节点关联,自生长ID分别为1和2。
在访问、页面及事件的具体实施例中,访问节点的节点信息包括访问的时间戳T以及执行访问的用户标识Uid等;页面节点的节点信息包括页面节点的标识Pid以及页面的时间戳T;事件节点的节点信息包括关联的页面节点的标识Pid、事件节点的类型C以及事件的时间戳T。本领域技术人员可以理解,各类节点的节点信息不限于此,还可以包括其他的节点信息(属性信息),例如访问节点还可以包括访问来源,事件节点的节点信息还可以包括事件的具体描述等。
综上,根据本发明提供的数据储存方法,在图5所示的实施例中,数据表提供的列名格式及其描述如下:
对于访问节点:
Vid(访问节点的标识);
T(访问的时间戳);
Uid(执行访问的用户标识);
对于页面节点:
P:Pid:ID(页面前缀:页面节点的标识:自生长ID);
P:T:ID(页面前缀:页面的时间戳:自生长ID);
对于事件节点:
E:T:Pid:ID(事件前缀:事件时间戳:关联的页面节点的标识:自生长ID);
E:C:Pid:ID(事件前缀:事件类型:关联的页面节点的标识:自生长ID)。
上述列名格式中的冒号“:”仅用于区分不同的信息,其也可以用“-”或空格等代替。
进一步地,在图5所示的数据表中,用于储存访问节点的节点信息的列数固定,可以通过增加数据表的行数来增加访问节点的数量。而用于储存页面节点的节点信息和事件节点的节点信息的列数动态变化,当同一访问节点下的页面节点和事件节点的数量需要增加时,储存用于页面节点的节点信息的列数和用于储存事件节点的列数也相应增加。本发明通过这样的设置,可以实现数据表中访问节点、页面节点和事件节点的扩充和增加。
又进一步地,本发明所提供的数据储存方法不仅适用于三层树形数据结构,其还适用于更多层级的树形数据结构,例如四层树形数据结构或五层树形数据结构。当应用到更多层的树形数据结构时,除所述第一层和所述第二层外,其余每一层节点的节点信息的列名格式包括该节点所在的层节点的前缀、该节点的标识信息、该节点的父节点的标识信息和对于所述父节点的索引号,以将某一层节点与其父节点关联起来,并通过其标识信息供其子节点与其关联。本领域技术人员根据本发明的构思及上述具体实施例的描述,可以实现多层级的树形数据结构的储存,在此不予赘述。
根据本发明的又一方面,还提供一种数据服务器,其配置成将储存其中的树形数据结构的数据按本发明提供的数据储存方法来储存。该数据服务器可以是服务器集群、分布式服务器或其他服务器形式。采用本发明的数据储存方法,该数据服务器的数据处理速度以及数据处理一致性将显著提高。
相比现有技术,本发明具有如下优势:
1)本发明通过将树形数据结构的不同层级节点的节点信息储存在同一数据表中,并通过列名格式的设置将不同层级的节点关联起来,来避免使用join的功能,并且在同一数据表中对数据进行删除、插入等处理效率更高;
2)通过部分层级节点的列名格式中前缀来标识,进而能在数据统计时,通过前缀就可以检索到某一个层级的所有数据;
3)第一层节点的节点信息通过固定的列数来储存,其他层节点的节点信息通过动态的列数来储存进而实现数据表可扩展性。
以上具体地示出和描述了本发明的示例性实施方式。应该理解,本发明不限于所公开的实施方式,相反,本发明意图涵盖包含在所附权利要求范围内的各种修改和等效置换。