Что если ваш факт имеет несколько экземпляров измерения?

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

3 ответа

Стандартным методом в размерном моделировании является использование таблицы "Мост". Классическими примерами, которые вы найдете, являются группы клиентов, имеющих счета (или транзакции), и для пациентов, имеющих несколько диагнозов при посещении больницы.

В вашем случае это может выглядеть так:

Таблица: FactTransaction

  • PersonGroupKey
  • Другие FactTableColumns

Таблица: BridgePersonGroup

  • PersonGroupKey
  • PersonKey

Таблица: DimPerson

  • PersonKey
  • Столбцы других лиц

Для каждой группы людей вы должны создать новый PersonGroupKey и получить строки, подобные этой:

PersonGroupKey 1, PersonKey 5
PersonGroupKey 1, PersonKey 3
PersonGroupKey 2, PersonKey 1
PersonGroupKey 3, PersonKey 6

Затем PersonGroupKey представляет группу людей в Факте.

Логически говоря, должна быть еще одна таблица, DimPersonGroup, которая просто перечисляет PersonGroupKeys, но большинство баз данных не требуют этого, поэтому, как правило, моделисты Kimball отказываются от этого.

Это основа таблицы Bridge, но вы можете рассмотреть модификации в зависимости от вашей ситуации!

Я бы предложил использовать таблицу Bridge в сочетании с таблицами транзакций и персон. Пример:

Таблица:fact_transaction

  • transaction_id (основной ключ)
  • transaction_person_id (иностранный ключ)
  • ...

Таблица:bridge_transaction_person

  • transaction_person_id
  • person_id

Таблица:dim_person

  • person_id (основной ключ)
  • ...

Вам нужен присоединительный стол TransactionPerson (или что-то подобное), где Person в TransactionPerson 1:M отношения, а затем TransactionPerson в Transaction это отношения М:1.

Таким образом, вы можете иметь несколько человек, связанных с одной транзакцией косвенно.

Другие вопросы по тегам