Как заполнить таблицу фактов суррогатными ключами из измерений

Не могли бы вы помочь понять, как заполнить таблицу фактов суррогатными ключами из измерений.

У меня есть следующая таблица фактов и размеры:

ClaimFacts

ContractDim_SK ClaimDim_SK AccountingDim_SK ClaimNbr ClaimAmount

КонтрактDim

ContractDim_SK (PK) ContractNbr (BK) ReportingPeriod (BK) Кодовое имя

Бухгалтерский учет

TransactionNbr (BK) ReportingPeriod (PK) TransactionCode CurrencyCode (следует ли мне добавить сюда ContractNbr? Это есть в исходной таблице в OLTP)

ClaimDim

CalimsDim_Sk (PK) CalimNbr (BK) ReportingPeriod (BK) ClaimDesc ClaimName (следует ли мне добавить сюда ContractNbr? Это есть в исходной таблице в OLTP)

Моя логика загрузки данных в таблицу фактов следующая:

  1. Сначала я загружаю данные в измерения (суррогатные ключи создаются как столбцы идентификации)
  2. Из транзакционной модели (OLTP) таблица фактов будет заполнена мерами (ClaimNbr и ClaimAmount)

  3. Я не знаю, как заполнить таблицу фактов SK измерений, как узнать, куда поместить ключ, который я извлекаю из измерений, к какой строке фактической таблицы (какой ключ принадлежит этому требованиюNBR?) Должен ли я добавлять контракт Nbr во всех измерения и соединить их вместе при загрузке ключей к факту?

Как правильно это сделать? Пожалуйста, помогите, спасибо


person Rachel    schedule 02.03.2018    source источник


Ответы (1)


Как это обычно работает:

  1. В ваших измерениях у вас будут «естественные ключи» (также известные как «бизнес-ключи») - ключи, поступающие из внешних систем. Например, Номер контракта. Затем вы создаете синтетические (суррогатные) ключи для таблицы.
  2. В вашей таблице фактов все ключи изначально также должны быть «естественными ключами». Например, Номер контракта. Такие ключи должны существовать для каждого измерения, которое вы хотите подключить к таблице фактов. Иногда для измерения может потребоваться несколько естественных ключей (вместе они представляют уровень «детализации» таблицы измерений). Например, для Location могут потребоваться ключи State и City, если они моделируются на уровне State-City.
  3. Присоедините свою тусклую таблицу к таблице фактов по естественным ключам, и в результате опустите естественный ключ из факта и выберите суррогатный ключ из тусклого. Я обычно выполняю левое соединение (фактическое левое соединение тускло), чтобы контролировать записи, которые не совпадают. Я также присоединяюсь к затемнению один за другим (чтобы лучше контролировать происходящее).

Базовый пример (с использованием T-SQL). Допустим, у вас есть следующие 2 таблицы:

Table OLTP.Sales
(   Contract_BK, 
    Amount, 
    Quanity)

Table Dim.Contract
(   Contract_SK,
    Contract_BK,
    Contract Type)

Чтобы поменять местами ключи:

SELECT
     c.Contract_SK
    ,s.Amount
    ,s.Quantity
INTO
    Fact.Sales
FROM
    OLTP.Sales s LEFT JOIN Dim.Contract c ON s.Contract_BK = c.Contract_BK

-- Test for missing keys
SELECT 
    * 
FROM 
    Fact.Sale 
WHERE 
    Contract_SK IS NULL

Кстати, я считаю, что в вашем дизайне есть некоторые ошибки.

  • Отчетный период должен быть отдельным параметром. Обычно это календарная таблица со всеми атрибутами, относящимися к дате / периоду.
  • Вы, конечно, не должны добавлять ContractNbr к другим измерениям. У вас уже есть эти данные в измерении "Контракт". Вот как работает звездная схема - атрибуты контракта всегда доступны вам через таблицу фактов. Не нужно их копировать.
  • Я не могу сказать наверняка (недостаточно информации), но подозреваю, что тусклый учет и тусклое требование могут быть неправильно спроектированы. Если вы намереваетесь перечислить отдельные описания транзакций и отдельные атрибуты требований, это ошибка. В результате размеры будут такими же большими, как таблица фактов. В хорошем дизайне таблицы фактов "высокие и тонкие", а размеры "короткие и толстые". То есть в таблице фактов должно быть несколько полей и много записей, а в таблице фактов должно быть много полей и мало записей. Обычно, если количество записей в вашем диме составляет более 10-20% от записей таблицы фактов, это указывает на неправильный дизайн. Правильный способ решения этой проблемы - разложить претензии на несколько измерений и оставить номер претензии (номер заказа, номер накладной, номер транзакции и т. Д.) В качестве «вырожденного измерения» в вашей таблице фактов. Это немного сложная тема, но она вам явно понадобится в вашем случае. Причина, по которой это важно: если ваши размеры будут такими же высокими, как и таблица фактов, производительность будет ухудшаться. Если количество обращений или претензий исчисляется миллионами записей, это может быть настолько медленным, что убьет ваш дизайн.

Если вам нужна дополнительная информация по этому поводу, я рекомендую эту книгу:

Схема звезды - полное руководство

[Измените, чтобы ответить на дополнительный вопрос]:

