Я использую Mondrian с Pentaho и Saiku для анализа OLAP в базе данных MySQL. У меня есть хранилище данных с двумя размерами (получателем и членом), связанным с таблицей фактов. Бенефициар имеет следующие поля: beneficiary_type1, beneficiary_type2, beneficiary_type3. У члена есть поле для пола.Mondrian Schema uniqueMembers
Я создал Мондриана схемы определяется следующими:
<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 строки, а именно один для «A dults ", а другой - для детей до 19 лет. Из того, что я читал, кажется, что атрибут uniqueMembers должен быть установлен на уровне beneficiary_type2, но это приводит к следующему:
Который дает правильные пронумерованные результаты, но строки по-прежнему отображаются, если сгруппированы by beneficiary_type1. Кроме того, этот способ не позволяет правильно генерировать группу beneficiary_type2 в файле beneficiary_type1, как в третьем изображении (нумерованные результаты никогда не группируются в соответствии с родительским уровнем).
Как я должен структурировать схему, чтобы количество строк, определяемых родительским уровнем, которое я включил в анализ? (перетаскивается в куб с использованием saiku), т. е. при перетаскивании в файле beneficiary_type1 и beneficiary_type2, то файл beneficiary_type2 сгруппирован в соответствии с параметром beneficiary_type1 (например, третье изображение), если только beneficiary_type2 затем группируется в соответствии с его собственными уникальными значениями (2 строки, один для «Взрослые» »и один для« Дети до 19 »).
Я относительно новичок в OLAP, поэтому могут быть некоторые базовые понятия, которые я не понимаю. Пожалуйста, не стесняйтесь разветвляться с любыми объяснениями.
-------------------- Обновление --------------------
As объясняется @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 отдельных таблицы (по одному для каждого члена-бенефициара) или же одна таблица может использоваться для нескольких измерений? Очевидно, что наличие таблицы базы данных для каждого члена не является идеальным, существуют ли какие-либо преимущества в этом отношении?
Спасибо за подсказку и ясный ответ nsousa. Я отредактировал мой вопрос, не могли бы вы проверить, правильно ли я понимаю? Что-нибудь еще, связанное с этим, было бы полезно принять во внимание? – BOENDAGGER
Даже если вы установите uniqueMembers на true, это не изменит ситуацию. Что такое uniqueMembers = "true", так это то, что он позволяет mondrian напрямую фильтроваться на уровне, вместо добавления нескольких условий в предложение Where для SQL, по одному для каждого уровня. Если вы хотите, чтобы ваш 2-й уровень обрабатывался так, как если бы это был 1-й уровень, вам нужно создать разные иерархии. – nsousa