Mondrian实现Scheam4.0数据模型,星星模型,雪花模型自己总结

1、最近一直在研究Mondrian如何构建Schema4.0的雪花模型,和星星模型,刚开始研究了大半天都在看Schema3.0的,太坑了。这东西比较是国外研究的技术,许多api文档都英文的,国内很少资料。只能硬着头皮干。哈哈。废话不多说,直接上代码。

表关系,如下:

注意:其实雪花模型已经包含星星模型,不懂得可以查查资料

Schema4.0雪花模型如下:

<Schema metamodelVersion='4.0' name='test'>
<Cube name='HR'>
        <Dimensions>
            <Dimension name='Employee' key='Employee Id'>
                <Attributes>
                    <Attribute name='Manager Id' table='employee' keyColumn='supervisor_id'/>
                    <Attribute name='Employee Id' table='employee' keyColumn='employee_id' nameColumn='full_name' orderByColumn='employee_id'/>
                    <Attribute name='Store Id' table='employee' keyColumn='store_id'/>
                    <Attribute name='Store Type' table='store' keyColumn='store_type' hierarchyAllMemberName='All Store Types'/>
                    <Attribute name='Pay Type' table='position' keyColumn='pay_type' hierarchyAllMemberName='All Pay Types'/>
                    <Attribute name='Management Role' table='position' keyColumn='management_role'/>
                    <Attribute name='Position Title' table='position'>
                        <Key>
                            <Column name='management_role'/>
                            <Column name='position_title'/>
                        </Key>
                        <Name>
                            <Column name='position_title'/>
                        </Name>
                        <OrderBy>
                            <Column name='position_id'/>
                        </OrderBy>
                    </Attribute>
                    <Attribute name='Marital Status' table='employee' keyColumn='marital_status'/>
                    <Attribute name='Gender' table='employee' keyColumn='gender'/>
                    <Attribute name='Salary' table='employee' keyColumn='salary'/>
                    <Attribute name='Education Level' table='employee' keyColumn='education_level'/>
                </Attributes>
                <Hierarchies>
                    <Hierarchy name='Employees' allMemberName='All Employees'>
                        <Level attribute='Employee Id' parentAttribute='Manager Id' nullParentValue='0'>
                            <Closure table='employee_closure' parentColumn='supervisor_id' childColumn='employee_id'/>
                        </Level>
                    </Hierarchy>
                    <Hierarchy name='Position' allMemberName='All Position'>
                        <Level attribute='Management Role'/>
                        <Level attribute='Position Title'/>
                    </Hierarchy>
                </Hierarchies>
            </Dimension>
            <Dimension name="Actual VS Budget" hanger="true">
                <Attributes>
                    <Attribute name="Type"/>
                </Attributes>
            </Dimension>
            <Dimension name='Department' table='department' key='Department Description'>
                <Attributes>
                    <Attribute name='Department Description' keyColumn='department_id'/>
                </Attributes>
                <Hierarchies>
                    <Hierarchy name='Department2'>
                        <Level attribute='Department Description'/>
                    </Hierarchy>
                </Hierarchies>
            </Dimension>
            <!-- Use private "Time" dimension because key is different than public
                 "Time" dimension. -->
            <Dimension name='Time' table='time_by_day' type='TIME' key='Time Id'>
                <Attributes>
                    <Attribute name='Year' keyColumn='the_year' levelType='TimeYears' hasHierarchy='false'/>
                    <Attribute name='Quarter' levelType='TimeQuarters' hasHierarchy='false'>
                        <Key>
                            <Column name='the_year'/>
                            <Column name='quarter'/>
                        </Key>
                        <Name>
                            <Column name='quarter'/>
                        </Name>
                    </Attribute>
                    <!-- Use the_month as source for the name, so members look like
                        [Time].[1997].[Q1].[Jan] rather than [Time].[1997].[Q1].[1]. -->
                    <Attribute name='Month' hasHierarchy='false'>
                        <Key>
                            <Column name='the_year'/>
                            <Column name='month_of_year'/>
                        </Key>
                        <Name>
                            <Column name='the_month'/>
                        </Name>
                    </Attribute>
                    <Attribute name='Date' keyColumn='the_date' hasHierarchy='false'/>
                    <Attribute name='Time Id' keyColumn='time_id' hasHierarchy='false'/>
                </Attributes>

                <Hierarchies>
                    <Hierarchy name='Time' hasAll='false'>
                        <Level attribute='Year'/>
                        <Level attribute='Quarter'/>
                        <Level attribute='Month'/>
                    </Hierarchy>
                </Hierarchies>
            </Dimension>

            <Dimension source='Store'/>
        </Dimensions>

        <MeasureGroups>
            <MeasureGroup name='HR' table='salary'>
                <Measures>
                    <Measure name='Org Salary' column='salary_paid' aggregator='sum'
                             formatString='Currency'/>
                    <Measure name='Count' column='employee_id' aggregator='count'
                             formatString='#,#'/>
                    <Measure name='Number of Employees' column='employee_id'
                             aggregator='distinct-count' formatString='#,#'/>
                </Measures>
                <DimensionLinks>
                    <ForeignKeyLink dimension='Time' foreignKeyColumn='pay_date' attribute='Date'/>
                    <ForeignKeyLink dimension='Department' foreignKeyColumn='department_id'/>
                    <ForeignKeyLink dimension='Employee' foreignKeyColumn='employee_id'/>
                    <ReferenceLink dimension='Store' viaDimension='Employee' viaAttribute='Store Id'/>
                </DimensionLinks>
            </MeasureGroup>
        </MeasureGroups>

        <CalculatedMembers>
            <CalculatedMember name='Employee Salary' dimension='Measures'
                              formatString='Currency'
                              formula='([Employees].currentmember.datamember, [Measures].[Org Salary])'/>
            <CalculatedMember name='Avg Salary' dimension='Measures'
                              formatString='Currency'
                              formula='[Measures].[Org Salary]/[Measures].[Number of Employees]'/>
        <CalculatedMember name="Test" hierarchy="[Store].[Stores]" formula="[Store].[Stores].[All Stores]"/>
        </CalculatedMembers>
        <CalculatedMember hierarchy="[Actual VS Budget].[Type]" name="Actual">
            <Formula>
                [Store].[Stores].[All Stores]
            </Formula>
        </CalculatedMember>
    </Cube>

    <PhysicalSchema>
        <Table name='department'>
            <Key>
                <Column name='department_id'/>
            </Key>
        </Table>
        <Table name='employee'>
            <Key>
                <Column name='employee_id'/>
            </Key>
        </Table>
        <Table name='position'>
            <Key>
                <Column name='position_id'/>
            </Key>
        </Table>
        <Link source='position' target='employee'>
            <ForeignKey>
                <Column name='position_id'/>
            </ForeignKey>
        </Link>
        <Table name='promotion'>
            <Key>
                <Column name='promotion_id'/>
            </Key>
        </Table>
        <Table name='store'>
            <Key>
                <Column name='store_id'/>
            </Key>
        </Table>
        <Link source='store' target='employee'>
            <ForeignKey>
                <Column name='store_id'/>
            </ForeignKey>
        </Link>
        <Table name='product' keyColumn='product_id'/>
        <Table name='product_class' keyColumn='product_class_id'/>
        <Link target='product' source='product_class'>
            <ForeignKey>
                <Column name='product_class_id'/>
            </ForeignKey>
        </Link>
        <Table name='time_by_day'>
            <Key>
                <Column name='time_id'/>
            </Key>
        </Table>
        <Table name='warehouse'>
            <Key>
                <Column name='warehouse_id'/>
            </Key>
        </Table>
    </PhysicalSchema>
</Schema>

重点维度Employee中是没有table属性,Attribute里面table的不同表名称。

employee作为实时表,store和region划分为维表。

employee和store关系为星星模型,employee->strore->region关系为雪花模型

注意:在PhysicalSchema里面,Link表之间的关系得描述清楚哦。

<Link source='store' target='employee'>
            <ForeignKey>
                <Column name='store_id'/>
            </ForeignKey>
  </Link>

source 来源表(主表)target 目标表(子表)

自己理解的不完全正确,可以参考。维表的度量其实在数据模型中就不体现,维表的维度作为切面层级对实时表的度量进行分析。

猜你喜欢

转载自blog.csdn.net/Joe192/article/details/89523036