Таблица фактов с несколькими фактами - PullRequest
5 голосов
/ 08 марта 2010

У меня есть измерение (SiteItem) имеет два важных факта:

perUserClicks 
perBrowserClicks

однако в этом измерении у меня есть группы значений, основанные на столбце атрибута (давайте назовем группы AboveFoldItems, LeftNavItems, OnTheFlyItems и т. Д.), Каждый из которых имеет больше фактов, характерных для этой группы:

AboveFoldItems: eyeTime, loadTime
LeftNavItems: mouseOverTime
OnTheFlyItems: doesn't have any extra, but may in the future

Допустима ли следующая схема таблицы фактов?

DateKey   
SessionKey
SiteItemKey
perUserClicks 
perBrowserClicks
eyeTime
loadTime
mouseOverTime

Это кажется немного расточительным, так как только некоторые столбцы относятся к некоторым ключам измерений (не относящиеся к делу факты остаются NULL). Но ... похоже, это будет общая проблема, поэтому для этого должно быть общее решение, верно?

Ответы [ 3 ]

4 голосов
/ 09 марта 2010

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

У нас есть несколько звездных схем в конкретных предметных областях с несколькими таблицами фактов, которые разделяют большинство (если не все) измерений (согласованных и внутренних). Измерения ограниченной области не считаются «согласованными» в масштабах всего предприятия, но это то, что мы бы назвали «общими внутренними» измерениями.

Теперь обычно, если данные загружаются одновременно, так что измерение не изменилось, вы можете объединить обе таблицы фактов на ключах, но в общем случае, конечно, вы не можете объединить две разные звездные схемы на ключах измерений, если они являются суррогатами в традиционных медленно меняющихся измерениях. В общем случае вы должны объединять отдельные звезды по естественным ключам или «бизнес-ключам» в измерении, а не в суррогатах (за исключением обычно в особом случае измерения даты, когда оно не меняется и имеет только естественный ключ).

Обратите внимание, что когда вы присоединяетесь к двум звездам, вы должны использовать LEFT JOIN, и в этом случае вы получите NULL, которые вам, вероятно, все равно придется учитывать - так что вы фактически возвращаетесь к исходной модели. Вы имели с NULL! ; -)

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

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

Я бы также посмотрел, не окажетесь ли вы в ситуации Кимбалла "слишком мало измерений". Похоже, что у вас должны быть хорошие размерные атрибуты, смешанные в SessionKey и SiteItemKey - но, не видя всей вашей модели и требований, сложно сказать, но я думаю, что у вас будут некоторые демографические данные в низко-кардинальном или даже снежинчатом измерении без полное измерение сеанса или сайта.

3 голосов
/ 08 марта 2010

На самом деле не существует элегантного решения: у вас либо столбцы, которые можно обнулять, либо вы используете решение EAV. Я уже писал о EAV (и создал много комментариев, которые стоит прочитать):

Я фанат этой модели в некоторых сценариях, но если ваши размеры / атрибуты меняются не часто, это может быть большой дополнительной работой даром. Значения NULL в столбце на самом деле не тратят впустую, пока окружающий код может обращаться с ними соответствующим образом.

1 голос
/ 09 марта 2010

Вы можете иметь более одной таблицы фактов: factperUserClicks, factperBroWserClicks, factEyeTime и т. Д.

Каждый из них будет иметь DateKey, SessionKey, SiteItemKey. Таким образом, с каждым фактом появляются только те «размерные ключи», которые «имеют смысл».

В идеале в DW не должно быть NULL - если вы храните их в одной таблице фактов, лучше использовать нули.

Что касается экономии дискового пространства, я не вижу идеального решения, но в DW предполагается, что в любом случае нужно обменять пространство на скорость и (запрос) простоту.

...