Mondrian と Pentaho および Saiku を使用して、MySQL データベースで OLAP 分析を行っています。ファクト テーブルにリンクする 2 つのディメンション (受益者とメンバー) を持つデータ ウェアハウスがあります。受益者には次のフィールドがあります: 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>
(個別に)閲覧できるようにしたい:受益者_type1の男女数、受益者_type2の男女数、受益者_type3の男女数、
性別を受益者タイプ 1 の上にドラッグすると、次のように表示されますが、これは正しいものです。
性別を受益者タイプ 2 にドラッグすると、次のように表示されますが、これは正しくありません。
これは beneficiary_type2 列であるため、両方のフィールドを追加するとわかるように、benefiiary_type1 でグループ化されます。
beneficiary_type2 で性別を表示すると、「成人」用と「19 歳までの子供」用の 2 つの行しか表示されないことが予想されます。私が読んだことから、uniqueMembers 属性は beneficiary_type2 レベルで設定する必要があるようですが、これにより次の結果が得られます。
これにより、正しい番号付けされた結果が得られますが、行は依然として受益者タイプ 1 によってグループ化されているかのように表示されます。また、この方法では、3 番目のイメージのように、beneficiary_type1 の下に正しくグループ化された beneficiary_type2 を生成できません (番号付けされた結果は、親レベルに従ってグループ化されることはありません)。
分析に含めた親レベルによって決定される行数を持つように、スキーマをどのように構築すればよいですか? (saiku を使用してキューブにドラッグ)つまり、beneficiary_type1 と beneficiary_type2 をドラッグすると、beneficiary_type2 は beneficiary_type1 に従ってグループ化され(3 番目の画像のように)、beneficiary_type2 のみの場合は、固有の値に従ってグループ化されます(2 行、「Adults」用に 1 行)。 」と「19歳までの子供」用の1つ)。
私は 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 つの別個のテーブル (受益者メンバーごとに 1 つ) がデータベースにも存在する必要があることを意味しますか?それとも、同じテーブルを複数のディメンションに使用できますか? 明らかに、メンバーごとにデータベース テーブルを用意するのは理想的ではありません。このようにする利点はありますか?