Я не хотел удалять поле ClaimNbr из измерения претензий. Я предположил, что вам вообще не нужен такой размер.

Это может быть немного сложно переварить, но учтите следующее. «Заявление» - это, по сути, контейнер для информации (такой же, как «Счет-фактура», «Заказ» и т. Д.). Если вы переместите все полезные данные в соответствующие измерения, не останется ничего, кроме пустого контейнера.

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

  • Отчетный период: становится бизнес-ключом для измерения «Дата».
  • Номер контракта: становится бизнес-ключом для измерения «Контракт».
  • Сумма претензии: остается в таблице фактов как числовой (полностью складывающийся) факт

Остается 3 поля: Номер претензии, Название претензии и Описание претензии. На этом этапе некоторые дизайнеры создают измерение «Утверждение» и размещают там эти поля. Как я упоминал ранее, это ошибка, потому что в этом случае у вас будет столько же записей в вашем измерении, сколько в вашей таблице фактов, что приведет к серьезным проблемам.

Лучше оставить эти поля в таблице фактов. Номер претензии становится «вырожденным измерением» - бизнес-ключом к «пустому» (несуществующему) измерению. По сути, это просто идентификатор информационного контейнера, например номер счета, номер заказа и т. Д.

Название утверждения и описание утверждения также должны оставаться в таблице фактов и становиться «нечисловыми» (неаддитивными) фактами. Если вам нужно отобразить их в отчете, это легко сделать, и вы можете их подсчитать, выполнить с ними условную логику, измерить их длину и т. Д.

Другой способ взглянуть на это: измерения обычно используются для «разрезания» (отсечения) фактов ПО какому-либо атрибуту / полю. Например, «Сумма продаж по странам», «Стоимость продукта по расположению завода» и т. Д. Но вы не можете разрезать по описаниям, примечаниям или другому произвольному тексту - это не имеет смысла.

Что, если ваши описания или другие атрибуты утверждения структурированы? Например, используются ли они для категоризации / классификации ваших требований? В этом случае это не свободный текст, это атрибут, принадлежащий измерению. Например, вы можете разработать измерение «Тип претензии». Или «Статус претензии». И т.д. Если этих небольших полей атрибутов слишком много, вы можете объединить их в так называемое «ненужное» измерение (также известное как «Профиль»), то есть измерение «Профиль заявки». Такие конструкции чистые и эффективные.

Подробнее о размерах мусора здесь

person RADO    schedule 03.03.2018
comment
Хороший ответ, но даже когда вы разложили размеры претензий, вы можете получить тусклое изображение с тем же количеством строк, что и факт, в соответствии с тем, что я бы назвал измерением «Сведения о претензии» (в данном случае имя описание). Это не идеально, но «в стороне» и не часто используется для фильтрации, так что не такая уж большая проблема. Совет 140 по дизайну Кимбалла (легко найти в Google) согласуется с идеей о том, что утверждение является накапливающимся фактом. Я согласен, что номер претензии должен быть искаженным. Тусклость бухгалтерского учета действительно выглядит неправильно, может быть, это само по себе? - person Rich; 03.03.2018
comment
Спасибо, @Rich. Что касается деталей претензии - я решил эту проблему, сделав поле описания неаддитивным фактом. Таким образом, вы можете выполнить некоторые вычисления, например, Count of Description, или я могу написать меру, которая отображает содержимое описания. Такой дизайн увеличивает размер таблицы фактов, но это гораздо меньшее зло по сравнению с размерами 1: 1. Если претензия (заказ, счет и т. Д.) Содержит много мелких деталей, таких как флаги, я всегда помещаю их в размер мусора. - person RADO; 03.03.2018
comment
Спасибо за ваш ответ, это очень помогло. Не могли бы вы прояснить мне, пожалуйста, если я удалю ClaimNbr из ClaimDimension, как я смогу присоединиться к fatTable к ClaimDim, если у меня нет естественного ключа (ClaimNbr) в ClaimDim? я должен переместить их в промежуточную область, присоединиться к ним там, и как только я переместил их в конечный пункт назначения, я просто не включил ClaimNbr в Dimension? - person Rachel; 04.03.2018
comment
@Rachel: Я добавил правку в свой ответ. Надеюсь, это прояснит это для вас. - person RADO; 06.03.2018
comment
@rado Что делать, если таблица размеров - scd2? Будет больше одной комбинации естественного ключа? - person Ravi; 16.08.2018
comment
@RaviR - scd2, по сути, означает, что ваша тусклая зернистость таблицы - это бизнес-ключи + дата, а не только бизнес-ключи. Как правило, это реализовано как эффективный диапазон дат (дата начала, дата окончания), выделенный тусклым шрифтом, и в вашей таблице фактов должна быть действительная дата транзакции. Затем вы выполняете левое соединение как fact.BK = dim.BK и fact.Date между dim.Start Date и dim.End Date. Вам просто нужно убедиться, что диапазоны дат начала и окончания построены правильно (без перекрытий и пробелов), иначе вы получите всевозможные проблемы. - person RADO; 16.08.2018
comment
@rado спасибо !! Если вы не возражаете, можете ли вы проверить это stackoverflow.com/questions/51874230/ - person Ravi; 16.08.2018
comment
@RaviR - добро пожаловать. Я ответил на ваш другой вопрос. - person RADO; 16.08.2018