关于mondrian schema的问题,请大家帮帮我
最近准备使用mondrian,关于mondrian的schema的创建对我来说实在是有点困难,所以请大家帮帮我。
这是我在网上找的例子,下面是数据库结构
create table tb_employee 雇员维表
(
employee_id number, --职员id
employee_name varchar2(10) --职员姓名
);
create table tb_time 时间维表
(
time_id number, --时间id
the_year char(4), --年
the_month char(2) --月
);
create table tb_salary 薪酬事实表
(
employee_id number, --职员id
time_id number, --时间id
salary number(19,4) --薪酬
);
这是相对应的schema文件
<?xml version="1.0"?>
<Schema name="Mondrian">
<Cube name="CubeTest">
<Table name="TB_SALARY" />
<Dimension name="Employee" foreignKey="EMPLOYEE_ID" >
<Hierarchy hasAll="true" primaryKey="EMPLOYEE_ID">
<Table name="TB_EMPLOYEE" />
<Level name="employeeId" column="EMPLOYEE_ID" uniqueMembers="true" >
<Property name="employeeName" column="EMPLOYEE_NAME"/>
</Level>
</Hierarchy>
</Dimension>
<Dimension name="Time" foreignKey="TIME_ID" >
<Hierarchy hasAll="false" primaryKey="TIME_ID" >
<Table name="TB_TIME" />
<Level name="year" column="THE_YEAR" uniqueMembers="false" />
<Level name="month" column="THE_MONTH" uniqueMembers="false" />
</Hierarchy>
</Dimension>
<Measure name="Salary" column="SALARY" aggregator="sum" />
</Cube>
</Schema>
下面是MDX查询语句
select {[Measures].[Salary]} ON COLUMNS,
{[Employee].[employeeId].Members} ON ROWS
from CubeTest
我想问几个问题:
1.Employee维度下的Hierarchy是干什么用的?上面的查询语句貌似都直接操作级别,和层次没什么关系呀(特别想问的)
2.level中的property应该怎么使用?
3.大家对创建Schema有什么相关的经验么?(特别想问的)
小弟是一个初学者,请大家多帮帮忙,请说的详细一些。
[解决办法]
Employee维度下的Hierarchy是干什么用的?上面的查询语句貌似都直接操作级别,和层次没什么关系呀(特别想问的)
Hierarchy就是一个持有level关系mapping的结构,如:level [Year]、level [Mouth],如果没有在同一个hierarchy中指明它们之间的关系(Year是mouth的父),则它们都是独立的,它们的成员就不能体现出[2009].&[1](2009年1月)的关系。
同时在查询模型中,hierarchy又是一个查询point,它代表的是一类成员的划分集。如:当members作用于其上时,表示取该hierarchy下的所有成员(等价于其下所有level的成员),level就只是成员层次的一个划分子集。
“日-->月-->年” 中的日、月、年是分别是3个level,hierarchy描述的是(日-->月-->年)整个的关系。
[解决办法]
首先,hasall=true这句说明引擎在处理该hierarchy时会为其下定义level计算出一个父级level。也就是说“EMPLOYEE_ID”这个hierarchy除了您定义的“employeeId” level 外,还会生成一个(All)level,而(All)level是您显示定义的level的父级level。通俗点说就是聚合值。它与查询时是查询hierarchy还是level没有关系。
其次,至于employeeId是hierarchy还是level,在标准中的查询模型中,定义的结构关系就是dimension-->hierarchy-->level.所以一般处理引擎都是按这种查询模型进行处理,至于为什么,我也不说不上来,只要你抓住一点就行了--hierarchy,level取members操作最终得到的都是一个member集合。
最后,members不是属性,是取成员集的操作,也就是说,《hierarchy》.members、《level》.members,就是取hierarchy、level下的所有成员形成一个集合。
如果不加.members操作,默认情况下hierarchy是取其下的默认成员,level是取其下的成员。