Схема Мондриана uniqueMembers

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

olap1

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

olap2

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


person BOENDAGGER    schedule 23.09.2014    source источник


Ответы (1)


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

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

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

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

person nsousa    schedule 24.09.2014
comment
Спасибо за быстрый и ясный ответ nsousa. Я отредактировал свой вопрос, не могли бы вы проверить, правильно ли я понял? Что-нибудь еще связанное с этим, что было бы хорошо принять во внимание? - person BOENDAGGER; 25.09.2014
comment
Даже если вы установите для uniqueMembers значение true, это не будет иметь значения. Что uniqueMembers = true, так это то, что он позволяет mondrian фильтровать непосредственно на уровне, вместо того, чтобы добавлять несколько условий в предложение Where SQL, по одному для каждого уровня. Если вы хотите, чтобы ваш 2-й уровень обрабатывался так, как если бы он был 1-м уровнем, вам необходимо создать разные иерархии. - person nsousa; 30.09.2014