用于数据仓库的选择聚集层和交叉产品层的方法和装置的制作方法

文档序号:6454019阅读:194来源:国知局
专利名称:用于数据仓库的选择聚集层和交叉产品层的方法和装置的制作方法
发明的背景本发明涉及一种选择在数据仓库中产生的聚集(aggregates)的方法。
数据仓库通常包含关于一种商业结构的大量的数据,从中信息被检索和分析。Ralph Kimball.John Wiley & Sons公司的数据仓库工具箱ISBN 0-471-15337-0对数据库的背景进行了很好地介绍。建立一个成功的数据库的首要的步骤之一是正确地识别商业结构的不同维度(dimension)和事实(fact)集合,通常称之为维度建模。每个维度表示一个参与在事实集合而独立于来自其它维度的实体的唯一的实体的聚集。事实集合通常包括事项处理数据,其中每个事项处理(或记录)由来自每个维度一个的实体的组合识别。

图1表示了一个用于超级市场经营的星形模式,该星形模式是维度建模过程的结果。
每个维度是一个表,其中每个记录包括一个唯一地表示每个实体的码(或复合码)和限定或描述相关实体(或码)的属性(attribute)列表。在事实表中的每个事实记录应包括一个外码用于连接到每个维度和表示事项处理数据的测度(measures)列表。因为维度的大小通常比事实表小得多,维度表通常不进一步的规范化(normalized)。因此,通过规范化节约的空间并不显著。并且,OLAP(联机分析处理)查询工具在查询运行期间连接规范化了的维度并不节省时间。
理论上,在上述的星形模式的结构中,OLAP工具可以直接查询包含事项处理数据的数据仓库。但是,为了达到高级查询的快速响应时间,例如,获得一种特定品牌的产品在每个州的月销售量的查询,必须要求数据仓库数据的预聚集。
数据预聚集是重要的,因为它促进了OLAP工具在普通请求的查询(问题)方面的快速查询响应时间。因此,能够定义在数据库中产生的正确的聚集集甚至更为重要。但是,OLAP工具可能不会从预计算的聚集中获益。
为了聚集的目的,每个维度定义有数据层。根据条件每层定义了一组维度登录项(entry)。例如,在商店维度中,对不同的州定义有一个层,因此对每个州层将包含一个聚集维度记录,其中每个聚集记录表示至少一个商店。换句话说,一个特定的州的聚集维度表示在这个州的所有商店的聚集。同样,我们可以在商店维度中定义另一个城市层以便允许建立聚集维度记录,其中每个登录项表示一个特定的城市中所有商店的聚集。层也称为聚集层。
因此,每个层确定在该特定层中产生的聚集组。与每层相关的规则或条件用于识别具体维度记录和聚集维度记录之间的包含关系。条件还将各种分组的具体层维度记录确定成不同的聚集。
每个聚集维度记录包括一个替换(或合成)码,因为在输入维度表中它的维度记录原先没有被提供。码用于将聚集维度记录同输出事实表中产生的聚集相结合。在多数情况下,也产生替换码以用于输入维度记录以便聚集和输入维度记录两者有同样的格式。在此,所有的事实聚集记录也可以有一种格式,因为它们可以连接到的每个维度聚集中或具有相同类型码的输入层记录中。
对于一个聚集维度记录,不是所有的属性是有效或有意义的。在某些情况下,某些属性值被删除。例如,在商店维度中,州层中的聚集维度记录将使它的街道地址和城市属性删除,因为这些属性描述单个的商店。删除的属性可以填为无效值或用户定义的缺省值。
在输出事实数据中需要的聚集由要聚集的,来自每个维度一个的层的组合来定义。用于定义聚集的层的组合还称为层的交叉产品,以上述的星形模式中的查询某州某品牌的产品月销量为例,相关的层需要在每个维度中定义,同时根据三个特定的层的交叉产品,事项处理数据的聚集需要被要求。用户可以定义一个它们需要聚集的交叉产品的列表。输入层(或具体)的交叉产品表示输入或具体(detan)事实数据。
通常在具有一个包括所有的维度记录的单个成员的维度中定义一个“维度”层。使用在交叉产品中的这个层可以有效地从交叉产品删除该维度。例如,如果在上述的交叉产品的产品维度中定义维度层,就可以产生州的月查询。
在此文件中所介绍的技术涉及在维度中定义层。
今天,许多OLAP工具允许用户定义简单的聚集层。这些层通常建立在表的一个或多个列(column)的不同的值的基础上。此技术满足了大多数重复和单一的OLAP查询的需要。但是,通过列的组合和或使用多重选择标准的更先进的查询可以从更高级的预产生的聚集获益。在某些情况下,这些更高级的查询是规范(norm)。
以前的由当前的代理人建立的产品提供了在具体维度记录和聚集维度记录间进行识别包含关系和进行事实数据聚集的咨询服务。用于识别聚集维度记录的层规则严格地以不同的属性值为基础。每个层规则可以有零或多个规则项。如果在层规则中没有定义规则项,就意味着所有的维度记录可以无条件地聚集成聚集记录。每个规则项表示一个不同的维度属性并且规则项既可以是有条件的也可以是无条件的。
无条件的规则项仅包括来自相关维度的一个属性。例如,商店维度可以有一个州属性的无条件规则项的层。意味着将对每个输入维度的州属性的不同值产生一个聚集维度记录。
有条件的规则项包括一个属性,一个相等或不等的运算符和一个值。例如,如果有条件规则项商店维度为“州等于TX(德克萨斯)”,于是有州等于TX维度记录,就产生一个聚集维度。如果有条件规则项是“州不等于TX”,于是除了TX每个州属性的不同(distinct)值产生一个聚集维度记录。
多规则项的层规则对于规则项聚集的每个不同的组合属性值产生一个聚集维度记录。定义的多规则项考虑了在属性或层的实际分层顺序未知时识别分层层。例如,层规则可以有两个无条件的规则项一个用于州属性,另一个用于城市属性。如果两个城市有相同的名称,但是却来自不同的州,它们将适当地产生两个不同的聚集记录。另一方面,如果层规则只有一个城市属性的无条件规则项,则两个城市的事实数据将错误地聚集为一个记录。
另一个提供聚集的产品是微软的SQL Server 7.0 Beta OLAP服务器,代号为Plato。每层与一维属性关联。但是,所有的层按分层的顺序定义,所以当前的和所有的更高的层的每个特殊属性值组合产生一个聚集记录。因此,它类似于上述的当前代理人的以前产品的无条件的层规则。
OLAP和聚集产品需要一个识别聚集层的精确和灵活的方法。通常的运算是根据在维度表的一个或多个列中提供的不同值识别层。每个唯一的层列的组合表示在此层的一个聚集。例如,层列的城市和州可以是休斯顿和德克萨斯州唯一的组合,其表示在城市聚集层的一个聚集。
由于以下一些原因,通常在实践中不太灵活需要的功能有能够定义可以限制产生的聚集的层以便不产生所有的组合。重要的是控制数据仓库的增长,并产生不太有用的聚集或不包含过多的昂贵又浪费空间的数据的聚集。例如,如果在德克萨斯州的奥斯汀只有一个商店,用户应该能够防止奥斯汀的聚集记录被增加到维度中。以此方式,用户可以调整到真正需要加速OLAP分析的聚集。先前的产品在一定程度上提供了选择的功能,但是它们用起来很麻烦。
需要的功能有能够定义不是容易地从维度属性导出的层。例如,给定的州、城市和人口属性,我们可以需要州的小城镇的聚集。虽然可以容易地建立包括城市、州和人口<50000的层(容易假设你有基于表达式的层识别),这产生单个的聚集维度记录,如那瓦沙达、德克萨斯、23450和巴黎、德克萨斯、34982。没有迅速的方法以获得州的所有的人口<50000的城市的单个聚集。这意味着OLAP工具将采取查询更多的行的手段。
需要的功能还有要能够给层分组以便层的交叉产品(早先介绍的)可以较容易而方便地定义。如果你有三个维度,每个维度仅有十个层,所有的组合导致层的交叉产品有1000个登录项长。
要求的功能还有定义属性不充分的层。例如,如果具有男性人口、女性人口、男性平均年龄和女性平均年龄的属性,但是条件要求“平均年齿>50”,“平均年龄”属性不能直接用于建立这个层,即使理论上有充足的信息建立此层。一些产品通过提供“导出的属性(derived attributes)”解决这个问题,“导出的属性”不能在维度表上持久地保持,但是为聚集的目的而产生。在某些情况下,这可以工作得很好,但是会在系统中造成超时间跟踪属性的问题。例如,在维度表中表示层单元的复合码经常持久地存储在维度表中。与某属性关联的复合码从不改变,在不同时间产生的聚集会有相同的码值。聚集维持相同码的事实会非常有用。但是,如果使用在聚集之间本来不持久的导出的属性,在不同时间产生的聚集将不可避免地有不同的码用于不同的属性值。由于这个原因,许多结构避免使用导出的属性,因此维持不变的合成码,但仍经常需要此导出的属性提供的优点。
本发明概述本发明一方面提供了基于表达式的层识别,允许更简单和功能更强大的层选择。为每个属性提供每层规则的表达式限制贡献于层的属性的值,而不是通过在相关的维度中简单地定义属性来定义层。
本发明另一个方面提供了子层,子层被根据与它们的父层相同的属性值分组。但是根据能够包括任何或所有的列的组合属性的规则而缩小参与此层的具体登录项的规则。这不同于现有的分组层的概念,而可以根据使用两个或多个列的层规则而定义分组层,但现有的分组层的概念不允许不同的列的值被组合。因此,子层概念允许不能满足一个单独的层规则的附加的层。例如,通过使用子层选择标准,可以根据其它的属性,诸如女性平均年龄、男性平均年龄、女性人口和男性人口,采用其它的值计算平均年龄,并用此作为聚集记录产生的基础。当“南部”属性不具备时,一个简单的例子可以用来计算南部的州的聚集。可以采用一个子层检测是否州在南部州的列表中。
子层可以起到象父层的哪里(where)条件一样的作用以支持这个功能。采用子层,州层可以被定义,同时在子层可以增加人口<50000的条件。这会产生聚集维度记录如德克萨斯、<无效(null)>,对“州的所有的小城镇”子层为<无效>。OLAP的用户可以查询此层并比较结果。
本发明还有一个方面提供了层组,其相当大地简化了定义需要产生的层的交叉产品的层。层组允许整个组在交叉产品的单一登录项的说明。这使交叉产品容易维持。
附图的简要说明如下参见附图介绍本发明的特别实施例,其中图1表示了可以采用本发明处理的一个简单超级市场经营的星形模式的例子。
图2A&2B表示本发明的第一个实施例的第一个例子的层成员映射表的维度表和具体码。
图3A&3B表示本发明的第二个实施例的第二个例子的层成员映射表的维度表和具体码。
本发明的详细说明传统的层由层规则识别,层规则是列的列表,列的值定义了该层中的聚集记录,如图1所示的商店维度,城市层和州层定义如下城市层规则=城市,州州层规则=州定义的每个列是一个规则项。(注意采用此传统技术的产品使用不同的术语,但事实上方法是相同的。)城市层规则表示对于每个城市和州的唯一组合,城市层包含一个聚集维度。州层规则表示对每个唯一的州,州层包含一个聚集维度记录。
规则项表示一个并只有一个属性列。层规则中的每个规则项必须从余下的层规则中引用不同的列。通过使用多规则项,可以建立分层层。对于使“所有的总和”采用一个单一的层,层规则将有零规则项。
自动产生聚集维度记录的产品通过提取具体维度数据的层规则定义的唯一组合进行此运算。
这些产品大多数有删除不完全的或空的数据的方法。例如,如果州字段是空的,通常“空白”州聚集是不要求的。
本发明通过详细具体地表述每个规则项增强了传统的层规则的概念。如果属性符合条件,每个表达式判断为真,否则为假。每个规则项必须引用一个并只有一个列,并且每个规则项必须引用一个不同的列。
重要的是要注意规则项的表达式不改变属性,但是它们限制维度中的数据组合具有聚集记录。例如,当州的第一个字母为“T”时,规则项可以判断为真。在此情况下,建立“德克萨斯”的聚集记录而不是“密西根”。如果大多数的数据涉及“德克萨斯”,就可以防止数据被不必要的聚集。
规则项表达式的特别实现采用逆波兰表示法(reverse-polish notation)简单表达式语言。此语言包括数学运算、字符串运算、数据运算、列引用、登记变量和其他属性。此语言是适合的,因为它可以有效直接地执行,容易被用户接口分析;不给用户显示任何表达式语言就可以进入大多数的典型情况。但是,特殊的表达式语言语法对实现并不很重要。其它合适的语言可以是JavaScript、BASIC、Perl、Java或其它。主要的要求是语言必须具有访问列变量的手段(或者有将它增加到该语言的手段)。
虽然逆波兰表示法语言在内部应用,为了清楚说明,所述的例子可以采用标准数学类型插入表达式。
在实现中,虽然采用表达式可以产生无穷多的各种测试,但层规则项只有四个普通分类1)相等(Equal),不等(not equal),大于(greater than)、小于(less than),大于或等于、小于或等于这些比较运算符每个包括两个运算数一个属性列表达式和一个值表达式。列表达式必须引用一个属性列。值表达式必须判断与属性列表达式相同数据类型的常数值。比较运算符基本确定是否条件为真。2)空(Empty)、非空(not empty)这些运算符要求引用一个属性列和一个可选择的空值作为它们的运算数。用户可以定义一个把属性列视为空的值。例如,“N/A”值表示重量属性列在产品维度中为空。如果参考属性列中没有定义为空值,无效值被认为是属性的空值。这两个运算测试具体记录属性是否满足空或非空的条件。3)存在(Exists),不存在(not exists)这些运算符基本上与“空”和“非空”相同,除了它们还利用一个称为“聚集空值”的程序设置。程序设置规定应该为通常认为是空的值建立聚集记录。“存在”运算符与传统的层规则项完全等价。4)包括列表(Include list),排除列表(exclude list)
这些运算符要求两个运算数一个属性列表达式和一个值表达式列表。给定的具体记录,它们确定是否属性列表达式的结果值分别在或不在值列表中。对“包括列表”,具有判断为在列表中的一个值的属性的所有具体记录满足条件,对“排除列表”具有不能判断为在列表中的任何值的属性的所有具体记录满足条件。
当然,规则项的隐含类型不局限于上述列表中,但是列表定义了更普通的需要。规则项也可具有组合测试。规则项可以同逻辑运算符如与、或、非组合。采用表达式语言使规则项非常灵活,如一些例子所示规则项=年龄组>30和年龄组<=90规则项=非(年龄组>30和年龄组<=90)规则项=品牌="品牌名称"或品牌="另外的品牌名称"(可以用包括列表达到相同的结果)规则项=word_cap(品牌)在("品牌名称","另外的品牌名称")中当产生聚集记录列表时,扫描具体维度记录看是否它们出现在层里。出现在层里意味着具体记录的属性符合层规则的要求;其含义是给定的具体记录识别必须“求和”的事实数据以获得此层的聚集维度记录识别的聚集。
如果具体维度记录符合层规则的所有规则项的条件,就认为它有资格进入层中。可以给每个在层中使用的属性的属性值的不同的组合产生一个聚集维度记录。注意聚集记录的产生是根据特殊原始属性值而不是规则项的属性表达式。例如,如果规则项是“Age div 10=2”,属性表达式的结果“Age div 10”对于年龄属性值范围20到29而言总是2。有10个不同的属性值。如果此规则项是层规则的唯一项,将产生10个不同的聚集维度记录(从20到29的值中的一个值)。
基于表达式的层识别提供了一个以简单的方式产生聚集的优秀灵活的限制方法。
子层(sublevel)表示了在层上放置附加的规定的方法。子层允许不能在单独的层规则达到的附加的运算。每个聚集层可以有任意多个子层。子层通过限制哪些具体记录实际上加入子层,起到一个哪里条件的作用。
每个子层可以产生零个或多个维度聚集记录,直到父层产生的记录的数目(子层总是受限于父层)。对于来自父层的每个唯一的维度聚集记录,根据是否符合子层条件,子层将产生零或一维聚集记录。
每个子层规则包括一个布尔表达式(即,该表达式必须判断真或假的值)。布尔表达式必须引用一个或多个属性列。在本实施例的执行中,表达式可以利用任何语言支持运算。子层规则表达式还过滤加入聚集层规则产生的每个聚集记录的具体记录。
此外,子层还提供给用户选择以产生另外要求的维度中的附加的属性列。下述的例子说明了不能被单独的聚集层规则代替的子层的灵活性和功能性。例1.图2A和2B表示此例子。图2A表示一个产品维度表,图2B表示在该维度中的层定义。产品维度具有以下属性;UPC(通用产品编码)、产品名称、价格、类别、品牌和制造商。
层规则品牌存在、制造商存在。
子层规则价格>10.00和类别=“食品”在上述的层规则中,为每个品牌和制造商属性的不同组合产生一个聚集维度记录(记录8-11)。子层规则应用到包含层规则以产生附加的聚集记录(记录12-13)。当且仅当在聚集记录中存在至少一个具体记录并且类别为食品价格大于10美元时,就对品牌和制造商属性值产生一个聚集记录。因此,子层可以产生比封闭的聚集层更少的聚集记录。在此情况下,只有与四个层记录比较的两个子层记录。子层的每个聚集记录表示一特定的品牌和制造商的大于10美元的所有食品项的聚集。(注意为了使子层的聚集记录为唯一的聚集结果,在层的交叉产品中不选择父聚集层。)注意上述的子层条件不能由层规则单独表示,因为对每个在层规则中采用的属性的每个不同组合产生一个聚集记录。因此,如果在层规则中加入条件,对于所有的相同价格相同品牌和制造商的食品项产生一个聚集记录。在层规则中用的分组技术不足以定义一个如子层规则的哪里(where)条件。
此外,当聚集产生期间不应用子层规则时(即,哪里条件),子层规则产生的聚集不能从由层规则单独产生的聚集集中得出。层规则产生的聚集将不包括任何的价格或类别信息。这些属性被抑制因为它们正被聚集到更高的品牌和制造商层中。因此,它将不能发现在聚集中的哪个具体记录的价格大于10美元或属于商品类,除非OLAP工具也分析具体记录,。这将使产生聚集的全部目的失败。
另一个解决方法涉及具有一个层规则,如品牌存在、制造商存在、价格存在、类别=“食品”。在此情况下,对每个类别为“食品”的品牌、制造商和价格的特殊组合产生一个聚集记录。OLAP工具于是将“价格>10.00”的哪里条件应用到产生的聚集上并进一步聚集价格>10.00的记录。但是,这不会从预聚集获益,因为很可能每个产品有不同的价格。在此情况下,产生的聚集的数目几乎与具体记录的数目相同。
子层允许在聚集阶段哪里(WHERE)条件的应用,其会极大地有利于OLAP查询工具,尤其是当哪里条件是用户组的普通过滤条件时。例如,对在不同的年龄组的雇员产生聚集,对一特定的价格范围的所有的产品产生聚集等等。例2图3A和3B表示了此例子。雇员维度提供了如下属性SSN(规格序号)、姓名、性别、地址和电话号码。
层规则子层1规则子字符串(1,3,电话号码)=“281”子层2规则子字符串(1,3,电话号码)=“213”子层3规则子字符串(1,3,电话号码)=“713”在此例子中,层规则没有规则项,这意味着来自维度的所有具体记录可以聚集到一个聚集记录中(如图所示3B,此情况为聚集记录8)。因此,只产生一个聚集记录。这个层规则包括三个子层规则。每个子层规则同一特定的值比较电话号码开始的三位数字(即,区号)。基本上,第一个子层规则为所有的区号=“281”的具体记录建立了一个聚集记录。同样,第二和第三子层规则为所有的区号分别为“213”和“713”的具体记录建立聚集记录(记录10,11)。
而且,仅采用层规则不能实现这些聚集。采用层规则中的子层规则条件会错误地对每个确定区号的不同电话号码产生聚集。
采用上述的子层规则,假设用户可以列出所有的区号,每个子层一个,用户实际上可以对每个区号建立一个聚集记录。从长远考虑,用户可能还希望在维度中建立一个分离的区号属性以便他们可以将层规则应用到属性上。这将避免对每个新增的区号必须手工建立一个子层。但是,子层确实可以迅速地解决不具有附加的属性的问题。
在另一个实施例中,在处理中为聚集的目的可以定义导出的属性,其不随着实际维度表存储到输入事实数据。在图3A和3B中的虚线表示了导出的属性。例如,可以通过数据的属性列函数定义属性,这导出的属性可以为了聚集的目的起到与聚集一样的作用,可以采用同样的方法在层规则和子层规则中引用。例如,称为电话号码前缀的导出属性可以用属性定义函数子字符串(1,3,电话号码)定义。通过包括此属性的层规则(在此例中指前缀层规则),数据可以直接聚集到电话号码前缀。实际上,采用导出的属性不方便,通常属性随时间存储在主文件中以便它们连接从不变化的特定的复合码。因此,增加的属性要求重新处理许多旧数据。为了简化处理,本较佳实施例没有提供属性,此实施例是在本发明范围内的。
子层也证明在其它类似的情况下是有用的。如果用户想为三个最大的客户建立一个聚集,用户可以为所有的客户建立一个聚集并用一个子层规则列出三个最大的客户。这允许用户在没有为了此目的建立一个新属性的情况下将所有的三个客户的聚集看作为一个。它还允许“前三个”客户随时间变化而仍然维持相同的聚集维度记录(这使得趋向于更容易分析)。
一旦为所有的维度定义了层规则和子层规则,聚集层可用于层的交叉产品。层的交叉产品允许用户定义哪个交叉维度的聚集需要被增加到数据库中。
层交叉产品仅为登录项的列表,每个登录项有每维度的层。对于早先介绍的商店、产品和时期维度,层的交叉产品可能看上去如商店x产品x天(具体或输入数据)商店x所有_产品x月所有_商店x产品x月所有_商店x所有_产品x月商店x所有_产品x季度所有_商店x产品x季度所有_商店x所有产品x季度这一列表虽短,但实际上它可以增加到很长。如果用户对于三个维度每个维度仅定义十个层,当需要所有的组合时,列表的长度可以增加到1000个登录项长。
为解决此问题,发明还提供了层组(Level group)。一个层组是一个维度的层的列表,可以作为层的交叉产品的一个登录项。软件自动扩展层组表示的所有组合。通过定义包括“月”和“季度”的层组“时期组”,上述的列表可以缩短为商店x产品x天(具体或输入数据)
商店x所有_产品x时期_组所有_商店x产品x时期_组所有_商店x所有_产品x时期_组缩短的列表的含义与先前的列表相同。此技术具有使它更容易维持交叉产品的主要效果,因为用户可以将层分组为单个的实体。在此例子中,用户一直想按月和季度聚集;使用层组仅需要增加一个登录项以表示所有的需要的时期聚集。
层组可以包括聚集层、具体层和子层。注意上述的层交叉产品可以表示成百甚至上千的实际聚集记录,因为每层有许多与它结合的聚集记录。
层组还可以被定义成覆盖多于一个维度,并可以扩展到包括在每个维度中的层/子层的交叉产品。但是,这样的一个层组实际上只是在所涉及的每个维度中写出层组的简化方式,因此不会缩减产生交叉产品列表的交叉产品定义的数目。提供这样的选项会使界面更复杂(由于每个登录项不对应于单一维度),因此它的实现不被认为是有利的。
接下来是对实现基于表达式层识别、子层和层组的系统元件的说明。在被称为维度处理的处理过程中描述了层识别和子层,在此期间输入维度记录(表示事项处理)被处理,层规则被应用到每个记录。处理的结果是维度聚集记录的导出表,具体和聚集记录间的包含关系(即具体记录必须被结合以计算由聚集记录表示的聚集)。此信息在事实处理过程中被使用(在此时读取事实记录)从而实际上根据用户定义的层交叉产品产生聚集。
根据扩展的层交叉产品描述层组以获得完全的用于计算的交叉产品的列表。
维度处理必须对星形模式的每个维度执行,有如下的输入要求1)输入维度记录的列表对每个维度有一个维度记录列表。每个维度记录包括一系列的主码和属性列表。下述图表显示维度记录的逻辑图。
码字段包括每个维度记录的主码。一些维度可以仅有一个码字段,而其它需要将多字段结合从而唯一地识别一个记录。属性l到属性a表示一个记录的属性值。这些属性限定码的值并描述每个维度记录的特性。2)维度记录定义相关的输入维度记录列表的是维度记录定义。它定义每个码的位置和属性字段。它还定义每个字段的名称和数据类型。这些对于分析和解析层和子层规则是需要的。字段名称被用于规则中以表示相关的字段值。数据类型被要求检查是否不同的字段定义的运算是有效的(例如,算法运算不能在字符类型的字段执行。)3)层和子层规则有一系列与维度的相关的层和子层规则。这些规则根据1.2节的说明被定义。用户必须调查要产生的聚集集合,然后为了产生这些聚集定义在每个维度中要求的层或子层。
4)层的交叉产品用户定义聚集计算处理(称为事实处理)使用的层交叉产品以确定建立哪种聚集。此交叉产品将包括对层组的引用,层组需要在事实处理之前(或期间)被扩展。
为了本文件的目的,下述的简单对象被假定为存在的(或可以容易地开发)。假定读者有丰富的C++编程经验,熟悉这些对象的实现和目的。
1)标准模板库(Standard Template Library)在本实施例中的许多组件对于容器(container)对象利用标准模板库,现在有部分C++语言标准。模板向量类被用于执行简单对象数组。
2)字符串(string)简单字符串类(采用适当运算方法)被用于支持规则项表达式和其它文本。
3)值(Value)值对象是可以包含各种不同数据类型的值的对象。在数据库系统中,典型的值为字符串、数字、日期或二进制大对象(BLOB)这一简单类可以包括所有的相关类型并“知道”它当前所包含的对象类型。这个类通过允许我们利用一个表示在数据库系统中的各种数据类型的简单的对象而简化开发。值类的方法包括A)bool IsNull()-表示是否设置无效值。B)void SetNull()-将值设为无效C)DateType GetDateType()-返回当前值的数据类型D)void SetValue(datetype v)-赋值。对每个支持的数据类型有一个赋值方法(datetype表示任一支持的数据类型)E)void GetValue(datetype&v)-返回值。对每个支持的数据类型有一个返回值的方法(datetype表示任一支持的数据类型)。如果当前值为不同的数据类型并且不能转换为要求的类型,就作为例外而删除。
4)记录(Record)记录只是值对象的向量。此类表示从输入维度表中读取的记录。通过采用值对象表示每个相关的列中的值,不必要考虑不同的数据类型。记录类的方法包括●int FieldCount()-返回在记录中的字段(或列)的数目。●void GetValue(int i,Value&v)-返回给定的索引i的值。●void SetValue(int i,const Value&v)-为给定的索引赋值。●void Reset(int n)-清除全部记录,对n字段确定空间。
5)ColumnDefColumnDef是列定义。ColumnDef最重要的属性是列的名称和它的数据类型,但是ColumnDef还包括关于如何从它的表中读取列的信息。信息是特别执行的。方法包括●DataType GetDataType()-返回列的数据类型●void GetName(String&name)-获得列的名称6)RecordDefRecordDef是记录定义。它主要是ColumeDef对象的向量,但是还包括其的关于如何读取表的特别执行的方法。方法包括●int ColumnCount()-返回列的数目●void ResetColumns()-清除所有的列●void RemoveColumn(inti)-册除索引i的列●void SwapColumn(int i,int j)-交换索引i和j的列●ColumnDef*GetColumn(int i)-获得索引i的列定义。●Void AddColumn(ColumnDef*pColDef)-增加列定义。对象还有索引过载运算符以使它更容易地访问数据库。
7)RecordProviderRecordProvider是给维度处理提供记录的抽象对象。它可以是一个读取平面文件、网络端口或SQL查询结果的对象。为了我们的目的,在此RecordProvider的具体内容并不重要,但是下面的方法(或等价)是有用的●void Open(const RecordDef&recDef)-对给定的记录定义打开提供器。●bool ReadRecord(Record&record)-读取记录,当没有更多的记录时返回真。●bool IsAtEnd()-当没有更多的记录时返回真。●void Close()-关闭提供器。
8)RecordCollectorRecordCollector是知道如何处理具体处理结果的抽象对象。RecordCollector接收表示聚集维度记录和具体维度记录的记录。在本较佳实施例中,系统在大数据文件中保存产生的聚集记录和原始具体记录。记录的特别利用是特别实现;文件描述如何通过层规则识别聚集记录。RecordCollector有如下方法(或等价)●void WriteAggregate(Const Record&detail,const Record&aggregate,constLevel&aggrLevel)此方法接收对给定的具体记录产生的聚集记录。对相同的具体或聚集记录,它可以被调用多次。(注意层类型在本文件中稍后被定义一它是用于聚集层的对象。)RecordCollector概念上可以接收两个事物。首先,它接收对维度产生的所有的聚集记录。第二,它接收具体记录和聚集记录间的关系。(通过观察方法参数,可以看到给定的具体(detail)是产生的聚集的一部分。)由RecordCollector知道如何处理此信息。那些具体是特别实现的。
在本较佳软件的执行中,层具有分配给它们的整型代码,所有的具体和聚集维度记录被分配给代替的(或合成)整型码。具体和聚集的关系被写入包含有聚集层代码、具体合成码和聚集合成码的记录的数据文件,在事实处理过程中采用数据文件确定具体必须组合哪个聚集。此外,所有的具体和聚集维度记录在数据文件中保存。关键是本实施例中的特定的RecordCollector是如何工作的,它允许事实处理在稍后完成因为在维度处理完成后存储所有的相关数据。
定义输入要求和假定对象的目的是描述基于表达式的层识别、子层和层组运算的结构;上述的全部结构是执行聚集的典型系统。记录被从RecordCollector中读取,根据层规则和具体数据,聚集记录被“发现”,通过RecordCollector聚集维度记录和它们与具体记录的关系被存储。在对所有的维度执行本运算后,在层交叉产品中的层组扩展以准备事实处理。
本发明的此特定实施例利用的对象如下1)表达式(Expression)Expression对象编译和执行表达式。在建立一个表达式时通过一个RecordDef,你可以通知它应该有哪些列。●Expression(const RecordDef&recordDef)-建立表达式的构造器。记录定义存储在表达式中;那些列可以用于此对象编译的表达式文本。●void Compile(const String&exprText)-将给定的文本编译为内部执行的格式。●bool IscolumnReferenced(int i)-如果记录定义中的索引i的列被表达式引用返回true。●iht GetFirstColumnRef()-获得此表达式引用的第一列的记录定义的索引。●int GetColumnRefCount()-获取本表达式引用的特殊列的数目。(如果系统的列被引用多于一次,它仅计一次。)●void SetAggrEmptyValues(intindex,bool yesNo)-如本文件中早先所述,它对每个列控制exists和not exists运算符是如何工作的。如果Yesno对一个列设置为true,对空列存在就返回真。●void Execute(Value&result,const Record*detaillRecord,constRecord*emptyReeord)-执行表达式,将结果放入result。detailrecord包括当前具体记录的列的值。emptyrecord包括表示空字段(象“N/A”)的值。
2)LeveRuleDefLevelRuleDef维持规则项表达式列表。●const BaseLevelDef*GetLevel()-返回指针给含有本层规则定义的层。●void Reset()-将所有的规则项复位。●int GetNumRuleItem()-返回规则项的数目。●const String&GetRuleItem(int i)-在索引i返回规则项文本。●void InsertItem(const String&rule,int i=-1)-在索引i插入给定的规则项,或者如果i没有被定义,就在末端插入。●void SetItem(const String&rule,inti=0)-在索引i设置规则项文本,其默认值为0。●void DeleteItem(int i)-在索引i删除规则项。
3)BaseGroupLevelDefBaseGroupLevelDef是所有的层定义的包括组的基本类。它包括识别层类的方法。●boolIsAggrLevel()-如果层定义对应聚集层就返回真。●boolIsSubLevel()-如果层定义对应一个子层就返回真。●boolIsGroup()-如果层定义对应层组就返回真。
4)BaseL evelDef:BaseGroupL evelDefBaseLevelDef是具有规则项、名称和编码的层定义的基类。●const String&GetLevelName()-返回层名称。●void SetLevelName(const String&name)-设置层名称。●int GetLevelCode()-返回层代码。●void SetLevelCode(int code)-设置层代码●const LevelRuleDef*GetLevelRule-返回指针给层定义的层规则。返回值是只读的。LevelRuleDef*GetLevelRule()-返回指针给层定义的层规则。返回的对象用于给层定义增加层规则项。
5)LevelDer:BaseLevelDefLevelDef是层的基类,其具有对聚集记录产生说明的表达式。这是本执行中的特别的属性。●const String&GetDeseRule()-返回说明规则的文本。●void SetDescRule(const String&descRule)-设置说明规则的文本。
6)AggrLevelDef:LevelDefAggrLevelDef对象表示聚集层定义并包含规则项表达式、层名称和层代码(层的整型标识符)的文本。对象还维持它的子层列表。●SubLevelDef*CreateSubLevel(eonst String&name)-用给定的名称建立子层定义。●void DeleteSubLevel(SubLevelDef*&pLevel)-从聚集层移动给定的子层,并删除它。●void DeleteSubLevel(const String&name)-从聚集层移出给定的名称的子层,并删除它。●bool ContainSubLevel(const SubLevelDef&sublevel)-当聚集层包含给定的子层就返回真。●void TransferSubLevel(SubLevelDef&sublevel,AggrLevelDef&newlevel)-将子层从此聚集移动到newlevel。●void TransferSubLevel(eonst String&subname,AggrLevelDef&newlevel)-将子层(由它的名称确定)从本聚集层移动到newlevel。●int GetNumSubLevels()-返回子层的数目。●void GetSubLevels(vector<SublevelDef*>&vSubLevels)-使所有的子层进入向量。子层可以被修改。●void GetSubLevels(vector<const SubLevelDef*>&vSublevels)-使所有的子层进入向量。子层为只读。
7)SubLevelDef:BaseLevelDefSubLevelDef是子层的定义。除了聚集层的属性之外,它知道哪个层包括它。●const LevelDef*GetRefLevel()-返回包含层的层定义。
8)GroupDef:BaseGroupLevelDefGroupDef对象维持组中的层和子层的列表。●void AddLevel(const BaseLevelDef&level)-在组中增加一个层。层自变量可以是聚集层或子层。●void AddLevels(const vector<cont LevelDef*>&plevels)-在组中增加层列表。●void AddLevels(const vector<const SubLevelDef*>&plevels)-在组中增加子层列表。●void RemoveLevel(const BaseLevelDef&rlevel)-从组中移去给定的子层。●void Reset()-从组中移去所有的层和子层。●bool ContainLevel(const BaseLevelDef&rlevel)-如果组包含给定的层返回真。●vector<const LevelDef*>GetLevels()-返回包含此组的聚集层的向量。●vector<const SubLevelDef*>GetSubLevels()-返回包含此组的子层的向量。●vector<eonst BaseLevelDef*>GetAllLvels()-返回包含此组的层和子层的向量。●vector<const LevelDef*>GetLevelByCode()-返回包含此组的层和子层的由层代码分类的向量。●boolIsEmpty()-如果组不包含任何层或子层返回真。
9)CrossProductCrossProduct对象维持层定义列表,对于交叉产品列表的一个单个登录项,每个维度一个CrossProduct对象。●void SetGroup(const GroupDef&rGrp)-在交叉产品设置一个层组。对维度删除任何先前的组。●void SetLevel(const BaselevelDef&rLevel)-在交叉产品设置一个层或子层定义。对维度删除任何先前的组。●void SetGroupAndLevels(const vector<const BaseGroupLevelDef*>&vObjs)-对交叉产品设置层、子层或组定义的列表。列表应包含每个维度的一个定义。它代替任何存在的定义。●vector<eonst BaseGroupLevelDef*>GetGroupAndLevelsByDimName()-获得由维度名称命令的层、子层或组定义的列表。●vector<const BaseGroupLevelDef*>GetGroupAndLevelsByName()-获得由层名称命令的层、子层或组定义的列表。●void RemoveGroup(const GroupDef&rGrp)-移去层或子层组定义。●void RemoveLevel(const BaseLevelDef&rLevel)-移去层或子层定义。●bool ContainGroup(const GroupDef&rGrp)-当交叉产品包含给定的组就返回真。●bool ContainLevel(const BaseLevelDef&rLvl)-当交叉产品包含给定的层或子层就返回真。●bool operator=(const CrossProduct&inprod)-当此交叉产品与给定的交叉产品相同就返回真给比较运算符。●int GetSize()-返回交叉产品的登录项的数目,其应该与维度的数目相同。●void Reset()-从交叉产品删除所有的层定义。
10)LevelLevel对象包含被需要识别和处理聚集层和子层的信息。建立了给定的聚集层定义或子层定义。对于聚集层,mpSublevelRule数据成员为无效。对于子层,mvLevelRule和mpSublevelRule的表达式全被判断。●Level(Dimension&dimension,const AggrLevelDef*pLeve()-建立给定的维度和聚集层定义的层对象的构造器。●Dimension&GetDimension()-返回此层的维度。●const Dimension&GetDimension()-返回此层维度,但是为只读。●const String&GetName()-获得此层的名称。●boolIsSubLevel()-当从子层定义建立层就返回true。●boolIsAggrLevel()-当从聚集层定义建立层就返回true。●int GetLevelCode()-返回层的整数层代码。●void MakeDescription(const Record&rec,String&desc)-用说明规则对给定的记录建立说明并在desc放置说明文本。此特点是本发明执行的所特有的。●bool MatchRecord(const Record&rec)-如果给定的输入具体记录加入层就返回真。在此方法中,通过执行规则项表达式判断层规则。对于子层,必须评价父层规则和子层规则两者。●void PopulateRecord(const Record&inputRec,Record&popRec)-给定的输入具体记录inputRec,此方法建立了包含聚集维度记录的属性的记录。如果列没有被层规则引用,列被填为无效,在此情况列是从inputRec复制的。●bool DescRuleUsesColumn(int index)-如果说明规则在索引index引用列就返回true。●bool LevelRuleUsesColumn(intindex)-如果层规则在索引index引用列就返回true。层对象的数据成员包括●Dimension&mDimension-引用支持层的维度对象。●const BaseLevelDef*mpLevel-此层的层定义的指针,其可以是AggrLevelDef或SubLevelDef。●Expression*mpDescRule-评价说明的表达式对象的指针。●vector<Expression*>mvLevelRule-此层的规则项表达式的指针vector。对聚集层,有0或多个规则项表达式,每个引用一个和仅有一个特殊列。对子层,此数据元被从父聚集层置于规则项表达式。●Expression*mpSublevelRule-评价子层规则的表达式的指针。此表达式引用一个或多个列。如果Level对象不是子层,其为无效。
11)DimensionDimension对象是对维度处理有兴趣的信息的持有器。信息包括对维度的Level对象和对维度表的记录定义。●const RecordDef*GetSourceTable()-获得源维度表的记录定义。●int GetNumSourceColumns()-获得源列的数目。。●const ColumnDef*GetSourceColumn(int i)-在给定的索引i获得源列定义。●int GetNumAggrLevels()-获得聚集层和子层的数目。●Level&GetAggrLevel(int i)-在给定的索引i获得Level对象。●const Record&GetEmptyValueRecord()-获得包含被认为是空的值(如“N/A”)的记录。Dimension对象的数据成员包括●RecordDef mSourceTableDef-对维度的记录定义。●vector<Level*>mvAggrLevels-包含聚集层和子层的向量。●Record mEmptyRecord-获得包含被认为是空的值(如“N/A”)的记录。
有专门用于维持层定义的对象的类分组。这些被系统用于建立用来测试具体记录由哪些聚集构成的实际层对象。
基于表达式的层识别和子层的核心是输入具体记录如何与层匹配。这发生在维度处理过程中。在维度处理之后层组通过扩展层交叉产品被处理。本部分介绍前述的对象如何被利用和关于它们如何工作的细节。
维度处理是一个循环,其读取所有输入具体记录,使它们与层匹配,将相关的聚集记录送到记录收集器。此过程用下面的C++类型伪码来描述<pre listing-type="program-listing"><![CDATA[∥Create and populate DimentionDimension dim;∥(population not shown)∥Create readerRecordProvider reader;∥Open readerreader.Open(dim.GetSourceTable());∥create recorder collectorRecordCollector collector,∥loop through all recordsRecord sourceRec;int n=dim.GetNumAggrLevels();while(reader.ReadRecord(sourceRec)!=true){∥loop through each levelfor(intj=0;j<n;j++){∥get the next levelLevel&amp;amp;level=dim.GetAggrLevel(j);∥Match the record against the levelif(level.MatchRecord(sourceRec)=true){ ∥Populate an aggregate record Record aggrRec;Level.PopulateRecord(sourceRec,aggrRec);∥Pass the data to the record collectorcollector.WriteAggregate(sourceRec, aggrRec, level);}} }∥Close readerreader.Close();]]></pre>在MatchRecord方法进行基于表达式的层识别和子层的工作。注意记录收集器仅在它的列表中保持唯一的聚集记录,因为WriteAggregate可以调用相同的聚集许多次。
匹配记录包括执行规则项表达式,如下面的C++类型伪码的描述<pre listing-type="program-listing"><![CDATA[bool Level∷MatchRecord(constRecord&amp;amp;rec){Value val;bool b;∥Test level rule expressions vector<Expression*>∷interator iter=mvLevelRule.begin();while(iter!=mvLevelRule.end ()){ (*inter)->Execute(val,&amp;amp;rec,&amp;amp;(rnDimension.GetEmptyValueRecord()));val. GetVAlue(b);if(b!=true) return false; iter++;}∥Test sublevel ruleif(IssubLevel()){mpsublevelRule->Execute(val,&amp;amp;rec, &amp;amp;(mdimension.GetEmptyValueRecord())); val.GetValue(b); if(b!=true) return false; }return true; }]]></pre>组合记录包括从源记录复制层规则项利用的列,如以下的C++类型的伪码所描述
<pre listing-type="program-listing"><![CDATA[void Level∷PopulateRecord(const Record&amp;amp; inputRec, Record&amp;amp;popRec){//Loop through the fieldsint sz=inputRec.FieldCount();popRec.Reset(sz);for(int i=0;i<sz;i++){if(isColumnReferenced(i))popRec[i]=inputRec[i];elsepopRec[i].SetNull();}}]]></pre>在此引用的isColumnReferenced方法执行如下<pre listing-type="program-listing"><![CDATA[bool Level∷isColumnReferenced(intindex){vector<Expression*>∷const_iterator iter=mvLevelRule.begin();while(iter!=mvLevelRule.end()){ if((*iter)->IsColumnReferenced(index))return true; iter++;}retum false;}]]></pre>它利用表达式的功能检测列是否被引用。
具体和聚集维度记录被RecordCollector所收集。正如所提到的,记录收集器负责“获知”如何处理从维度处理获得的信息。根据定义的层,记录收集器对给定的具体记录哪些聚集记录存在的信息。此外,收集器接受关于什么具体记录同哪些聚集记录“匹配”的信息。当实际上产生聚集时,在事实处理的后面步骤的过程中采用了所有的信息。
扩展层交叉产品的处理过程十分简单。无论何时遇到层组,所有的组合在一个大循环中产生。全部过程的伪码如下<pre listing-type="program-listing"><![CDATA[For each entry in the cross-product oflevels{Expand the entry into a list of entries with noGroups;For each entry in the expanded list{If the entry is uniqueAdd the entry to the target cross-product;}}]]></pre>在单一交叉产品登录项扩展层组的伪码如下<pre listing-type="program-listing"><![CDATA[Expand(SourceEntry,TargetList){//SourceEntry is the source cross-product entry,a vector of∥pointers to levels.∥TargetList is the target cross-product list,avector of∥(vectors of pointers to levels).Clear out TargetListAdd one blank entry to TargetListFor each dimentionD{Get the index I of the level for dimension D;If the level SourceEntry[I]is a group{Get the size S of TargetList;Get the number of levels N in groupSourceEntry[I];IfN is Zero {Remove all entries from TargetList;Return;}Make TargetList larger by N times;For values J from O to N-1{Get Jth level L from groupSourceEntry[I];For values K from O to S-1{ TargetList[J*S+K]=TargetList[K]; TargetList[J*S+K][I]=L; }} }Else{Get the size S of TargetList;For values K from O to S-1{ TargetList[K][I]=SourceEntry[I]; } } }]]></pre>上述过程可以用简单例子说明。假定我们有三个维度和一个交叉产品登录项象{L1,G1,G2},其中L1是一个层,G1是包含层L2和L3的组,G2是包含层L4和L5的组。(注意重面积表示增加的登录项;粗体文本表示增加的层。)在第一维度循环后,目标表包含
在第二维度后,目标表包含
在第三维度后目标表包含最后全部扩展的交叉产品表
在初始的交叉产品表的所有登录项被扩展后,它们被合并入最后目标表中(但仅保留唯一的登录项)。
在此介绍的技术的优点是提供了非常灵活和功能强大的方法为数据仓库选择聚集数据,并且还直接执行。
基于表达式的层识别通过允许用户方便和灵活地选择它们真正需要聚集的数据解决了与大型数据仓库有关的问题。
子层允许用户选择必须被导出的属性的层当聚集不在源数据中或当希望改变聚集规则时,这是有帮助的。
通过用户分组相关的层和处理基本上较短的交叉产品列表,层组使层交叉产品的选择更加简单。
有详细介绍一些本较佳表达式语言的属性和一些执行提醒。这部分列出了在本较佳表达式中允许的所有的运算。额外的运算可以被支持以扩展层或子层规则的功能。
比较运算这些运算有两个运算数。它们比较两个运算数,判断是否条件是真或假,返回得到的布尔值。用于比较的两个运算数必须是可比较的数据类型。
算法运算这些运算根据运算符采用一个或两个运算数。它们执行计算并返回得到的数值。
字符串处理运算这些运算在字符串运算数上执行各种不同的字符串处理。它们还采用其它运算数执行任务。如下是运算的列表。
目期运算这些运算执行各种不同的日期算法和日期转换。
格式化运算这些运算格式化字符串、日期时间和字符串中的数值。它们格式化基于格式化字符串的值。为了相应地格式化值,表达式系统必须懂得格式化字符串的语法。
逻辑运算支持三个常用的逻辑运算符与、或、非。它们全部采用布尔运算数,返回布尔值的结果。
常数值支持三个特殊常数值真、假和无效。布尔表达式采用真或假常数值。无效值用于表示无效列(或字段)的值。
寄存器(Registers)允许寄存器或变量的使用。每个寄存器与一个名称相关。只有分配因子可以修改寄存器内的值。寄存器可以用于保存任何类型的暂时值,可以用于任何合适的运算中。
由于在每个维度执行的运算是独立的,维度处理的多种情况可以并行执行(每个维度一个)以同时处理多个或所有的维度。
在本较佳实施例中,RPN(逆波兰表示法)表达式用于表示层和子层规则。
其它表达式语言可以方便地替换。
虽然本发明的较佳实施例被表示和介绍,显而易见,对于那些本技术领域的熟练人员在不脱离本发明的精神和附加的权利要求所限定的范围的情况下可以做一些变化和修改。
权利要求
1.一种对应于数据库中的具体数据登录项的分组定义至少一个维度的聚集层的方法,所述的维度具体登录项表示所述的维度的实体的集合,其中每个维度具体登录项包括至少一个属性字段,所述的属性对每个所述的实体是共同的,所述的定义聚集层的方法包括如下步骤在所述的维度中定义与所述的层有关的至少一个属性的一个层规则,这里所述的层至少有一个成员,每个成员对应于所述的至少一个属性的每个中的一个属性值,每个成员相关于至少一个与层成员具有相同属性值的所述维度的具体登录项;其中所述的规则中的至少一个包括根据在所述的层定义中合成的一个属性的属性值的逻辑表达式并判断是否满足所述的逻辑表达式的表示属性值的层成员存在于层中;在所述的数据库中聚集的数据可以基于在所述的层规则中合成的属性值被分组,并且可以作出如是否一个特别的数据登录项根据它是否满足与所述的层规则相关的逻辑表达式应该对对应的组有贡献的决定。
2.一种对应于数据库中的具体数据登录项的分组定义至少一个维度的聚集层的方法,所述的维度具体登录项表示所述的维度的实体的集合,其中每个维度具体登录项包括至少一个属性字段,其中存储在所述的属性字段中的值对于每个所述的实体普通的属性值,其中所述的数据库包括每一个都伴有一个所述的维度的具体登录项的事实数据,所述的对一个维度定义聚集子层的方法包括如下步骤通过定义与所述的层相关的所述的维度的至少一个属性定义一个层,这里所述的层有至少一个成员,每个成员对应所述的至少一个属性中的每个属性的一个属性值,每个成员伴随至少一个与层成员具有相同属性的所述维度的具体登录项;其中定义一个逻辑表达式,其中每个所述的维度的具体登录项能够或不能满足定义一个对所述的层有贡献的具体登录项的子集从而形成所述的子层,这里子层中的层成员是层的层成员的子集,每个所述的子层的成员与所述的层的相应层成员的具体登录项的子集相关联;所述的子层起到层的作用并且还在所述的数据库的事实数据登录项在聚集过程中贡献子层的成员中提供控制。
3.根据权利要求2中的方法,其中所述的维度中的层的每一个被一系列的规则限定,每个规则定义了所述的被分组的层上的所述的维度的一个属性。
4.根据权利要求2中的方法,其中所述的维度中的子层的每一个被至少一个限定条件的规则所定义,限定了维度的哪个具体登录项可以与子层中的层成员相关联。
5.根据权利要求4的方法,其中所述的规则根据所述的具体规则项的字段值限定了条件。
6.一种定义用于聚集包括数据库中的事实数据登录项的输入事实数据的一系列层交叉产品的方法,其中所述的数据库包括一系列的维度,每个维度表示一系列的实体并包含维度具体登录项,每个维度具体登录项表示一个所述的实体;其中每个维度具体登录项包括至少一个属性字段,其中存贮在所述的属性字段的值是一个属性的值,所述的属性对于每个所述的实体是共同的;其中通过限定结合在所述的层上的至少一个所述的维度的属性,在每个所述的维度定义所述的层;这里所述的层有至少一个成员,每个成员对应所述的至少一个属性的每一个的属性值,每个成员结合具有限定层成员的相同属性值的所述的维度的至少一个具体登录项;所述的方法包括以下步骤用一个层组表示所述的维度中的一个的至少两个所述的层;从所述的维度的每一个选择至多一个层或层组,所述的维度中至少一个是定义层组交叉产品的层组;通过对交叉产品的层组的每个层组合产生一个层交叉产品将所述的层交叉产品转换成所述的一系列层交叉产品,在所述的层组交叉产品中的所产生的每个交叉产品结合每个层组的一个层,并且结合在不包括层组的所述的交叉产品中的任何层;采用此方法,所述的数据库的用户可以产生包括维度的第一层的层交叉产品的第一集合和除了所述的第一层的替换外与所述的维度的第二层相同的层交叉产品的第二集合,没有明确地限定所述的第一和第二集合。
全文摘要
一种定义用于在具有一个或多个维度的数据存储的聚集的聚集层(图2B)、聚集子层和交叉产品层的方法(图2A)。层根据维度中的属性来定义,因此数据可以根据那些属性的值被聚集成聚集(图3A和3B)。
文档编号G06F17/30GK1310824SQ00800999
公开日2001年8月29日 申请日期2000年5月19日 优先权日1999年5月24日
发明者迈克尔·迪安·洛尔, 伊娃·曼燕·采 申请人:白金技术Ip公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1