Я использую Mondrian с Pentaho и Saiku для анализа OLAP в базе данных MySQL. У меня есть хранилище данных с двумя измерениями (получатель и участник), связанное с таблицей фактов. У получателя есть следующие поля: 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, сгруппированный по Beneficiary_type1, что можно увидеть при добавлении обоих полей:
Когда я просматриваю пол над beneficiary_type2, я ожидаю увидеть только 2 строки, а именно одну для «Взрослых» и другую для «Детей до 19 лет». Из того, что я прочитал, кажется, что атрибут uniqueMembers должен быть установлен на уровне beneficiary_type2, но это приводит к следующему:
Это дает правильные пронумерованные результаты, но строки по-прежнему отображаются, как если бы они сгруппированы по Beneficiary_type1. Кроме того, этот способ не позволяет сгенерировать beneficiary_type2, правильно сгруппированную под beneficiary_type1, как в третьем изображении (нумерованные результаты никогда не группируются по родительскому уровню).
Как мне структурировать схему, чтобы количество строк определялось родительским уровнем, который я включил в анализ? (перетаскивается в куб с помощью 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 отдельные таблицы (по одной для каждого участника-бенефициара), или же можно использовать одну и ту же таблицу для нескольких измерений? Очевидно, что наличие таблицы базы данных для каждого члена - не идеальный вариант, есть ли в этом преимущества?