维度、层次、级别
维度是有层次的,在大多数情况下维度的成员会按照金字塔形布局排列。水平布局由度层次结构中具有相同级别的列值生成,而垂直布局由维度层次结构中具有不同级别的列值生成。
级别是维度层级结构的一个元素,描述了数据的层次结构,从数据的最高级别(汇总成都最大)直到最低级别(最详细)。级别仅存在于维度内且基于维度表中的列或维度中的成员属性。
在维度内定义级别,以指定维度层次结构的内容和结构,即级别的定义确定层次结构中包含的成员及其在层次结构中的相互位置。
“全部”级别是一种特殊类型的级别,其名称始终是“全部”。如果维度中包含“全部”级别,那么“全部”级别就是最高级别。由于“全部”级别中的成员位于维度层次结构的顶层,因此成员的值是层次结构中所有成员值合并计算的聚合。
每个维包含有多层组成的一个层次, 大多数维都是仅有一个层次,但有时候一个维有多个层次。比如:你可能希望在时间维上从天聚集到月,季度和年;或者从天聚集到周和年。这两种层次都是从天到年,但是聚集的路径不同。大多数层次有全成员,全成员包括层次的所有成员,因此能够代表他们的总合。它通常命名为'All something',比如:'All stores'.
雪花模式
mondrian支持星型模式和雪花模式。下面介绍一下雪花模式的建模,它需要用到操作符 <Join>.比如:
<Cube name="Sales">
...<Dimension name="Product" foreignKey="product_id">
<Hierarchy hasAll="true" primaryKey="product_id" primaryKeyTable="product">
<Join leftKey="product_class_id" rightAlias="product_class" rightKey="product_class_id">
// rightAlias="product_class"指明与product_class相连
<Table name="product"/>
<Join leftKey="product_type_id" rightKey="product_type_id">
<Table name="product_class"/> //1
<Table name="product_type"/> //2
</Join> // 1和2相连
</Join>
...
</Hierarchy>
</Dimension>
</Cube>
这里定义一个 "Product" 维 由三个表构成. 事实表连接 表"product" (通过外键 "product_id"),表"product"连接表"product_class" (通过外键"product_class_id"),表"product_class"连接表 "product_type" (通过外键 "product_type_id"). 我们利用 <Join> 元素的循环嵌套, <Join>带有两个操作对象;操作对象可能是表,连接或者查询 。
按照操作对象行的数目来安排次序,表 "product" 的行数最大, 因此它首先出现连接事实表;然后是表 "product_class"和 "product_type",在雪花的末端拥有的行数最小.
注意外部元素 <Join>有一个属性 rightAlias. 这是必要的,因为join 的右边(是内部元素 <Join> ) 有可能是许多表组成的.这种情况下不需要属性leftAlias,因为列 leftKey 很明确的来自表 "product".