title background

Статьи / Таблица фактов со смешанными гранулами

24.08.2018 г., перевод статьи Vincent Rainardi – Mixed Grain Fact Table

Таблица фактов со смешанными гранулами – это таблица фактов, в которой у нас есть меры с различной гранулярностью. Например, одна мера является еженедельной, а другая – ежемесячной. В этом посте я хотел бы рассказать о преимуществах и недостатках этого подхода. Kimball Group однозначно заявила, что меры в таблице фактов должны иметь одинаковую гранулярность (см. главу 2 книги Кимбалла – The Data Warehouse Toolkit).

Но всегда проще объяснить на примере:

Это – витрина данных. В ней представлены еженедельные и ежемесячные меры, но отсутствуют ежедневные. Нужно ли нам создавать две таблицы фактов, одну еженедельную и одну ежемесячную, например вот такие (№1):

Две таблицы фактов


Или мы должны создать таблицу фактов смешанных гранул, например такую (№2):

Таблица фактов смешанных гранул


В приведенной выше таблице фактов черные строки являются недельными значениями, тогда как красные строки являются месячными. Они обе помещаются в одну и ту же таблицу фактов, но в разных столбцах. В строках, где существует недельная мера, месячная мера равна нулю. И наоборот. Поэтому еженедельные и ежемесячные итоги верны:

select D.Week, sum(F.WeeklyMeasure) from FactMixedGrain F
join DimDate D on F.DimDate = D.DimDate group by D.Week

Результат:

Еженедельные итоги

select D.Month, sum(F.MonthlyMeasure) from FactMixedGrain F
join DimDate D on F.DimDate = D.DimDate group by D.Month

Результат:

Ежемесячные итоги


Обычно основная причина исполнения варианта №2 состоит в необходимости хранить еженедельные и ежемесячные показатели в одной таблице фактов. Это позволяет сэкономить время на разработку, особенно в части ETL. Легче заполнить одну таблицу, чем две.

Это преимущества. Теперь о недостатках. Проблема с вариантом №2 заключается в том, что гранулярность в таблице фактов является смешанной – есть две гранулы. На практике мы имеем другие ключевые столбцы измерения в таблице фактов. И еще у нас есть другие столбцы мер в таблице фактов. Некоторые из этих мер еженедельные, а некоторые – ежемесячные.

С таблицами фактов смешанных гранул возникает ряд проблем:

  1. При составлении отчетности из таблицы мы рискуем смешать меры с разными гранулами в одной и той же формуле, что приведет к бессмысленному результату.
  2. DateKey используется для указания как конца недели, так и конца месяца. Это требует определенной логики в ETL, что усложняет разработку.
  3. В таблице фактов у нас есть черные и красные строки, обозначающие недельные и месячные гранулы. Черные – для еженедельных, а красные – для ежемесячных. У нас еще могут быть желтые строки, ежедневные. И синие, ежеквартальные, строки. Кроме того, можно добавить зеленые строки – ежегодные. После этого все станет очень запутанным. Когда мы обращаемся к такой таблице фактов, мы не сможем определить, какая строка какая.
  4. Когда мы соединяем эту таблицу фактов с другой таблицей фактов (кросс-детализация), возникает большой риск ошибки.

В приведенном выше варианте №2 date dimension используется для двух различных гранул в таблице фактов. Другие подобные примеры:

  1. Аналитика продукта используется на уровне группы продуктов и на уровне категории продуктов.
  2. Аналитика клиента, используемая на уровне компании и на уровне группы.

Когда у нас есть два или три измерения, в каждом из которых есть две гранулы, это становится действительно запутанным и рискованным.

В приведенном выше примере один и тот же ключевой столбец измерения имеет две гранулы. В других случаях смешанные гранулы в таблице фактов вызваны разными ключевыми столбцами измерения. Одним из показателей соответствуют поля dim1, где в качестве другой меры соответствуют dim2. Где мера №1 имеет значение, мера №2 равна 0. И наоборот, вот так:

Двойное зерно

А вот теперь возникает настоящая путаница. Поэтому я бы рекомендовал избегать такого подхода, смешивая меры с различными гранулами в одну и ту же таблицу фактов. Вместо этого лучше поместить их в отдельные таблицы фактов.