專利名稱:用于數(shù)據(jù)倉庫的選擇聚集層和交叉產(chǎn)品層的方法和裝置的制作方法
發(fā)明的背景本發(fā)明涉及一種選擇在數(shù)據(jù)倉庫中產(chǎn)生的聚集(aggregates)的方法。
數(shù)據(jù)倉庫通常包含關(guān)于一種商業(yè)結(jié)構(gòu)的大量的數(shù)據(jù),從中信息被檢索和分析。Ralph Kimball.John Wiley & Sons公司的數(shù)據(jù)倉庫工具箱ISBN 0-471-15337-0對數(shù)據(jù)庫的背景進(jìn)行了很好地介紹。建立一個(gè)成功的數(shù)據(jù)庫的首要的步驟之一是正確地識別商業(yè)結(jié)構(gòu)的不同維度(dimension)和事實(shí)(fact)集合,通常稱之為維度建模。每個(gè)維度表示一個(gè)參與在事實(shí)集合而獨(dú)立于來自其它維度的實(shí)體的唯一的實(shí)體的聚集。事實(shí)集合通常包括事項(xiàng)處理數(shù)據(jù),其中每個(gè)事項(xiàng)處理(或記錄)由來自每個(gè)維度一個(gè)的實(shí)體的組合識別。
圖1表示了一個(gè)用于超級市場經(jīng)營的星形模式,該星形模式是維度建模過程的結(jié)果。
每個(gè)維度是一個(gè)表,其中每個(gè)記錄包括一個(gè)唯一地表示每個(gè)實(shí)體的碼(或復(fù)合碼)和限定或描述相關(guān)實(shí)體(或碼)的屬性(attribute)列表。在事實(shí)表中的每個(gè)事實(shí)記錄應(yīng)包括一個(gè)外碼用于連接到每個(gè)維度和表示事項(xiàng)處理數(shù)據(jù)的測度(measures)列表。因?yàn)榫S度的大小通常比事實(shí)表小得多,維度表通常不進(jìn)一步的規(guī)范化(normalized)。因此,通過規(guī)范化節(jié)約的空間并不顯著。并且,OLAP(聯(lián)機(jī)分析處理)查詢工具在查詢運(yùn)行期間連接規(guī)范化了的維度并不節(jié)省時(shí)間。
理論上,在上述的星形模式的結(jié)構(gòu)中,OLAP工具可以直接查詢包含事項(xiàng)處理數(shù)據(jù)的數(shù)據(jù)倉庫。但是,為了達(dá)到高級查詢的快速響應(yīng)時(shí)間,例如,獲得一種特定品牌的產(chǎn)品在每個(gè)州的月銷售量的查詢,必須要求數(shù)據(jù)倉庫數(shù)據(jù)的預(yù)聚集。
數(shù)據(jù)預(yù)聚集是重要的,因?yàn)樗龠M(jìn)了OLAP工具在普通請求的查詢(問題)方面的快速查詢響應(yīng)時(shí)間。因此,能夠定義在數(shù)據(jù)庫中產(chǎn)生的正確的聚集集甚至更為重要。但是,OLAP工具可能不會從預(yù)計(jì)算的聚集中獲益。
為了聚集的目的,每個(gè)維度定義有數(shù)據(jù)層。根據(jù)條件每層定義了一組維度登錄項(xiàng)(entry)。例如,在商店維度中,對不同的州定義有一個(gè)層,因此對每個(gè)州層將包含一個(gè)聚集維度記錄,其中每個(gè)聚集記錄表示至少一個(gè)商店。換句話說,一個(gè)特定的州的聚集維度表示在這個(gè)州的所有商店的聚集。同樣,我們可以在商店維度中定義另一個(gè)城市層以便允許建立聚集維度記錄,其中每個(gè)登錄項(xiàng)表示一個(gè)特定的城市中所有商店的聚集。層也稱為聚集層。
因此,每個(gè)層確定在該特定層中產(chǎn)生的聚集組。與每層相關(guān)的規(guī)則或條件用于識別具體維度記錄和聚集維度記錄之間的包含關(guān)系。條件還將各種分組的具體層維度記錄確定成不同的聚集。
每個(gè)聚集維度記錄包括一個(gè)替換(或合成)碼,因?yàn)樵谳斎刖S度表中它的維度記錄原先沒有被提供。碼用于將聚集維度記錄同輸出事實(shí)表中產(chǎn)生的聚集相結(jié)合。在多數(shù)情況下,也產(chǎn)生替換碼以用于輸入維度記錄以便聚集和輸入維度記錄兩者有同樣的格式。在此,所有的事實(shí)聚集記錄也可以有一種格式,因?yàn)樗鼈兛梢赃B接到的每個(gè)維度聚集中或具有相同類型碼的輸入層記錄中。
對于一個(gè)聚集維度記錄,不是所有的屬性是有效或有意義的。在某些情況下,某些屬性值被刪除。例如,在商店維度中,州層中的聚集維度記錄將使它的街道地址和城市屬性刪除,因?yàn)檫@些屬性描述單個(gè)的商店。刪除的屬性可以填為無效值或用戶定義的缺省值。
在輸出事實(shí)數(shù)據(jù)中需要的聚集由要聚集的,來自每個(gè)維度一個(gè)的層的組合來定義。用于定義聚集的層的組合還稱為層的交叉產(chǎn)品,以上述的星形模式中的查詢某州某品牌的產(chǎn)品月銷量為例,相關(guān)的層需要在每個(gè)維度中定義,同時(shí)根據(jù)三個(gè)特定的層的交叉產(chǎn)品,事項(xiàng)處理數(shù)據(jù)的聚集需要被要求。用戶可以定義一個(gè)它們需要聚集的交叉產(chǎn)品的列表。輸入層(或具體)的交叉產(chǎn)品表示輸入或具體(detan)事實(shí)數(shù)據(jù)。
通常在具有一個(gè)包括所有的維度記錄的單個(gè)成員的維度中定義一個(gè)“維度”層。使用在交叉產(chǎn)品中的這個(gè)層可以有效地從交叉產(chǎn)品刪除該維度。例如,如果在上述的交叉產(chǎn)品的產(chǎn)品維度中定義維度層,就可以產(chǎn)生州的月查詢。
在此文件中所介紹的技術(shù)涉及在維度中定義層。
今天,許多OLAP工具允許用戶定義簡單的聚集層。這些層通常建立在表的一個(gè)或多個(gè)列(column)的不同的值的基礎(chǔ)上。此技術(shù)滿足了大多數(shù)重復(fù)和單一的OLAP查詢的需要。但是,通過列的組合和或使用多重選擇標(biāo)準(zhǔn)的更先進(jìn)的查詢可以從更高級的預(yù)產(chǎn)生的聚集獲益。在某些情況下,這些更高級的查詢是規(guī)范(norm)。
以前的由當(dāng)前的代理人建立的產(chǎn)品提供了在具體維度記錄和聚集維度記錄間進(jìn)行識別包含關(guān)系和進(jìn)行事實(shí)數(shù)據(jù)聚集的咨詢服務(wù)。用于識別聚集維度記錄的層規(guī)則嚴(yán)格地以不同的屬性值為基礎(chǔ)。每個(gè)層規(guī)則可以有零或多個(gè)規(guī)則項(xiàng)。如果在層規(guī)則中沒有定義規(guī)則項(xiàng),就意味著所有的維度記錄可以無條件地聚集成聚集記錄。每個(gè)規(guī)則項(xiàng)表示一個(gè)不同的維度屬性并且規(guī)則項(xiàng)既可以是有條件的也可以是無條件的。
無條件的規(guī)則項(xiàng)僅包括來自相關(guān)維度的一個(gè)屬性。例如,商店維度可以有一個(gè)州屬性的無條件規(guī)則項(xiàng)的層。意味著將對每個(gè)輸入維度的州屬性的不同值產(chǎn)生一個(gè)聚集維度記錄。
有條件的規(guī)則項(xiàng)包括一個(gè)屬性,一個(gè)相等或不等的運(yùn)算符和一個(gè)值。例如,如果有條件規(guī)則項(xiàng)商店維度為“州等于TX(德克薩斯)”,于是有州等于TX維度記錄,就產(chǎn)生一個(gè)聚集維度。如果有條件規(guī)則項(xiàng)是“州不等于TX”,于是除了TX每個(gè)州屬性的不同(distinct)值產(chǎn)生一個(gè)聚集維度記錄。
多規(guī)則項(xiàng)的層規(guī)則對于規(guī)則項(xiàng)聚集的每個(gè)不同的組合屬性值產(chǎn)生一個(gè)聚集維度記錄。定義的多規(guī)則項(xiàng)考慮了在屬性或?qū)拥膶?shí)際分層順序未知時(shí)識別分層層。例如,層規(guī)則可以有兩個(gè)無條件的規(guī)則項(xiàng)一個(gè)用于州屬性,另一個(gè)用于城市屬性。如果兩個(gè)城市有相同的名稱,但是卻來自不同的州,它們將適當(dāng)?shù)禺a(chǎn)生兩個(gè)不同的聚集記錄。另一方面,如果層規(guī)則只有一個(gè)城市屬性的無條件規(guī)則項(xiàng),則兩個(gè)城市的事實(shí)數(shù)據(jù)將錯(cuò)誤地聚集為一個(gè)記錄。
另一個(gè)提供聚集的產(chǎn)品是微軟的SQL Server 7.0 Beta OLAP服務(wù)器,代號為Plato。每層與一維屬性關(guān)聯(lián)。但是,所有的層按分層的順序定義,所以當(dāng)前的和所有的更高的層的每個(gè)特殊屬性值組合產(chǎn)生一個(gè)聚集記錄。因此,它類似于上述的當(dāng)前代理人的以前產(chǎn)品的無條件的層規(guī)則。
OLAP和聚集產(chǎn)品需要一個(gè)識別聚集層的精確和靈活的方法。通常的運(yùn)算是根據(jù)在維度表的一個(gè)或多個(gè)列中提供的不同值識別層。每個(gè)唯一的層列的組合表示在此層的一個(gè)聚集。例如,層列的城市和州可以是休斯頓和德克薩斯州唯一的組合,其表示在城市聚集層的一個(gè)聚集。
由于以下一些原因,通常在實(shí)踐中不太靈活需要的功能有能夠定義可以限制產(chǎn)生的聚集的層以便不產(chǎn)生所有的組合。重要的是控制數(shù)據(jù)倉庫的增長,并產(chǎn)生不太有用的聚集或不包含過多的昂貴又浪費(fèi)空間的數(shù)據(jù)的聚集。例如,如果在德克薩斯州的奧斯汀只有一個(gè)商店,用戶應(yīng)該能夠防止奧斯汀的聚集記錄被增加到維度中。以此方式,用戶可以調(diào)整到真正需要加速OLAP分析的聚集。先前的產(chǎn)品在一定程度上提供了選擇的功能,但是它們用起來很麻煩。
需要的功能有能夠定義不是容易地從維度屬性導(dǎo)出的層。例如,給定的州、城市和人口屬性,我們可以需要州的小城鎮(zhèn)的聚集。雖然可以容易地建立包括城市、州和人口<50000的層(容易假設(shè)你有基于表達(dá)式的層識別),這產(chǎn)生單個(gè)的聚集維度記錄,如那瓦沙達(dá)、德克薩斯、23450和巴黎、德克薩斯、34982。沒有迅速的方法以獲得州的所有的人口<50000的城市的單個(gè)聚集。這意味著OLAP工具將采取查詢更多的行的手段。
需要的功能還有要能夠給層分組以便層的交叉產(chǎn)品(早先介紹的)可以較容易而方便地定義。如果你有三個(gè)維度,每個(gè)維度僅有十個(gè)層,所有的組合導(dǎo)致層的交叉產(chǎn)品有1000個(gè)登錄項(xiàng)長。
要求的功能還有定義屬性不充分的層。例如,如果具有男性人口、女性人口、男性平均年齡和女性平均年齡的屬性,但是條件要求“平均年齒>50”,“平均年齡”屬性不能直接用于建立這個(gè)層,即使理論上有充足的信息建立此層。一些產(chǎn)品通過提供“導(dǎo)出的屬性(derived attributes)”解決這個(gè)問題,“導(dǎo)出的屬性”不能在維度表上持久地保持,但是為聚集的目的而產(chǎn)生。在某些情況下,這可以工作得很好,但是會在系統(tǒng)中造成超時(shí)間跟蹤屬性的問題。例如,在維度表中表示層單元的復(fù)合碼經(jīng)常持久地存儲在維度表中。與某屬性關(guān)聯(lián)的復(fù)合碼從不改變,在不同時(shí)間產(chǎn)生的聚集會有相同的碼值。聚集維持相同碼的事實(shí)會非常有用。但是,如果使用在聚集之間本來不持久的導(dǎo)出的屬性,在不同時(shí)間產(chǎn)生的聚集將不可避免地有不同的碼用于不同的屬性值。由于這個(gè)原因,許多結(jié)構(gòu)避免使用導(dǎo)出的屬性,因此維持不變的合成碼,但仍經(jīng)常需要此導(dǎo)出的屬性提供的優(yōu)點(diǎn)。
本發(fā)明概述本發(fā)明一方面提供了基于表達(dá)式的層識別,允許更簡單和功能更強(qiáng)大的層選擇。為每個(gè)屬性提供每層規(guī)則的表達(dá)式限制貢獻(xiàn)于層的屬性的值,而不是通過在相關(guān)的維度中簡單地定義屬性來定義層。
本發(fā)明另一個(gè)方面提供了子層,子層被根據(jù)與它們的父層相同的屬性值分組。但是根據(jù)能夠包括任何或所有的列的組合屬性的規(guī)則而縮小參與此層的具體登錄項(xiàng)的規(guī)則。這不同于現(xiàn)有的分組層的概念,而可以根據(jù)使用兩個(gè)或多個(gè)列的層規(guī)則而定義分組層,但現(xiàn)有的分組層的概念不允許不同的列的值被組合。因此,子層概念允許不能滿足一個(gè)單獨(dú)的層規(guī)則的附加的層。例如,通過使用子層選擇標(biāo)準(zhǔn),可以根據(jù)其它的屬性,諸如女性平均年齡、男性平均年齡、女性人口和男性人口,采用其它的值計(jì)算平均年齡,并用此作為聚集記錄產(chǎn)生的基礎(chǔ)。當(dāng)“南部”屬性不具備時(shí),一個(gè)簡單的例子可以用來計(jì)算南部的州的聚集??梢圆捎靡粋€(gè)子層檢測是否州在南部州的列表中。
子層可以起到象父層的哪里(where)條件一樣的作用以支持這個(gè)功能。采用子層,州層可以被定義,同時(shí)在子層可以增加人口<50000的條件。這會產(chǎn)生聚集維度記錄如德克薩斯、<無效(null)>,對“州的所有的小城鎮(zhèn)”子層為<無效>。OLAP的用戶可以查詢此層并比較結(jié)果。
本發(fā)明還有一個(gè)方面提供了層組,其相當(dāng)大地簡化了定義需要產(chǎn)生的層的交叉產(chǎn)品的層。層組允許整個(gè)組在交叉產(chǎn)品的單一登錄項(xiàng)的說明。這使交叉產(chǎn)品容易維持。
附圖的簡要說明如下參見附圖介紹本發(fā)明的特別實(shí)施例,其中圖1表示了可以采用本發(fā)明處理的一個(gè)簡單超級市場經(jīng)營的星形模式的例子。
圖2A&2B表示本發(fā)明的第一個(gè)實(shí)施例的第一個(gè)例子的層成員映射表的維度表和具體碼。
圖3A&3B表示本發(fā)明的第二個(gè)實(shí)施例的第二個(gè)例子的層成員映射表的維度表和具體碼。
本發(fā)明的詳細(xì)說明傳統(tǒng)的層由層規(guī)則識別,層規(guī)則是列的列表,列的值定義了該層中的聚集記錄,如圖1所示的商店維度,城市層和州層定義如下城市層規(guī)則=城市,州州層規(guī)則=州定義的每個(gè)列是一個(gè)規(guī)則項(xiàng)。(注意采用此傳統(tǒng)技術(shù)的產(chǎn)品使用不同的術(shù)語,但事實(shí)上方法是相同的。)城市層規(guī)則表示對于每個(gè)城市和州的唯一組合,城市層包含一個(gè)聚集維度。州層規(guī)則表示對每個(gè)唯一的州,州層包含一個(gè)聚集維度記錄。
規(guī)則項(xiàng)表示一個(gè)并只有一個(gè)屬性列。層規(guī)則中的每個(gè)規(guī)則項(xiàng)必須從余下的層規(guī)則中引用不同的列。通過使用多規(guī)則項(xiàng),可以建立分層層。對于使“所有的總和”采用一個(gè)單一的層,層規(guī)則將有零規(guī)則項(xiàng)。
自動產(chǎn)生聚集維度記錄的產(chǎn)品通過提取具體維度數(shù)據(jù)的層規(guī)則定義的唯一組合進(jìn)行此運(yùn)算。
這些產(chǎn)品大多數(shù)有刪除不完全的或空的數(shù)據(jù)的方法。例如,如果州字段是空的,通常“空白”州聚集是不要求的。
本發(fā)明通過詳細(xì)具體地表述每個(gè)規(guī)則項(xiàng)增強(qiáng)了傳統(tǒng)的層規(guī)則的概念。如果屬性符合條件,每個(gè)表達(dá)式判斷為真,否則為假。每個(gè)規(guī)則項(xiàng)必須引用一個(gè)并只有一個(gè)列,并且每個(gè)規(guī)則項(xiàng)必須引用一個(gè)不同的列。
重要的是要注意規(guī)則項(xiàng)的表達(dá)式不改變屬性,但是它們限制維度中的數(shù)據(jù)組合具有聚集記錄。例如,當(dāng)州的第一個(gè)字母為“T”時(shí),規(guī)則項(xiàng)可以判斷為真。在此情況下,建立“德克薩斯”的聚集記錄而不是“密西根”。如果大多數(shù)的數(shù)據(jù)涉及“德克薩斯”,就可以防止數(shù)據(jù)被不必要的聚集。
規(guī)則項(xiàng)表達(dá)式的特別實(shí)現(xiàn)采用逆波蘭表示法(reverse-polish notation)簡單表達(dá)式語言。此語言包括數(shù)學(xué)運(yùn)算、字符串運(yùn)算、數(shù)據(jù)運(yùn)算、列引用、登記變量和其他屬性。此語言是適合的,因?yàn)樗梢杂行е苯拥貓?zhí)行,容易被用戶接口分析;不給用戶顯示任何表達(dá)式語言就可以進(jìn)入大多數(shù)的典型情況。但是,特殊的表達(dá)式語言語法對實(shí)現(xiàn)并不很重要。其它合適的語言可以是JavaScript、BASIC、Perl、Java或其它。主要的要求是語言必須具有訪問列變量的手段(或者有將它增加到該語言的手段)。
雖然逆波蘭表示法語言在內(nèi)部應(yīng)用,為了清楚說明,所述的例子可以采用標(biāo)準(zhǔn)數(shù)學(xué)類型插入表達(dá)式。
在實(shí)現(xiàn)中,雖然采用表達(dá)式可以產(chǎn)生無窮多的各種測試,但層規(guī)則項(xiàng)只有四個(gè)普通分類1)相等(Equal),不等(not equal),大于(greater than)、小于(less than),大于或等于、小于或等于這些比較運(yùn)算符每個(gè)包括兩個(gè)運(yùn)算數(shù)一個(gè)屬性列表達(dá)式和一個(gè)值表達(dá)式。列表達(dá)式必須引用一個(gè)屬性列。值表達(dá)式必須判斷與屬性列表達(dá)式相同數(shù)據(jù)類型的常數(shù)值。比較運(yùn)算符基本確定是否條件為真。2)空(Empty)、非空(not empty)這些運(yùn)算符要求引用一個(gè)屬性列和一個(gè)可選擇的空值作為它們的運(yùn)算數(shù)。用戶可以定義一個(gè)把屬性列視為空的值。例如,“N/A”值表示重量屬性列在產(chǎn)品維度中為空。如果參考屬性列中沒有定義為空值,無效值被認(rèn)為是屬性的空值。這兩個(gè)運(yùn)算測試具體記錄屬性是否滿足空或非空的條件。3)存在(Exists),不存在(not exists)這些運(yùn)算符基本上與“空”和“非空”相同,除了它們還利用一個(gè)稱為“聚集空值”的程序設(shè)置。程序設(shè)置規(guī)定應(yīng)該為通常認(rèn)為是空的值建立聚集記錄?!按嬖凇边\(yùn)算符與傳統(tǒng)的層規(guī)則項(xiàng)完全等價(jià)。4)包括列表(Include list),排除列表(exclude list)
這些運(yùn)算符要求兩個(gè)運(yùn)算數(shù)一個(gè)屬性列表達(dá)式和一個(gè)值表達(dá)式列表。給定的具體記錄,它們確定是否屬性列表達(dá)式的結(jié)果值分別在或不在值列表中。對“包括列表”,具有判斷為在列表中的一個(gè)值的屬性的所有具體記錄滿足條件,對“排除列表”具有不能判斷為在列表中的任何值的屬性的所有具體記錄滿足條件。
當(dāng)然,規(guī)則項(xiàng)的隱含類型不局限于上述列表中,但是列表定義了更普通的需要。規(guī)則項(xiàng)也可具有組合測試。規(guī)則項(xiàng)可以同邏輯運(yùn)算符如與、或、非組合。采用表達(dá)式語言使規(guī)則項(xiàng)非常靈活,如一些例子所示規(guī)則項(xiàng)=年齡組>30和年齡組<=90規(guī)則項(xiàng)=非(年齡組>30和年齡組<=90)規(guī)則項(xiàng)=品牌="品牌名稱"或品牌="另外的品牌名稱"(可以用包括列表達(dá)到相同的結(jié)果)規(guī)則項(xiàng)=word_cap(品牌)在("品牌名稱","另外的品牌名稱")中當(dāng)產(chǎn)生聚集記錄列表時(shí),掃描具體維度記錄看是否它們出現(xiàn)在層里。出現(xiàn)在層里意味著具體記錄的屬性符合層規(guī)則的要求;其含義是給定的具體記錄識別必須“求和”的事實(shí)數(shù)據(jù)以獲得此層的聚集維度記錄識別的聚集。
如果具體維度記錄符合層規(guī)則的所有規(guī)則項(xiàng)的條件,就認(rèn)為它有資格進(jìn)入層中??梢越o每個(gè)在層中使用的屬性的屬性值的不同的組合產(chǎn)生一個(gè)聚集維度記錄。注意聚集記錄的產(chǎn)生是根據(jù)特殊原始屬性值而不是規(guī)則項(xiàng)的屬性表達(dá)式。例如,如果規(guī)則項(xiàng)是“Age div 10=2”,屬性表達(dá)式的結(jié)果“Age div 10”對于年齡屬性值范圍20到29而言總是2。有10個(gè)不同的屬性值。如果此規(guī)則項(xiàng)是層規(guī)則的唯一項(xiàng),將產(chǎn)生10個(gè)不同的聚集維度記錄(從20到29的值中的一個(gè)值)。
基于表達(dá)式的層識別提供了一個(gè)以簡單的方式產(chǎn)生聚集的優(yōu)秀靈活的限制方法。
子層(sublevel)表示了在層上放置附加的規(guī)定的方法。子層允許不能在單獨(dú)的層規(guī)則達(dá)到的附加的運(yùn)算。每個(gè)聚集層可以有任意多個(gè)子層。子層通過限制哪些具體記錄實(shí)際上加入子層,起到一個(gè)哪里條件的作用。
每個(gè)子層可以產(chǎn)生零個(gè)或多個(gè)維度聚集記錄,直到父層產(chǎn)生的記錄的數(shù)目(子層總是受限于父層)。對于來自父層的每個(gè)唯一的維度聚集記錄,根據(jù)是否符合子層條件,子層將產(chǎn)生零或一維聚集記錄。
每個(gè)子層規(guī)則包括一個(gè)布爾表達(dá)式(即,該表達(dá)式必須判斷真或假的值)。布爾表達(dá)式必須引用一個(gè)或多個(gè)屬性列。在本實(shí)施例的執(zhí)行中,表達(dá)式可以利用任何語言支持運(yùn)算。子層規(guī)則表達(dá)式還過濾加入聚集層規(guī)則產(chǎn)生的每個(gè)聚集記錄的具體記錄。
此外,子層還提供給用戶選擇以產(chǎn)生另外要求的維度中的附加的屬性列。下述的例子說明了不能被單獨(dú)的聚集層規(guī)則代替的子層的靈活性和功能性。例1.圖2A和2B表示此例子。圖2A表示一個(gè)產(chǎn)品維度表,圖2B表示在該維度中的層定義。產(chǎn)品維度具有以下屬性;UPC(通用產(chǎn)品編碼)、產(chǎn)品名稱、價(jià)格、類別、品牌和制造商。
層規(guī)則品牌存在、制造商存在。
子層規(guī)則價(jià)格>10.00和類別=“食品”在上述的層規(guī)則中,為每個(gè)品牌和制造商屬性的不同組合產(chǎn)生一個(gè)聚集維度記錄(記錄8-11)。子層規(guī)則應(yīng)用到包含層規(guī)則以產(chǎn)生附加的聚集記錄(記錄12-13)。當(dāng)且僅當(dāng)在聚集記錄中存在至少一個(gè)具體記錄并且類別為食品價(jià)格大于10美元時(shí),就對品牌和制造商屬性值產(chǎn)生一個(gè)聚集記錄。因此,子層可以產(chǎn)生比封閉的聚集層更少的聚集記錄。在此情況下,只有與四個(gè)層記錄比較的兩個(gè)子層記錄。子層的每個(gè)聚集記錄表示一特定的品牌和制造商的大于10美元的所有食品項(xiàng)的聚集。(注意為了使子層的聚集記錄為唯一的聚集結(jié)果,在層的交叉產(chǎn)品中不選擇父聚集層。)注意上述的子層條件不能由層規(guī)則單獨(dú)表示,因?yàn)閷γ總€(gè)在層規(guī)則中采用的屬性的每個(gè)不同組合產(chǎn)生一個(gè)聚集記錄。因此,如果在層規(guī)則中加入條件,對于所有的相同價(jià)格相同品牌和制造商的食品項(xiàng)產(chǎn)生一個(gè)聚集記錄。在層規(guī)則中用的分組技術(shù)不足以定義一個(gè)如子層規(guī)則的哪里(where)條件。
此外,當(dāng)聚集產(chǎn)生期間不應(yīng)用子層規(guī)則時(shí)(即,哪里條件),子層規(guī)則產(chǎn)生的聚集不能從由層規(guī)則單獨(dú)產(chǎn)生的聚集集中得出。層規(guī)則產(chǎn)生的聚集將不包括任何的價(jià)格或類別信息。這些屬性被抑制因?yàn)樗鼈冋痪奂礁叩钠放坪椭圃焐虒又小R虼?,它將不能發(fā)現(xiàn)在聚集中的哪個(gè)具體記錄的價(jià)格大于10美元或?qū)儆谏唐奉?,除非OLAP工具也分析具體記錄,。這將使產(chǎn)生聚集的全部目的失敗。
另一個(gè)解決方法涉及具有一個(gè)層規(guī)則,如品牌存在、制造商存在、價(jià)格存在、類別=“食品”。在此情況下,對每個(gè)類別為“食品”的品牌、制造商和價(jià)格的特殊組合產(chǎn)生一個(gè)聚集記錄。OLAP工具于是將“價(jià)格>10.00”的哪里條件應(yīng)用到產(chǎn)生的聚集上并進(jìn)一步聚集價(jià)格>10.00的記錄。但是,這不會從預(yù)聚集獲益,因?yàn)楹芸赡苊總€(gè)產(chǎn)品有不同的價(jià)格。在此情況下,產(chǎn)生的聚集的數(shù)目幾乎與具體記錄的數(shù)目相同。
子層允許在聚集階段哪里(WHERE)條件的應(yīng)用,其會極大地有利于OLAP查詢工具,尤其是當(dāng)哪里條件是用戶組的普通過濾條件時(shí)。例如,對在不同的年齡組的雇員產(chǎn)生聚集,對一特定的價(jià)格范圍的所有的產(chǎn)品產(chǎn)生聚集等等。例2圖3A和3B表示了此例子。雇員維度提供了如下屬性SSN(規(guī)格序號)、姓名、性別、地址和電話號碼。
層規(guī)則子層1規(guī)則子字符串(1,3,電話號碼)=“281”子層2規(guī)則子字符串(1,3,電話號碼)=“213”子層3規(guī)則子字符串(1,3,電話號碼)=“713”在此例子中,層規(guī)則沒有規(guī)則項(xiàng),這意味著來自維度的所有具體記錄可以聚集到一個(gè)聚集記錄中(如圖所示3B,此情況為聚集記錄8)。因此,只產(chǎn)生一個(gè)聚集記錄。這個(gè)層規(guī)則包括三個(gè)子層規(guī)則。每個(gè)子層規(guī)則同一特定的值比較電話號碼開始的三位數(shù)字(即,區(qū)號)?;旧?,第一個(gè)子層規(guī)則為所有的區(qū)號=“281”的具體記錄建立了一個(gè)聚集記錄。同樣,第二和第三子層規(guī)則為所有的區(qū)號分別為“213”和“713”的具體記錄建立聚集記錄(記錄10,11)。
而且,僅采用層規(guī)則不能實(shí)現(xiàn)這些聚集。采用層規(guī)則中的子層規(guī)則條件會錯(cuò)誤地對每個(gè)確定區(qū)號的不同電話號碼產(chǎn)生聚集。
采用上述的子層規(guī)則,假設(shè)用戶可以列出所有的區(qū)號,每個(gè)子層一個(gè),用戶實(shí)際上可以對每個(gè)區(qū)號建立一個(gè)聚集記錄。從長遠(yuǎn)考慮,用戶可能還希望在維度中建立一個(gè)分離的區(qū)號屬性以便他們可以將層規(guī)則應(yīng)用到屬性上。這將避免對每個(gè)新增的區(qū)號必須手工建立一個(gè)子層。但是,子層確實(shí)可以迅速地解決不具有附加的屬性的問題。
在另一個(gè)實(shí)施例中,在處理中為聚集的目的可以定義導(dǎo)出的屬性,其不隨著實(shí)際維度表存儲到輸入事實(shí)數(shù)據(jù)。在圖3A和3B中的虛線表示了導(dǎo)出的屬性。例如,可以通過數(shù)據(jù)的屬性列函數(shù)定義屬性,這導(dǎo)出的屬性可以為了聚集的目的起到與聚集一樣的作用,可以采用同樣的方法在層規(guī)則和子層規(guī)則中引用。例如,稱為電話號碼前綴的導(dǎo)出屬性可以用屬性定義函數(shù)子字符串(1,3,電話號碼)定義。通過包括此屬性的層規(guī)則(在此例中指前綴層規(guī)則),數(shù)據(jù)可以直接聚集到電話號碼前綴。實(shí)際上,采用導(dǎo)出的屬性不方便,通常屬性隨時(shí)間存儲在主文件中以便它們連接從不變化的特定的復(fù)合碼。因此,增加的屬性要求重新處理許多舊數(shù)據(jù)。為了簡化處理,本較佳實(shí)施例沒有提供屬性,此實(shí)施例是在本發(fā)明范圍內(nèi)的。
子層也證明在其它類似的情況下是有用的。如果用戶想為三個(gè)最大的客戶建立一個(gè)聚集,用戶可以為所有的客戶建立一個(gè)聚集并用一個(gè)子層規(guī)則列出三個(gè)最大的客戶。這允許用戶在沒有為了此目的建立一個(gè)新屬性的情況下將所有的三個(gè)客戶的聚集看作為一個(gè)。它還允許“前三個(gè)”客戶隨時(shí)間變化而仍然維持相同的聚集維度記錄(這使得趨向于更容易分析)。
一旦為所有的維度定義了層規(guī)則和子層規(guī)則,聚集層可用于層的交叉產(chǎn)品。層的交叉產(chǎn)品允許用戶定義哪個(gè)交叉維度的聚集需要被增加到數(shù)據(jù)庫中。
層交叉產(chǎn)品僅為登錄項(xiàng)的列表,每個(gè)登錄項(xiàng)有每維度的層。對于早先介紹的商店、產(chǎn)品和時(shí)期維度,層的交叉產(chǎn)品可能看上去如商店x產(chǎn)品x天(具體或輸入數(shù)據(jù))商店x所有_產(chǎn)品x月所有_商店x產(chǎn)品x月所有_商店x所有_產(chǎn)品x月商店x所有_產(chǎn)品x季度所有_商店x產(chǎn)品x季度所有_商店x所有產(chǎn)品x季度這一列表雖短,但實(shí)際上它可以增加到很長。如果用戶對于三個(gè)維度每個(gè)維度僅定義十個(gè)層,當(dāng)需要所有的組合時(shí),列表的長度可以增加到1000個(gè)登錄項(xiàng)長。
為解決此問題,發(fā)明還提供了層組(Level group)。一個(gè)層組是一個(gè)維度的層的列表,可以作為層的交叉產(chǎn)品的一個(gè)登錄項(xiàng)。軟件自動擴(kuò)展層組表示的所有組合。通過定義包括“月”和“季度”的層組“時(shí)期組”,上述的列表可以縮短為商店x產(chǎn)品x天(具體或輸入數(shù)據(jù))
商店x所有_產(chǎn)品x時(shí)期_組所有_商店x產(chǎn)品x時(shí)期_組所有_商店x所有_產(chǎn)品x時(shí)期_組縮短的列表的含義與先前的列表相同。此技術(shù)具有使它更容易維持交叉產(chǎn)品的主要效果,因?yàn)橛脩艨梢詫臃纸M為單個(gè)的實(shí)體。在此例子中,用戶一直想按月和季度聚集;使用層組僅需要增加一個(gè)登錄項(xiàng)以表示所有的需要的時(shí)期聚集。
層組可以包括聚集層、具體層和子層。注意上述的層交叉產(chǎn)品可以表示成百甚至上千的實(shí)際聚集記錄,因?yàn)槊繉佑性S多與它結(jié)合的聚集記錄。
層組還可以被定義成覆蓋多于一個(gè)維度,并可以擴(kuò)展到包括在每個(gè)維度中的層/子層的交叉產(chǎn)品。但是,這樣的一個(gè)層組實(shí)際上只是在所涉及的每個(gè)維度中寫出層組的簡化方式,因此不會縮減產(chǎn)生交叉產(chǎn)品列表的交叉產(chǎn)品定義的數(shù)目。提供這樣的選項(xiàng)會使界面更復(fù)雜(由于每個(gè)登錄項(xiàng)不對應(yīng)于單一維度),因此它的實(shí)現(xiàn)不被認(rèn)為是有利的。
接下來是對實(shí)現(xiàn)基于表達(dá)式層識別、子層和層組的系統(tǒng)元件的說明。在被稱為維度處理的處理過程中描述了層識別和子層,在此期間輸入維度記錄(表示事項(xiàng)處理)被處理,層規(guī)則被應(yīng)用到每個(gè)記錄。處理的結(jié)果是維度聚集記錄的導(dǎo)出表,具體和聚集記錄間的包含關(guān)系(即具體記錄必須被結(jié)合以計(jì)算由聚集記錄表示的聚集)。此信息在事實(shí)處理過程中被使用(在此時(shí)讀取事實(shí)記錄)從而實(shí)際上根據(jù)用戶定義的層交叉產(chǎn)品產(chǎn)生聚集。
根據(jù)擴(kuò)展的層交叉產(chǎn)品描述層組以獲得完全的用于計(jì)算的交叉產(chǎn)品的列表。
維度處理必須對星形模式的每個(gè)維度執(zhí)行,有如下的輸入要求1)輸入維度記錄的列表對每個(gè)維度有一個(gè)維度記錄列表。每個(gè)維度記錄包括一系列的主碼和屬性列表。下述圖表顯示維度記錄的邏輯圖。
碼字段包括每個(gè)維度記錄的主碼。一些維度可以僅有一個(gè)碼字段,而其它需要將多字段結(jié)合從而唯一地識別一個(gè)記錄。屬性l到屬性a表示一個(gè)記錄的屬性值。這些屬性限定碼的值并描述每個(gè)維度記錄的特性。2)維度記錄定義相關(guān)的輸入維度記錄列表的是維度記錄定義。它定義每個(gè)碼的位置和屬性字段。它還定義每個(gè)字段的名稱和數(shù)據(jù)類型。這些對于分析和解析層和子層規(guī)則是需要的。字段名稱被用于規(guī)則中以表示相關(guān)的字段值。數(shù)據(jù)類型被要求檢查是否不同的字段定義的運(yùn)算是有效的(例如,算法運(yùn)算不能在字符類型的字段執(zhí)行。)3)層和子層規(guī)則有一系列與維度的相關(guān)的層和子層規(guī)則。這些規(guī)則根據(jù)1.2節(jié)的說明被定義。用戶必須調(diào)查要產(chǎn)生的聚集集合,然后為了產(chǎn)生這些聚集定義在每個(gè)維度中要求的層或子層。
4)層的交叉產(chǎn)品用戶定義聚集計(jì)算處理(稱為事實(shí)處理)使用的層交叉產(chǎn)品以確定建立哪種聚集。此交叉產(chǎn)品將包括對層組的引用,層組需要在事實(shí)處理之前(或期間)被擴(kuò)展。
為了本文件的目的,下述的簡單對象被假定為存在的(或可以容易地開發(fā))。假定讀者有豐富的C++編程經(jīng)驗(yàn),熟悉這些對象的實(shí)現(xiàn)和目的。
1)標(biāo)準(zhǔn)模板庫(Standard Template Library)在本實(shí)施例中的許多組件對于容器(container)對象利用標(biāo)準(zhǔn)模板庫,現(xiàn)在有部分C++語言標(biāo)準(zhǔn)。模板向量類被用于執(zhí)行簡單對象數(shù)組。
2)字符串(string)簡單字符串類(采用適當(dāng)運(yùn)算方法)被用于支持規(guī)則項(xiàng)表達(dá)式和其它文本。
3)值(Value)值對象是可以包含各種不同數(shù)據(jù)類型的值的對象。在數(shù)據(jù)庫系統(tǒng)中,典型的值為字符串、數(shù)字、日期或二進(jìn)制大對象(BLOB)這一簡單類可以包括所有的相關(guān)類型并“知道”它當(dāng)前所包含的對象類型。這個(gè)類通過允許我們利用一個(gè)表示在數(shù)據(jù)庫系統(tǒng)中的各種數(shù)據(jù)類型的簡單的對象而簡化開發(fā)。值類的方法包括A)bool IsNull()-表示是否設(shè)置無效值。B)void SetNull()-將值設(shè)為無效C)DateType GetDateType()-返回當(dāng)前值的數(shù)據(jù)類型D)void SetValue(datetype v)-賦值。對每個(gè)支持的數(shù)據(jù)類型有一個(gè)賦值方法(datetype表示任一支持的數(shù)據(jù)類型)E)void GetValue(datetype&v)-返回值。對每個(gè)支持的數(shù)據(jù)類型有一個(gè)返回值的方法(datetype表示任一支持的數(shù)據(jù)類型)。如果當(dāng)前值為不同的數(shù)據(jù)類型并且不能轉(zhuǎn)換為要求的類型,就作為例外而刪除。
4)記錄(Record)記錄只是值對象的向量。此類表示從輸入維度表中讀取的記錄。通過采用值對象表示每個(gè)相關(guān)的列中的值,不必要考慮不同的數(shù)據(jù)類型。記錄類的方法包括●int FieldCount()-返回在記錄中的字段(或列)的數(shù)目?!駐oid GetValue(int i,Value&v)-返回給定的索引i的值?!駐oid SetValue(int i,const Value&v)-為給定的索引賦值?!駐oid Reset(int n)-清除全部記錄,對n字段確定空間。
5)ColumnDefColumnDef是列定義。ColumnDef最重要的屬性是列的名稱和它的數(shù)據(jù)類型,但是ColumnDef還包括關(guān)于如何從它的表中讀取列的信息。信息是特別執(zhí)行的。方法包括●DataType GetDataType()-返回列的數(shù)據(jù)類型●void GetName(String&name)-獲得列的名稱6)RecordDefRecordDef是記錄定義。它主要是ColumeDef對象的向量,但是還包括其的關(guān)于如何讀取表的特別執(zhí)行的方法。方法包括●int ColumnCount()-返回列的數(shù)目●void ResetColumns()-清除所有的列●void RemoveColumn(inti)-冊除索引i的列●void SwapColumn(int i,int j)-交換索引i和j的列●ColumnDef*GetColumn(int i)-獲得索引i的列定義。●Void AddColumn(ColumnDef*pColDef)-增加列定義。對象還有索引過載運(yùn)算符以使它更容易地訪問數(shù)據(jù)庫。
7)RecordProviderRecordProvider是給維度處理提供記錄的抽象對象。它可以是一個(gè)讀取平面文件、網(wǎng)絡(luò)端口或SQL查詢結(jié)果的對象。為了我們的目的,在此RecordProvider的具體內(nèi)容并不重要,但是下面的方法(或等價(jià))是有用的●void Open(const RecordDef&recDef)-對給定的記錄定義打開提供器。●bool ReadRecord(Record&record)-讀取記錄,當(dāng)沒有更多的記錄時(shí)返回真?!馼ool IsAtEnd()-當(dāng)沒有更多的記錄時(shí)返回真?!駐oid Close()-關(guān)閉提供器。
8)RecordCollectorRecordCollector是知道如何處理具體處理結(jié)果的抽象對象。RecordCollector接收表示聚集維度記錄和具體維度記錄的記錄。在本較佳實(shí)施例中,系統(tǒng)在大數(shù)據(jù)文件中保存產(chǎn)生的聚集記錄和原始具體記錄。記錄的特別利用是特別實(shí)現(xiàn);文件描述如何通過層規(guī)則識別聚集記錄。RecordCollector有如下方法(或等價(jià))●void WriteAggregate(Const Record&detail,const Record&aggregate,constLevel&aggrLevel)此方法接收對給定的具體記錄產(chǎn)生的聚集記錄。對相同的具體或聚集記錄,它可以被調(diào)用多次。(注意層類型在本文件中稍后被定義一它是用于聚集層的對象。)RecordCollector概念上可以接收兩個(gè)事物。首先,它接收對維度產(chǎn)生的所有的聚集記錄。第二,它接收具體記錄和聚集記錄間的關(guān)系。(通過觀察方法參數(shù),可以看到給定的具體(detail)是產(chǎn)生的聚集的一部分。)由RecordCollector知道如何處理此信息。那些具體是特別實(shí)現(xiàn)的。
在本較佳軟件的執(zhí)行中,層具有分配給它們的整型代碼,所有的具體和聚集維度記錄被分配給代替的(或合成)整型碼。具體和聚集的關(guān)系被寫入包含有聚集層代碼、具體合成碼和聚集合成碼的記錄的數(shù)據(jù)文件,在事實(shí)處理過程中采用數(shù)據(jù)文件確定具體必須組合哪個(gè)聚集。此外,所有的具體和聚集維度記錄在數(shù)據(jù)文件中保存。關(guān)鍵是本實(shí)施例中的特定的RecordCollector是如何工作的,它允許事實(shí)處理在稍后完成因?yàn)樵诰S度處理完成后存儲所有的相關(guān)數(shù)據(jù)。
定義輸入要求和假定對象的目的是描述基于表達(dá)式的層識別、子層和層組運(yùn)算的結(jié)構(gòu);上述的全部結(jié)構(gòu)是執(zhí)行聚集的典型系統(tǒng)。記錄被從RecordCollector中讀取,根據(jù)層規(guī)則和具體數(shù)據(jù),聚集記錄被“發(fā)現(xiàn)”,通過RecordCollector聚集維度記錄和它們與具體記錄的關(guān)系被存儲。在對所有的維度執(zhí)行本運(yùn)算后,在層交叉產(chǎn)品中的層組擴(kuò)展以準(zhǔn)備事實(shí)處理。
本發(fā)明的此特定實(shí)施例利用的對象如下1)表達(dá)式(Expression)Expression對象編譯和執(zhí)行表達(dá)式。在建立一個(gè)表達(dá)式時(shí)通過一個(gè)RecordDef,你可以通知它應(yīng)該有哪些列?!馝xpression(const RecordDef&recordDef)-建立表達(dá)式的構(gòu)造器。記錄定義存儲在表達(dá)式中;那些列可以用于此對象編譯的表達(dá)式文本?!駐oid Compile(const String&exprText)-將給定的文本編譯為內(nèi)部執(zhí)行的格式?!馼ool IscolumnReferenced(int i)-如果記錄定義中的索引i的列被表達(dá)式引用返回true?!駃ht GetFirstColumnRef()-獲得此表達(dá)式引用的第一列的記錄定義的索引?!駃nt GetColumnRefCount()-獲取本表達(dá)式引用的特殊列的數(shù)目。(如果系統(tǒng)的列被引用多于一次,它僅計(jì)一次。)●void SetAggrEmptyValues(intindex,bool yesNo)-如本文件中早先所述,它對每個(gè)列控制exists和not exists運(yùn)算符是如何工作的。如果Yesno對一個(gè)列設(shè)置為true,對空列存在就返回真。●void Execute(Value&result,const Record*detaillRecord,constRecord*emptyReeord)-執(zhí)行表達(dá)式,將結(jié)果放入result。detailrecord包括當(dāng)前具體記錄的列的值。emptyrecord包括表示空字段(象“N/A”)的值。
2)LeveRuleDefLevelRuleDef維持規(guī)則項(xiàng)表達(dá)式列表?!馽onst BaseLevelDef*GetLevel()-返回指針給含有本層規(guī)則定義的層?!駐oid Reset()-將所有的規(guī)則項(xiàng)復(fù)位?!駃nt GetNumRuleItem()-返回規(guī)則項(xiàng)的數(shù)目。●const String&GetRuleItem(int i)-在索引i返回規(guī)則項(xiàng)文本。●void InsertItem(const String&rule,int i=-1)-在索引i插入給定的規(guī)則項(xiàng),或者如果i沒有被定義,就在末端插入?!駐oid SetItem(const String&rule,inti=0)-在索引i設(shè)置規(guī)則項(xiàng)文本,其默認(rèn)值為0?!駐oid DeleteItem(int i)-在索引i刪除規(guī)則項(xiàng)。
3)BaseGroupLevelDefBaseGroupLevelDef是所有的層定義的包括組的基本類。它包括識別層類的方法?!馼oolIsAggrLevel()-如果層定義對應(yīng)聚集層就返回真?!馼oolIsSubLevel()-如果層定義對應(yīng)一個(gè)子層就返回真?!馼oolIsGroup()-如果層定義對應(yīng)層組就返回真。
4)BaseL evelDef:BaseGroupL evelDefBaseLevelDef是具有規(guī)則項(xiàng)、名稱和編碼的層定義的基類。●const String&GetLevelName()-返回層名稱。●void SetLevelName(const String&name)-設(shè)置層名稱?!駃nt GetLevelCode()-返回層代碼。●void SetLevelCode(int code)-設(shè)置層代碼●const LevelRuleDef*GetLevelRule-返回指針給層定義的層規(guī)則。返回值是只讀的。LevelRuleDef*GetLevelRule()-返回指針給層定義的層規(guī)則。返回的對象用于給層定義增加層規(guī)則項(xiàng)。
5)LevelDer:BaseLevelDefLevelDef是層的基類,其具有對聚集記錄產(chǎn)生說明的表達(dá)式。這是本執(zhí)行中的特別的屬性?!馽onst String&GetDeseRule()-返回說明規(guī)則的文本?!駐oid SetDescRule(const String&descRule)-設(shè)置說明規(guī)則的文本。
6)AggrLevelDef:LevelDefAggrLevelDef對象表示聚集層定義并包含規(guī)則項(xiàng)表達(dá)式、層名稱和層代碼(層的整型標(biāo)識符)的文本。對象還維持它的子層列表?!馭ubLevelDef*CreateSubLevel(eonst String&name)-用給定的名稱建立子層定義?!駐oid DeleteSubLevel(SubLevelDef*&pLevel)-從聚集層移動給定的子層,并刪除它?!駐oid DeleteSubLevel(const String&name)-從聚集層移出給定的名稱的子層,并刪除它。●bool ContainSubLevel(const SubLevelDef&sublevel)-當(dāng)聚集層包含給定的子層就返回真。●void TransferSubLevel(SubLevelDef&sublevel,AggrLevelDef&newlevel)-將子層從此聚集移動到newlevel。●void TransferSubLevel(eonst String&subname,AggrLevelDef&newlevel)-將子層(由它的名稱確定)從本聚集層移動到newlevel?!駃nt GetNumSubLevels()-返回子層的數(shù)目?!駐oid GetSubLevels(vector<SublevelDef*>&vSubLevels)-使所有的子層進(jìn)入向量。子層可以被修改?!駐oid GetSubLevels(vector<const SubLevelDef*>&vSublevels)-使所有的子層進(jìn)入向量。子層為只讀。
7)SubLevelDef:BaseLevelDefSubLevelDef是子層的定義。除了聚集層的屬性之外,它知道哪個(gè)層包括它?!馽onst LevelDef*GetRefLevel()-返回包含層的層定義。
8)GroupDef:BaseGroupLevelDefGroupDef對象維持組中的層和子層的列表?!駐oid AddLevel(const BaseLevelDef&level)-在組中增加一個(gè)層。層自變量可以是聚集層或子層?!駐oid AddLevels(const vector<cont LevelDef*>&plevels)-在組中增加層列表?!駐oid AddLevels(const vector<const SubLevelDef*>&plevels)-在組中增加子層列表?!駐oid RemoveLevel(const BaseLevelDef&rlevel)-從組中移去給定的子層。●void Reset()-從組中移去所有的層和子層。●bool ContainLevel(const BaseLevelDef&rlevel)-如果組包含給定的層返回真?!駐ector<const LevelDef*>GetLevels()-返回包含此組的聚集層的向量?!駐ector<const SubLevelDef*>GetSubLevels()-返回包含此組的子層的向量?!駐ector<eonst BaseLevelDef*>GetAllLvels()-返回包含此組的層和子層的向量?!駐ector<const LevelDef*>GetLevelByCode()-返回包含此組的層和子層的由層代碼分類的向量?!馼oolIsEmpty()-如果組不包含任何層或子層返回真。
9)CrossProductCrossProduct對象維持層定義列表,對于交叉產(chǎn)品列表的一個(gè)單個(gè)登錄項(xiàng),每個(gè)維度一個(gè)CrossProduct對象?!駐oid SetGroup(const GroupDef&rGrp)-在交叉產(chǎn)品設(shè)置一個(gè)層組。對維度刪除任何先前的組。●void SetLevel(const BaselevelDef&rLevel)-在交叉產(chǎn)品設(shè)置一個(gè)層或子層定義。對維度刪除任何先前的組?!駐oid SetGroupAndLevels(const vector<const BaseGroupLevelDef*>&vObjs)-對交叉產(chǎn)品設(shè)置層、子層或組定義的列表。列表應(yīng)包含每個(gè)維度的一個(gè)定義。它代替任何存在的定義?!駐ector<eonst BaseGroupLevelDef*>GetGroupAndLevelsByDimName()-獲得由維度名稱命令的層、子層或組定義的列表?!駐ector<const BaseGroupLevelDef*>GetGroupAndLevelsByName()-獲得由層名稱命令的層、子層或組定義的列表。●void RemoveGroup(const GroupDef&rGrp)-移去層或子層組定義?!駐oid RemoveLevel(const BaseLevelDef&rLevel)-移去層或子層定義?!馼ool ContainGroup(const GroupDef&rGrp)-當(dāng)交叉產(chǎn)品包含給定的組就返回真?!馼ool ContainLevel(const BaseLevelDef&rLvl)-當(dāng)交叉產(chǎn)品包含給定的層或子層就返回真?!馼ool operator=(const CrossProduct&inprod)-當(dāng)此交叉產(chǎn)品與給定的交叉產(chǎn)品相同就返回真給比較運(yùn)算符。●int GetSize()-返回交叉產(chǎn)品的登錄項(xiàng)的數(shù)目,其應(yīng)該與維度的數(shù)目相同?!駐oid Reset()-從交叉產(chǎn)品刪除所有的層定義。
10)LevelLevel對象包含被需要識別和處理聚集層和子層的信息。建立了給定的聚集層定義或子層定義。對于聚集層,mpSublevelRule數(shù)據(jù)成員為無效。對于子層,mvLevelRule和mpSublevelRule的表達(dá)式全被判斷?!馤evel(Dimension&dimension,const AggrLevelDef*pLeve()-建立給定的維度和聚集層定義的層對象的構(gòu)造器。●Dimension&GetDimension()-返回此層的維度?!馽onst Dimension&GetDimension()-返回此層維度,但是為只讀。●const String&GetName()-獲得此層的名稱?!馼oolIsSubLevel()-當(dāng)從子層定義建立層就返回true?!馼oolIsAggrLevel()-當(dāng)從聚集層定義建立層就返回true?!駃nt GetLevelCode()-返回層的整數(shù)層代碼。●void MakeDescription(const Record&rec,String&desc)-用說明規(guī)則對給定的記錄建立說明并在desc放置說明文本。此特點(diǎn)是本發(fā)明執(zhí)行的所特有的?!馼ool MatchRecord(const Record&rec)-如果給定的輸入具體記錄加入層就返回真。在此方法中,通過執(zhí)行規(guī)則項(xiàng)表達(dá)式判斷層規(guī)則。對于子層,必須評價(jià)父層規(guī)則和子層規(guī)則兩者?!駐oid PopulateRecord(const Record&inputRec,Record&popRec)-給定的輸入具體記錄inputRec,此方法建立了包含聚集維度記錄的屬性的記錄。如果列沒有被層規(guī)則引用,列被填為無效,在此情況列是從inputRec復(fù)制的?!馼ool DescRuleUsesColumn(int index)-如果說明規(guī)則在索引index引用列就返回true?!馼ool LevelRuleUsesColumn(intindex)-如果層規(guī)則在索引index引用列就返回true。層對象的數(shù)據(jù)成員包括●Dimension&mDimension-引用支持層的維度對象?!馽onst BaseLevelDef*mpLevel-此層的層定義的指針,其可以是AggrLevelDef或SubLevelDef?!馝xpression*mpDescRule-評價(jià)說明的表達(dá)式對象的指針。●vector<Expression*>mvLevelRule-此層的規(guī)則項(xiàng)表達(dá)式的指針vector。對聚集層,有0或多個(gè)規(guī)則項(xiàng)表達(dá)式,每個(gè)引用一個(gè)和僅有一個(gè)特殊列。對子層,此數(shù)據(jù)元被從父聚集層置于規(guī)則項(xiàng)表達(dá)式?!馝xpression*mpSublevelRule-評價(jià)子層規(guī)則的表達(dá)式的指針。此表達(dá)式引用一個(gè)或多個(gè)列。如果Level對象不是子層,其為無效。
11)DimensionDimension對象是對維度處理有興趣的信息的持有器。信息包括對維度的Level對象和對維度表的記錄定義?!馽onst RecordDef*GetSourceTable()-獲得源維度表的記錄定義。●int GetNumSourceColumns()-獲得源列的數(shù)目。?!馽onst ColumnDef*GetSourceColumn(int i)-在給定的索引i獲得源列定義?!駃nt GetNumAggrLevels()-獲得聚集層和子層的數(shù)目?!馤evel&GetAggrLevel(int i)-在給定的索引i獲得Level對象?!馽onst Record&GetEmptyValueRecord()-獲得包含被認(rèn)為是空的值(如“N/A”)的記錄。Dimension對象的數(shù)據(jù)成員包括●RecordDef mSourceTableDef-對維度的記錄定義?!駐ector<Level*>mvAggrLevels-包含聚集層和子層的向量?!馬ecord mEmptyRecord-獲得包含被認(rèn)為是空的值(如“N/A”)的記錄。
有專門用于維持層定義的對象的類分組。這些被系統(tǒng)用于建立用來測試具體記錄由哪些聚集構(gòu)成的實(shí)際層對象。
基于表達(dá)式的層識別和子層的核心是輸入具體記錄如何與層匹配。這發(fā)生在維度處理過程中。在維度處理之后層組通過擴(kuò)展層交叉產(chǎn)品被處理。本部分介紹前述的對象如何被利用和關(guān)于它們?nèi)绾喂ぷ鞯募?xì)節(jié)。
維度處理是一個(gè)循環(huán),其讀取所有輸入具體記錄,使它們與層匹配,將相關(guān)的聚集記錄送到記錄收集器。此過程用下面的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;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方法進(jìn)行基于表達(dá)式的層識別和子層的工作。注意記錄收集器僅在它的列表中保持唯一的聚集記錄,因?yàn)閃riteAggregate可以調(diào)用相同的聚集許多次。
匹配記錄包括執(zhí)行規(guī)則項(xiàng)表達(dá)式,如下面的C++類型偽碼的描述<pre listing-type="program-listing"><![CDATA[bool Level∷MatchRecord(constRecord&amp;rec){Value val;bool b;∥Test level rule expressions vector<Expression*>∷interator iter=mvLevelRule.begin();while(iter!=mvLevelRule.end ()){ (*inter)->Execute(val,&amp;rec,&amp;(rnDimension.GetEmptyValueRecord()));val. GetVAlue(b);if(b!=true) return false; iter++;}∥Test sublevel ruleif(IssubLevel()){mpsublevelRule->Execute(val,&amp;rec, &amp;(mdimension.GetEmptyValueRecord())); val.GetValue(b); if(b!=true) return false; }return true; }]]></pre>組合記錄包括從源記錄復(fù)制層規(guī)則項(xiàng)利用的列,如以下的C++類型的偽碼所描述
<pre listing-type="program-listing"><![CDATA[void Level∷PopulateRecord(const Record&amp; inputRec, Record&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方法執(zhí)行如下<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>它利用表達(dá)式的功能檢測列是否被引用。
具體和聚集維度記錄被RecordCollector所收集。正如所提到的,記錄收集器負(fù)責(zé)“獲知”如何處理從維度處理獲得的信息。根據(jù)定義的層,記錄收集器對給定的具體記錄哪些聚集記錄存在的信息。此外,收集器接受關(guān)于什么具體記錄同哪些聚集記錄“匹配”的信息。當(dāng)實(shí)際上產(chǎn)生聚集時(shí),在事實(shí)處理的后面步驟的過程中采用了所有的信息。
擴(kuò)展層交叉產(chǎn)品的處理過程十分簡單。無論何時(shí)遇到層組,所有的組合在一個(gè)大循環(huán)中產(chǎn)生。全部過程的偽碼如下<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>在單一交叉產(chǎn)品登錄項(xiàng)擴(kuò)展層組的偽碼如下<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>上述過程可以用簡單例子說明。假定我們有三個(gè)維度和一個(gè)交叉產(chǎn)品登錄項(xiàng)象{L1,G1,G2},其中L1是一個(gè)層,G1是包含層L2和L3的組,G2是包含層L4和L5的組。(注意重面積表示增加的登錄項(xiàng);粗體文本表示增加的層。)在第一維度循環(huán)后,目標(biāo)表包含
在第二維度后,目標(biāo)表包含
在第三維度后目標(biāo)表包含最后全部擴(kuò)展的交叉產(chǎn)品表
在初始的交叉產(chǎn)品表的所有登錄項(xiàng)被擴(kuò)展后,它們被合并入最后目標(biāo)表中(但僅保留唯一的登錄項(xiàng))。
在此介紹的技術(shù)的優(yōu)點(diǎn)是提供了非常靈活和功能強(qiáng)大的方法為數(shù)據(jù)倉庫選擇聚集數(shù)據(jù),并且還直接執(zhí)行。
基于表達(dá)式的層識別通過允許用戶方便和靈活地選擇它們真正需要聚集的數(shù)據(jù)解決了與大型數(shù)據(jù)倉庫有關(guān)的問題。
子層允許用戶選擇必須被導(dǎo)出的屬性的層當(dāng)聚集不在源數(shù)據(jù)中或當(dāng)希望改變聚集規(guī)則時(shí),這是有幫助的。
通過用戶分組相關(guān)的層和處理基本上較短的交叉產(chǎn)品列表,層組使層交叉產(chǎn)品的選擇更加簡單。
有詳細(xì)介紹一些本較佳表達(dá)式語言的屬性和一些執(zhí)行提醒。這部分列出了在本較佳表達(dá)式中允許的所有的運(yùn)算。額外的運(yùn)算可以被支持以擴(kuò)展層或子層規(guī)則的功能。
比較運(yùn)算這些運(yùn)算有兩個(gè)運(yùn)算數(shù)。它們比較兩個(gè)運(yùn)算數(shù),判斷是否條件是真或假,返回得到的布爾值。用于比較的兩個(gè)運(yùn)算數(shù)必須是可比較的數(shù)據(jù)類型。
算法運(yùn)算這些運(yùn)算根據(jù)運(yùn)算符采用一個(gè)或兩個(gè)運(yùn)算數(shù)。它們執(zhí)行計(jì)算并返回得到的數(shù)值。
字符串處理運(yùn)算這些運(yùn)算在字符串運(yùn)算數(shù)上執(zhí)行各種不同的字符串處理。它們還采用其它運(yùn)算數(shù)執(zhí)行任務(wù)。如下是運(yùn)算的列表。
目期運(yùn)算這些運(yùn)算執(zhí)行各種不同的日期算法和日期轉(zhuǎn)換。
格式化運(yùn)算這些運(yùn)算格式化字符串、日期時(shí)間和字符串中的數(shù)值。它們格式化基于格式化字符串的值。為了相應(yīng)地格式化值,表達(dá)式系統(tǒng)必須懂得格式化字符串的語法。
邏輯運(yùn)算支持三個(gè)常用的邏輯運(yùn)算符與、或、非。它們?nèi)坎捎貌紶栠\(yùn)算數(shù),返回布爾值的結(jié)果。
常數(shù)值支持三個(gè)特殊常數(shù)值真、假和無效。布爾表達(dá)式采用真或假常數(shù)值。無效值用于表示無效列(或字段)的值。
寄存器(Registers)允許寄存器或變量的使用。每個(gè)寄存器與一個(gè)名稱相關(guān)。只有分配因子可以修改寄存器內(nèi)的值。寄存器可以用于保存任何類型的暫時(shí)值,可以用于任何合適的運(yùn)算中。
由于在每個(gè)維度執(zhí)行的運(yùn)算是獨(dú)立的,維度處理的多種情況可以并行執(zhí)行(每個(gè)維度一個(gè))以同時(shí)處理多個(gè)或所有的維度。
在本較佳實(shí)施例中,RPN(逆波蘭表示法)表達(dá)式用于表示層和子層規(guī)則。
其它表達(dá)式語言可以方便地替換。
雖然本發(fā)明的較佳實(shí)施例被表示和介紹,顯而易見,對于那些本技術(shù)領(lǐng)域的熟練人員在不脫離本發(fā)明的精神和附加的權(quán)利要求所限定的范圍的情況下可以做一些變化和修改。
權(quán)利要求
1.一種對應(yīng)于數(shù)據(jù)庫中的具體數(shù)據(jù)登錄項(xiàng)的分組定義至少一個(gè)維度的聚集層的方法,所述的維度具體登錄項(xiàng)表示所述的維度的實(shí)體的集合,其中每個(gè)維度具體登錄項(xiàng)包括至少一個(gè)屬性字段,所述的屬性對每個(gè)所述的實(shí)體是共同的,所述的定義聚集層的方法包括如下步驟在所述的維度中定義與所述的層有關(guān)的至少一個(gè)屬性的一個(gè)層規(guī)則,這里所述的層至少有一個(gè)成員,每個(gè)成員對應(yīng)于所述的至少一個(gè)屬性的每個(gè)中的一個(gè)屬性值,每個(gè)成員相關(guān)于至少一個(gè)與層成員具有相同屬性值的所述維度的具體登錄項(xiàng);其中所述的規(guī)則中的至少一個(gè)包括根據(jù)在所述的層定義中合成的一個(gè)屬性的屬性值的邏輯表達(dá)式并判斷是否滿足所述的邏輯表達(dá)式的表示屬性值的層成員存在于層中;在所述的數(shù)據(jù)庫中聚集的數(shù)據(jù)可以基于在所述的層規(guī)則中合成的屬性值被分組,并且可以作出如是否一個(gè)特別的數(shù)據(jù)登錄項(xiàng)根據(jù)它是否滿足與所述的層規(guī)則相關(guān)的邏輯表達(dá)式應(yīng)該對對應(yīng)的組有貢獻(xiàn)的決定。
2.一種對應(yīng)于數(shù)據(jù)庫中的具體數(shù)據(jù)登錄項(xiàng)的分組定義至少一個(gè)維度的聚集層的方法,所述的維度具體登錄項(xiàng)表示所述的維度的實(shí)體的集合,其中每個(gè)維度具體登錄項(xiàng)包括至少一個(gè)屬性字段,其中存儲在所述的屬性字段中的值對于每個(gè)所述的實(shí)體普通的屬性值,其中所述的數(shù)據(jù)庫包括每一個(gè)都伴有一個(gè)所述的維度的具體登錄項(xiàng)的事實(shí)數(shù)據(jù),所述的對一個(gè)維度定義聚集子層的方法包括如下步驟通過定義與所述的層相關(guān)的所述的維度的至少一個(gè)屬性定義一個(gè)層,這里所述的層有至少一個(gè)成員,每個(gè)成員對應(yīng)所述的至少一個(gè)屬性中的每個(gè)屬性的一個(gè)屬性值,每個(gè)成員伴隨至少一個(gè)與層成員具有相同屬性的所述維度的具體登錄項(xiàng);其中定義一個(gè)邏輯表達(dá)式,其中每個(gè)所述的維度的具體登錄項(xiàng)能夠或不能滿足定義一個(gè)對所述的層有貢獻(xiàn)的具體登錄項(xiàng)的子集從而形成所述的子層,這里子層中的層成員是層的層成員的子集,每個(gè)所述的子層的成員與所述的層的相應(yīng)層成員的具體登錄項(xiàng)的子集相關(guān)聯(lián);所述的子層起到層的作用并且還在所述的數(shù)據(jù)庫的事實(shí)數(shù)據(jù)登錄項(xiàng)在聚集過程中貢獻(xiàn)子層的成員中提供控制。
3.根據(jù)權(quán)利要求2中的方法,其中所述的維度中的層的每一個(gè)被一系列的規(guī)則限定,每個(gè)規(guī)則定義了所述的被分組的層上的所述的維度的一個(gè)屬性。
4.根據(jù)權(quán)利要求2中的方法,其中所述的維度中的子層的每一個(gè)被至少一個(gè)限定條件的規(guī)則所定義,限定了維度的哪個(gè)具體登錄項(xiàng)可以與子層中的層成員相關(guān)聯(lián)。
5.根據(jù)權(quán)利要求4的方法,其中所述的規(guī)則根據(jù)所述的具體規(guī)則項(xiàng)的字段值限定了條件。
6.一種定義用于聚集包括數(shù)據(jù)庫中的事實(shí)數(shù)據(jù)登錄項(xiàng)的輸入事實(shí)數(shù)據(jù)的一系列層交叉產(chǎn)品的方法,其中所述的數(shù)據(jù)庫包括一系列的維度,每個(gè)維度表示一系列的實(shí)體并包含維度具體登錄項(xiàng),每個(gè)維度具體登錄項(xiàng)表示一個(gè)所述的實(shí)體;其中每個(gè)維度具體登錄項(xiàng)包括至少一個(gè)屬性字段,其中存貯在所述的屬性字段的值是一個(gè)屬性的值,所述的屬性對于每個(gè)所述的實(shí)體是共同的;其中通過限定結(jié)合在所述的層上的至少一個(gè)所述的維度的屬性,在每個(gè)所述的維度定義所述的層;這里所述的層有至少一個(gè)成員,每個(gè)成員對應(yīng)所述的至少一個(gè)屬性的每一個(gè)的屬性值,每個(gè)成員結(jié)合具有限定層成員的相同屬性值的所述的維度的至少一個(gè)具體登錄項(xiàng);所述的方法包括以下步驟用一個(gè)層組表示所述的維度中的一個(gè)的至少兩個(gè)所述的層;從所述的維度的每一個(gè)選擇至多一個(gè)層或?qū)咏M,所述的維度中至少一個(gè)是定義層組交叉產(chǎn)品的層組;通過對交叉產(chǎn)品的層組的每個(gè)層組合產(chǎn)生一個(gè)層交叉產(chǎn)品將所述的層交叉產(chǎn)品轉(zhuǎn)換成所述的一系列層交叉產(chǎn)品,在所述的層組交叉產(chǎn)品中的所產(chǎn)生的每個(gè)交叉產(chǎn)品結(jié)合每個(gè)層組的一個(gè)層,并且結(jié)合在不包括層組的所述的交叉產(chǎn)品中的任何層;采用此方法,所述的數(shù)據(jù)庫的用戶可以產(chǎn)生包括維度的第一層的層交叉產(chǎn)品的第一集合和除了所述的第一層的替換外與所述的維度的第二層相同的層交叉產(chǎn)品的第二集合,沒有明確地限定所述的第一和第二集合。
全文摘要
一種定義用于在具有一個(gè)或多個(gè)維度的數(shù)據(jù)存儲的聚集的聚集層(圖2B)、聚集子層和交叉產(chǎn)品層的方法(圖2A)。層根據(jù)維度中的屬性來定義,因此數(shù)據(jù)可以根據(jù)那些屬性的值被聚集成聚集(圖3A和3B)。
文檔編號G06F17/30GK1310824SQ00800999
公開日2001年8月29日 申請日期2000年5月19日 優(yōu)先權(quán)日1999年5月24日
發(fā)明者邁克爾·迪安·洛爾, 伊娃·曼燕·采 申請人:白金技術(shù)Ip公司