我正在使用 Mondrian 和 Pentaho 和 Saiku 对 MySQL 数据库进行 OLAP 分析。我有一个链接到事实表的二维数据仓库(受益人和成员)。Beneficiary 有以下字段:beneficiary_type1、beneficiary_type2、beneficiary_type3。成员有一个性别字段。
我创建了一个蒙德里安模式,定义如下:
<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
<Hierarchy visible="true" hasAll="true" primaryKey="id">
<Table name="beneficiary">
</Table>
<Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
<Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
<Dimension type="StandardDimension" visible="true" foreignKey="member_id" highCardinality="false" name="member">
<Hierarchy visible="true" hasAll="true" primaryKey="id">
<Table name="member">
</Table>
<Level name="gender" visible="true" column="gender" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
我希望能够(单独)查看:beneficiary_type1 的男性/女性数量,beneficiary_type2 的男性/女性数量,beneficiary_type3 的男性/女性数量,
如果我将性别拖到 beneficiary_type1 上,那么我会看到以下内容,这是正确的:
如果我将性别拖到 beneficiary_type2 上,那么我会看到以下内容,这是不正确的:
因为这是 beneficiary_type2 列,按 benefiiary_type1 分组,添加两个字段时可以看到:
在通过 beneficiary_type2 查看性别时,我希望只看到 2 行,即“成人”和“19 岁以下的儿童”。根据我的阅读,似乎应该在 beneficiary_type2 级别设置 uniqueMembers 属性,但这会导致以下结果:
这会产生正确的编号结果,但行仍然显示为好像按 beneficiary_type1 分组一样。此外,这种方式不允许像在第三个图像中那样在 beneficiary_type1 下正确分组的 beneficiary_type2 的生成(编号的结果永远不会根据父级别进行分组)。
我应该如何构建架构以使我包含在分析中的父级别确定的行数?(使用saiku拖入立方体)即当拖入beneficiary_type1和beneficiary_type2时,beneficiary_type2根据beneficiary_type1分组(如第三张图像),如果只有beneficiary_type2则根据其自己的唯一值分组(2行,一个用于“成人” ”和一个用于“19 岁以下的儿童”)。
我对 OLAP 比较陌生,所以可能有一些我不明白的基本概念。请不要犹豫,提出任何解释。
-------------------- 更新 --------------------
正如@nsousa 所解释的,内部的成员相同的层次结构意味着父子关系。以下是对架构的正确更改吗?
<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
<Hierarchy visible="true" hasAll="true" primaryKey="id">
<Table name="beneficiary">
</Table>
<Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
<Hierarchy visible="true" hasAll="true" primaryKey="id">
<Table name="beneficiary">
</Table>
<Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
<Hierarchy visible="true" hasAll="true" primaryKey="id">
<Table name="beneficiary">
</Table>
<Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
我是否正确理解替代解决方案是为受益人表加载 3 个单独的维度?这是否意味着数据库中也需要存在 3 个单独的表(每个受益人一个),还是可以将同一个表用于多个维度?显然,每个成员都有一个数据库表并不理想,这样做有什么好处吗?