转自:http://hi.baidu.com/dinguangx/item/37e78be29aebc1adcf2d4f89
更多可以参考官方 http://mondrian.pentaho.com/documentation/xml_schema.php#Cube
Schema
<Schema name="ChiFanSaaS">
<Dimension type="StandardDimension" visible="true" highCardinality="false" name="Customer">
<Hierarchy name="Default" visible="true" hasAll="true" allMemberName="All" primaryKey="customer_id">
<Table name="customer">
</Table>
<Level name="Customer Id" visible="true" column="customer_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Account Num" visible="true" column="account_num" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Lname" visible="true" column="lname" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Fname" visible="true" column="fname" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Mi" visible="true" column="mi" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Address1" visible="true" column="address1" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Address2" visible="true" column="address2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Address3" visible="true" column="address3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Address4" visible="true" column="address4" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="City" visible="true" column="city" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Postal Code" visible="true" column="postal_code" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Country" visible="true" column="country" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Customer Region Id" visible="true" column="customer_region_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Phone1" visible="true" column="phone1" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Phone2" visible="true" column="phone2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Birthdate" visible="true" column="birthdate" type="Date" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Marital Status" visible="true" column="marital_status" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Gender" visible="true" column="gender" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Num Children At Home" visible="true" column="num_children_at_home" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Education" visible="true" column="education" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Date Accnt Opened" visible="true" column="date_accnt_opened" type="Date" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Member Card" visible="true" column="member_card" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Occupation" visible="true" column="occupation" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Houseowner" visible="true" column="houseowner" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Num Cars Owned" visible="true" column="num_cars_owned" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" highCardinality="false" name="Product Class">
<Hierarchy name="Default" visible="true" hasAll="true" allMemberName="All" primaryKey="product_id" primaryKeyTable="a">
<Join leftAlias="a" leftKey="product_class_id" rightAlias="b" rightKey="product_class_id">
<Table name="product" alias="a">
</Table>
<Table name="product_class" alias="b">
</Table>
</Join>
<Level name="Product Class Id" visible="true" table="b" column="product_class_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Family" visible="true" table="b" column="product_family" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Department" visible="true" table="b" column="product_department" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
<Hierarchy name="Product Class" visible="true" hasAll="true" primaryKey="product_id" primaryKeyTable="a">
<Join leftAlias="a" leftKey="product_class_id" rightAlias="b" rightKey="product_class_id">
<Table name="product" alias="a">
</Table>
<Table name="product_class" alias="b">
</Table>
</Join>
<Level name="Product Department" visible="true" table="b" column="product_department" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Family" visible="true" table="b" column="product_family" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Class Id" visible="true" table="b" column="product_class_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="Time By Day">
<Hierarchy name="Default" visible="true" hasAll="true" allMemberName="All" primaryKey="time_id">
<Table name="time_by_day">
</Table>
<Level name="Time Id" visible="true" column="time_id" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="The Day" visible="true" column="the_day" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="The Month" visible="true" column="the_month" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="The Year" visible="true" column="the_year" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Day Of Month" visible="true" column="day_of_month" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Week Of Year" visible="true" column="week_of_year" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Month Of Year" visible="true" column="month_of_year" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Quarter" visible="true" column="quarter" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Fiscal Period" visible="true" column="fiscal_period" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
</Hierarchy>
<Hierarchy name="Calendar" visible="true" hasAll="true" primaryKey="the_year">
<Table name="time_by_day">
</Table>
<Level name="The Year" visible="true" column="the_year" type="Integer" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="Quarter" visible="true" column="quarter" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="The Month" visible="true" column="the_month" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
<Level name="The Day" visible="true" column="the_day" type="String" uniqueMembers="false" levelType="TimeUndefined" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" highCardinality="false" name="Product">
<Hierarchy name="Default" visible="true" hasAll="true" allMemberName="All" primaryKey="product_id">
<Table name="product">
</Table>
<Level name="Product Id" visible="true" column="product_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Brand Name" visible="true" column="brand_name" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="SKU" visible="true" column="SKU" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="SRP" visible="true" column="SRP" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Gross Weight" visible="true" column="gross_weight" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Net Weight" visible="true" column="net_weight" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Recyclable Package" visible="true" column="recyclable_package" type="Boolean" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Low Fat" visible="true" column="low_fat" type="Boolean" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Units Per Case" visible="true" column="units_per_case" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Cases Per Pallet" visible="true" column="cases_per_pallet" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Shelf Width" visible="true" column="shelf_width" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Shelf Height" visible="true" column="shelf_height" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Shelf Depth" visible="true" column="shelf_depth" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Class Id" visible="true" column="product_class_id" type="Integer" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="Product Name" visible="true" column="product_name" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Cube name="Foodmart Sales" visible="true" cache="true" enabled="true">
<Table name="sales_fact_1997">
</Table>
<DimensionUsage source="Customer" name="Customer" visible="true" foreignKey="customer_id" highCardinality="false">
</DimensionUsage>
<DimensionUsage source="Product Class" name="Product Class" visible="true" foreignKey="product_id" highCardinality="false">
</DimensionUsage>
<DimensionUsage source="Time By Day" name="Time By Day" visible="true" foreignKey="time_id" highCardinality="false">
</DimensionUsage>
<DimensionUsage source="Product" name="Product" visible="true" foreignKey="product_id" highCardinality="false">
</DimensionUsage>
<Measure name="Store Sales" column="store_sales" formatString="Currency" aggregator="sum">
</Measure>
<Measure name="Store Cost" column="store_cost" formatString="Currency" aggregator="sum">
</Measure>
<Measure name="Unit Sales" column="unit_sales" formatString="Currency" aggregator="sum">
</Measure>
</Cube>
<VirtualCube enabled="true" name="Foodmart SSAS" visible="true">
<VirtualCubeDimension cubeName="Foodmart Sales" visible="true" highCardinality="false" name="Customer">
</VirtualCubeDimension>
<VirtualCubeDimension cubeName="Foodmart Sales" visible="true" highCardinality="false" name="Product Class">
</VirtualCubeDimension>
<VirtualCubeDimension cubeName="Foodmart Sales" visible="true" highCardinality="false" name="Time By Day">
</VirtualCubeDimension>
<VirtualCubeDimension cubeName="Foodmart Sales" visible="true" highCardinality="false" name="Product">
</VirtualCubeDimension>
<VirtualCubeMeasure cubeName="Foodmart Sales" name="[Measures].[Store Sales]" visible="true">
</VirtualCubeMeasure>
<VirtualCubeMeasure cubeName="Foodmart Sales" name="[Measures].[Store Cost]" visible="true">
</VirtualCubeMeasure>
<VirtualCubeMeasure cubeName="Foodmart Sales" name="[Measures].[Unit Sales]" visible="true">
</VirtualCubeMeasure>
</VirtualCube>
</Schema>
Schema 定义了一个多维数据库。包含了一个逻辑模型,而这个逻辑模型的目的是为了书写 MDX 语言的查询语句。这个逻辑模型实际上提供了这几个概念: Cubes (立方体)、维度( Dimensions )、层次( Hierarchies )、级别( Levels )、和成员( Members )。而一个 schema 文件就是编辑这个 schema 的一个 xml 文件。在这个文件中形成逻辑模型和数据库物理模型的对应。
Cube
一个 Cube 是一系列维度 (Dimension) 和度量 (Measure) 的集合区域。在 Cube 中, Dimension 和 Measure 的共同地方就是共用一个事实表。 Cube 中的有以下几个属性:
属性名 |
含义 |
name |
Cube 的名字 |
caption |
标题 , 在表示层显示的 |
cache |
是否对 Cube 对应的实表用 mondrian 进行存储 , 默认为 true |
enabled |
是布尔型的 , 如果是被激活 ,Cubes 就执行 , 否则就不予理睬,默认为 true |
Cube 里面有一个全局的标签定义了所用的事实表的表名
Dimension
他是一个层次( Hierarchies )的集合 , 维度一般有其相对应的维度表 . 他的组成是由层次( Hierarchies )而层次( Hierarchies )又是有级别( Level )组成 . 其属性如下:
属性名 |
含义 |
name |
Dimension 的名称 |
type |
类型,有两个可选的类型: StandarDimension 和 TimeDimension ,默认为 StandardDimension |
caption |
标题 , 在表示层显示的 |
UsagePrefix |
加前缀 , 消除歧义 |
foreignKey |
外键,对应事实表中的一个列,它通过 <Hierarchy> 元素中的主键属性连接起来。 |
Hierarchy
你一定要指定其中的各种关系 , 如果没有指定 , 就默认 Hierarchy 里面装的是来自立方体中的真实表 . 属性如下:
属性名 |
含义 |
name |
Hierarchy 的名称,该值可以为空,为空时表示 Hirearchy 的名字和 Dimension 的名字相同。当一个 Dimension 有多个 Hierarchy 时,注意 name 值要唯一。 |
hasAll |
布尔型的 , 决定是否包含全部的成员 member |
allMemberName |
所有成员的名字 , 也就是总的标题 , 例如: allMemberName= “全部产品” |
allLevelName |
所有级别的名字,它会覆盖其下所有的 Member 的 name 和所有的 Level 的 name 属性的值。 |
allMemberCaption |
例如 : allMemberCaption= “全部产品”这个是在表示层显示的内容 |
PrimaryKey |
通过主键来确定成员,该主键指的是成员表中的主键,该主键同时要与 Dimension 里设置的 foreignKey 属性对应的字段形成外键对应关系 |
primaryKeyTable |
如果成员表不只一个,而是多个表通过 join 关系形成的,那么就要通过这个属性来指明 join 的这些表中,哪一个与 Dimension 里设置的 foreignKey 属性形成外键关系。通过该属性来指明主表 |
caption |
标题 , 在表示层显示的 |
defaultMember |
|
memberReaderClass |
设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库里读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 |
Level
级别 , 他是组成 Hierarchy 的部分。属性很多,并且是 schema 编写的关键,使用它可以构成一个结构树, Level 的先后顺序决定了 Level 在这棵树上的的位置,最顶层的 Level 位于树的第一级,依次类推。 Level 的属性如下:
属性名 |
含义 |
name |
名称 |
table |
该 Level 要使用的表名 |
column |
用上面指定的表中某一列作为该 Level 的关键字 |
nameColumn |
用来显示的时候使用,如果不定义,那么就采用上面的 column 的值来进行显示。 |
oridinalColumn |
定义该 Level 上的成员的显示顺序,如果不指定,那么采用 column 的值。 |
parentColumn |
在一个有父 - 子关系的 Hierarchy 当中,当前 Level 引用的是其父成员的列名。好比是一张部门表,在一张表里表现部门的上下级关系,一个是主键,肯定还有一个字段为连接到该主键的外键的列名,这里的 parentColumn 指的就是这个列名。 |
nullParentValue |
如果当前的 Level 是有上下级关系(设置了 parentColumn 属性),如果该 Level 又处于*,我们需要将*的数据取出来,这里指的是位于*的父成员的值,有些数据库不支持 null, 那么也可以使用 ’0’ 或 ’-1’ 等,这就表示*的成员的父 ID 为 ’0’ 或为 ’-1’ 。 |
type |
数据类型,默认值为 string 。当然还可以是 Numeric 、 Integer 、 Boolean 、 Date 等。 |
uniqueMembers |
该属性用于优化产生的 SQL ,如果你知道这个级别和其父级别交叉后的值或者是维度表中给定的级别所有的值是唯一的,那么就可以设置该值为 true ,否则为 false 。 |
levelType |
该 Level 的类型,默认为 regular (正常的),如果你在其 Dimension 属性 type 里选择了 TimeDimension 那么这里就可以选择 TimeYears 、 TimeQuarters 、 TimeMonth 、 TimeWeeds 、 TimeDays 。 |
hideMemberIf |
在什么时候不隐藏该成员,可选的值有三个: Never 、 IfBlankName 、 IfParentName |
approxRowCount |
该属性可以用来提高性能,可以通过指定一个数值以减少判断级别、层次、维度基数的时间,该属性在通过使用 XMLA 连接 Mondrian 很有用处。 |
caption |
标题 , 在表示层显示的 |
captionColumn |
用来显示标题的列 |
formatter |
该属性定义了 Member.getCaption() 方法返回的动作值,这里需要是一个实现了 mondrian.olap.MemberFormatter 接口的类,用来对 Caption 地值进行格式化。 |
Join
对于一个 Hierarchy 来说,有两种方式为其指定:一种是直接通过一个 Table 标签指定;一种是通过 Join 将若干张表连接起来指定。一旦采用 Join 的话,那么就要在 Hierarchy 里的 primaryKeyTable 属性指定主表。
Measure
Measure 就是我们要计算的数值,操作的核心。它的属性如下:
属性名 |
含义 |
name |
名称 |
aggregator |
要采用的计算函数 |
column |
要计算的列名 |
formatString |
计算结果的显示格式。 |
visible |
是否可见 |
datatype |
数据类型,默认为 Numeric |
formatter |
采用类来对该 Measure 的值进行格式,具体参考 Level 的 formatter 属性。 |
caption |
标题,用来显示时使用。 |