1.什麼是星座模型?html
2.哪些地方能夠用到星座模型?git
3.Mondrian怎麼構建星座模型,構建過程又涉及到哪些理論概念。github
答1:這裏描述了維度模型經常使用的 星型、雪花、星座模型,簡而言之就是多事實表模型。ide
答2:例若有個場景,經過資產負債及損益表計算應收款週轉天數。其中資產負債表和損益表都有對應單獨的數據視圖post
計算公式以下:編碼
應收款週轉天數 = 360/(([Total 本期發生數],[營業收入])/(([Total 年初數],[應收帳款])+([Total 期末數],[應收帳款]))/2)
=360/損益表中項目爲[營業收入]的本期發生數合計 /(資產負債表中項目爲[應收帳款]的年初數合計+年底數合計)/2url
=360/損益表中項目爲[營業收入]的本期發生數合計 /(資產負債表中項目爲[應收帳款]的年平均數spa
爲了實現上述統計,若是使用傳統物理模型去串表則容易產生數據冗餘的狀況。具體如何冗餘本身腦補一下吧。爲了解決上述問題則經過創建邏輯模型進行計算處理。3d
答3:code
Mondrian實現理論上的星座模型過程涉及到哪些概念呢?見下圖
1.退化維度的概念參考這裏
組織這裏爲何會被稱爲退化維度?由於在資產負債視圖中,已經包含了組織編碼和組織名稱字段,不須要另外串表來實現,因此叫退化維度。基本一個資產負債視圖事實表就替代了N個維度表。
見SQL查詢資產負債視圖
select * from 資產負債視圖
2.共享維度的概念參考這裏:
模型中創建了年度的共享維度,並在資產負債視圖、損益視圖都調用了年度共享維度。
實現方法就是在須要使用共享維度的Cube外面建一個維度,而後在各個Cube須要引用共享維度的使用添加對共享維度的引用。
爲了模擬方便,手工創建了年度、月度的維度表
1 create Table 年表 2 ( 3 id int, 4 年度 int 5 ) 6 7 create Table 月表 8 ( 9 id int, 10 FYEARID int, 11 月份 int 12 ) 13 14 insert into 年表(id,年度) 15 select 1,2018 16 union all 17 select 2,2019 18 19 20 insert into 月表(id,FYEARID,月份) 21 select 1,1,1 22 union all 23 select 2,1,2 24 union all 25 select 3,1,3 26 union all 27 select 4,1,4 28 union all 29 select 5,1,5 30 union all 31 select 6,1,6 32 union all 33 select 7,1,7 34 union all 35 select 8,1,8 36 union all 37 select 9,1,9 38 union all 39 select 10,1,10 40 union all 41 select 11,1,11 42 union all 43 select 12,1,12 44 45 46 47 48 select * from 年表 49 select * from 月表 50 51 52 53 54 55 insert into 月表(id,FYEARID,月份) 56 select 21,2,1 57 union all 58 select 22,2,2 59 union all 60 select 23,2,3 61 union all 62 select 24,2,4 63 union all 64 select 25,2,5 65 union all 66 select 26,2,6 67 union all 68 select 27,2,7 69 union all 70 select 28,2,8 71 union all 72 select 29,2,9 73 union all 74 select 30,2,10 75 union all 76 select 31,2,11 77 union all 78 select 32,2,12
3.重點就是創建虛擬立方體了,
其實這裏虛擬立方體就是星座模型的載體。
Mondrain官方給了虛擬立方體的解釋(Virtual OLAP Cubes) https://help.pentaho.com/Documentation/7.1/0N0/020/040/000
另一個老外那裏給了虛擬立方體的定義案例能夠參考 https://diethardsteiner.github.io/mondrian/2017/03/20/Mondrian-Multivalued-Dimension-Attribute.html
其實前面的準備工做作好了,後面創建虛擬立方體的工做就很簡單了。
首先,命名
而後加入共享維度,注意共享維度不須要填寫 cubeName。
最後是調用資產負債Cube和損益Cube的度量值
例如:調用資產負債Cube的年初數度量值,cubeName選擇資產負債Cube的名稱【BalanceCube】。
而name這裏寫法,[注意]、[注意]、[注意],必須先填寫前綴 [Mesures]. 再加上各個Cube的度量值名稱,外面加上中括號[]。
資產負債的年初數度量值寫法應該是
[Mesures].[NCS]
損益的本期發生數寫法則應該是
[Mesures].[BQFSS]
保存,上傳到Saiku,預覽一下模型。
至此,經過Mondrian構建星座模型的工做已成功完成,具體本身調整能夠繼續。
附上Schema文件
<Schema name="FinSchema" description="财务模式" measuresCaption="财务模式"> <Dimension type="StandardDimension" visible="true" name="年度"> <Hierarchy visible="true" hasAll="true" allMemberName="所有年度" allMemberCaption="所有年度" primaryKey="年度"> <Table name="年表" schema="dbo" alias=""> </Table> <Level name="年度" visible="true" column="年度" nameColumn="年度" type="Integer" uniqueMembers="false"> </Level> </Hierarchy> </Dimension> <Cube name="BalanceCube" caption="资产负债Cube" visible="true" description="资产负债Cube" cache="true" enabled="true"> <Table name="资产负债视图" schema="dbo"> </Table> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="组织" caption="组织编码"> <Hierarchy visible="true" hasAll="true" allMemberName="所有组织" allMemberCaption="所有组织"> <Level name="组织编码" visible="true" column="组织编码" nameColumn="组织名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> <Level name="组织名称" visible="true" column="组织名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="账簿"> <Hierarchy name="BookHierarchy" visible="true" hasAll="true" allMemberName="所有账簿" allMemberCaption="所有账簿"> <Level name="账簿名称" visible="true" column="账簿名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="项目分类"> <Hierarchy name="ItemTypeHierarchy" visible="true" hasAll="true" allMemberName="所有分类" allMemberCaption="所有分类"> <Level name="项目分类" visible="true" column="项目分类" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="项目名称"> <Hierarchy name="ItemHierarchy" visible="true" hasAll="true" allMemberName="所有项目" allMemberCaption="所有项目"> <Level name="项目名称" visible="true" column="项目名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <DimensionUsage source="年度" name="年度" visible="true" foreignKey="年"> </DimensionUsage> <Measure name="NCS" column="年初数" aggregator="sum" visible="true"> </Measure> <Measure name="QMS" column="期末数" aggregator="sum" visible="true"> </Measure> </Cube> <Cube name="ProfitCube" caption="利润Cube" visible="true" description="利润Cube" cache="true" enabled="true"> <Table name="损益视图" schema="dbo"> </Table> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="组织"> <Hierarchy visible="true" hasAll="true" allMemberName="所有组织" allMemberCaption="所有组织"> <Level name="组织编码" visible="true" column="组织编码" nameColumn="组织编码" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> <Level name="组织名称" visible="true" column="组织名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="账簿"> <Hierarchy visible="true" hasAll="true" allMemberName="所有账簿" allMemberCaption="所有账簿"> <Level name="账簿名称" visible="true" column="账簿名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <Dimension type="StandardDimension" visible="true" highCardinality="false" name="项目名称"> <Hierarchy visible="true" hasAll="true" allMemberName="所有项目名称" allMemberCaption="所有项目名称"> <Level name="项目名称" visible="true" column="项目名称" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never"> </Level> </Hierarchy> </Dimension> <DimensionUsage source="年度" name="年度" visible="true" foreignKey="年"> </DimensionUsage> <Measure name="BQFSS" column="本期发生数" datatype="Numeric" aggregator="sum" visible="true"> </Measure> </Cube> <VirtualCube enabled="true" name="BPCube" description="财务资产负债损益模型"> <VirtualCubeDimension name="年度"> </VirtualCubeDimension> <VirtualCubeMeasure cubeName="BalanceCube" name="[Measures].[NCS]" visible="true"> </VirtualCubeMeasure> <VirtualCubeMeasure cubeName="ProfitCube" name="[Measures].[BQFSS]" visible="true"> </VirtualCubeMeasure> </VirtualCube> </Schema>