2014-09-23 4 views
0

Я использую 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 то я вижу следующее, что правильно:

olap1

Если я перетащить пол над beneficiary_type2 то я вижу следующее, что неверно:

olap2

Как это столбец beneficiary_type2, сгруппированные по benefiiary_type1, как можно видеть при добавлении обоих полей :

enter image description here

При просмотре пол над beneficiary_type2, я ожидаю увидеть только 2 строки, а именно один для «A dults ", а другой - для детей до 19 лет. Из того, что я читал, кажется, что атрибут uniqueMembers должен быть установлен на уровне beneficiary_type2, но это приводит к следующему:

enter image description here

Который дает правильные пронумерованные результаты, но строки по-прежнему отображаются, если сгруппированы 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 отдельных таблицы (по одному для каждого члена-бенефициара) или же одна таблица может использоваться для нескольких измерений? Очевидно, что наличие таблицы базы данных для каждого члена не является идеальным, существуют ли какие-либо преимущества в этом отношении?

ответ

2

Ваш уровень beneficiary_type2 является потомком beneficiary_type1. Таким образом, даже если имена участников совпадают, два «Взрослых» на уровне 2 не являются тем же самым членом, если они также не имеют одного и того же родителя.

Поскольку у них разные родители, они являются кузенами, которые разделяют имя. Следовательно, вы получаете несколько строк.

Единственный безопасный способ сделать то, что вы хотите, состоит в том, чтобы разделить различные уровни на несколько измерений/иерархии, а не на иерархию родителей и детей.

В разных иерархиях нет связи между type1 и type2, и вы получаете только две различные строки, которые вы хотите.

+0

Спасибо за подсказку и ясный ответ nsousa. Я отредактировал мой вопрос, не могли бы вы проверить, правильно ли я понимаю? Что-нибудь еще, связанное с этим, было бы полезно принять во внимание? – BOENDAGGER

+0

Даже если вы установите uniqueMembers на true, это не изменит ситуацию. Что такое uniqueMembers = "true", так это то, что он позволяет mondrian напрямую фильтроваться на уровне, вместо добавления нескольких условий в предложение Where для SQL, по одному для каждого уровня. Если вы хотите, чтобы ваш 2-й уровень обрабатывался так, как если бы это был 1-й уровень, вам нужно создать разные иерархии. – nsousa