页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 前一个 版本 3 下一个 »

4.1 Mondrain属性详解

4.1.1 Schema

Schema 定义了一个多维数据库。包含了一个逻辑模型,而这个逻辑模型的目的是为了书写 MDX 语言的查询语句。这个逻辑模型实际上提供了这几个概念: Cubes (立方体)、维度( Dimensions )、层次( Hierarchies )、级别( Levels )、和成员( Members )。而一个 schema 文件就是编辑这个 schema 的一个 xml 文件。在这个文件中形成逻辑模型和数据库物理模型的对应。属性如下:

属性名

含义

name

Schema的名字

measuresCaption

在表示层显示的内容

 

4.1.2 Cube

一个 Cube 是一系列维度 (Dimension) 和度量 (Measure) 的集合区域。在 Cube 中, Dimension 和 Measure 的共同地方就是共用一个事实表。 Cube 中的有以下几个属性:

属性名

含义

name

Cube 的名字

caption

标题 , 在表示层显示的

cache

是否对 Cube 对应的实表用 mondrian 进行存储 , 默认为 true

enabled

是布尔型的 , 如果是被激活 ,Cubes 就执行 , 否则就不予理睬,默认为 true

defaultMeasure

 

 

Cube 里面有一个全局的标签定义了所用的事实表的表名。元素:

元素名

含义

table

定义该Cube中的事实表

 

如果事实表不在默认的数据库schema 中,你需要通过使用"schema"属性明确指出:

<Table schema="dmart" name="sales_fact_1997" />

 

4.1.3 Dimension

他是一个层次( Hierarchies )的集合 , 维度一般有其相对应的维度表 . 他的组成是由层次( Hierarchies )而层次( Hierarchies )又是有级别( Level )组成 . 其属性如下:

属性名

含义

name

Dimension 的名称

type

类型,有两个可选的类型: StandarDimension 和 TimeDimension ,默认为 StandardDimension

caption

标题 , 在表示层显示的

UsagePrefix

加前缀 , 消除歧义

foreignKey

外键,对应事实表中的一个列,它通过 <Hierarchy> 元素中的主键属性(primaryKey)连接起来。

4.1.4 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 。


primaryTable

如果层次有多于一个的表,你应该使用primaryTable 属性以消除歧义。

4.1.5 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 。在最顶层的级别中,一直都应该设置为UniqueMembers=true ,因为这里没有父级别

levelType

该 Level 的类型,默认为 regular (正常的),如果你在其 Dimension 属性 type 里选择了 TimeDimension 那么这里就可以选择 TimeYears 、 TimeQuarters 、 TimeMonth 、 TimeWeeds 、 TimeDays 。

hideMemberIf

在什么时候不隐藏该成员,可选的值有三个: Never 、 IfBlankName 、 IfParentName

highCardinality

高基数属性,是用于通知Mondiran 这里的维度元素的值很大而且没有定义, 可以选择该属性的值为 true 或false(默认值),当highCardinality=true 的时候,对超出维度元素的操作将不会被执行。

approxRowCount

该属性可以用来提高性能,可以通过指定一个数值以减少判断级别、层次、维度基数的时间,该属性在通过使用 XMLA 连接 Mondrian 很有用处。

caption

标题 , 在表示层显示的

captionColumn

用来显示标题的列

formatter

该属性定义了 Member.getCaption() 方法返回的动作值,这里需要是一个实现了 mondrian.olap.MemberFormatter 接口的类,用来对 Caption 地值进行格式化。

4.1.6 Measure

Measure 就是我们要计算的数值,操作的核心。它的属性如下:

属性名

含义

name

名称

aggregator

要采用的计算函数

column

要计算的列名

formatString

计算结果的显示格式。

visible

是否可见

datatype

数据类型,默认为 Numeric

formatter

采用类来对该 Measure 的值进行格式,具体参考 Level 的 formatter 属性。

caption

标题,用来显示时使用。

4.1.7 Join

对于一个 Hierarchy 来说,有两种方式为其指定:一种是直接通过一个 Table 标签指定;一种是通过 Join 将若干张表连接起来指定。一旦采用 Join 的话,那么就要在 Hierarchy 里的 primaryKeyTable 属性指定主表。

 

4.2 mondrian中的父子层次关系

父子层次。一个使用方便的层次 有一个严格的层的集合, 成员与层紧密的联系.比如,在 Product 层次中, 任何产品名称层的成员在商标层上都有一个父亲 ,商标层上的成员在产品子目录层也都有一个父亲. 这种结构对于现实世界中的数据有时候太严格了。 一个父子层次只有一层 (不计算 'all' 层), 但是任何成员可以在同一层上有父亲成员. 一个典型的例子是Employees 层次:

<Dimension name="Employees" foreignKey="employee_id">
    <Hierarchy hasAll="true" allMemberName="All Employees" primaryKey="employee_id">
          <Table name="employee"/>
          <Level name="Employee Id" uniqueMembers="true" type="Numeric" column="employee_id" nameColumn="full_name" parentColumn="supervisor_id" nullParentValue="0">
          <Property name="Marital Status" column="marital_status"/>
          <Property name="Position Title" column="position_title"/>
          <Property name="Gender" column="gender"/>
          <Property name="Salary" column="salary"/>
          <Property name="Education Level" column="education_level"/>
          <Property name="Management Role" column="management_role"/>
          </Level>
      </Hierarchy>
</Dimension>

 

这里parentColumn 和nullParentValue是重要的属性:

  • 属性parentColumn 是一个成员连接到它父亲成员的列名。在这种情况下, 它是指向雇员经理的外键。元素<Level>的子元素 <ParentExpression> 是与属性 parentColumn 有相同作用的,但是元素允许定义任意的SQL表达式, 就像元素 <Expression>. 属性 parentColumn (或者元素<ParentExpression>) 是维一向Mondrian指出层次有父子结构的。
  • 属性 nullParentValue 是指明成员没有父成员的值 。 缺省情况下 nullParentValue="null", 但是因为许多数据库不支持null, 建模时 用其他值来代替空值,0和-1。

 

 

  

  • 无标签