Как отслеживать слияние в «Медленно меняющемся измерении и фактах»

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

Конкретным примером может быть объединение трех магазинов (Business ID 8897, 8965, 9135) для создания нового магазина Business ID 9700. Как можно извлечь исторические данные о продажах из таблицы фактов, чтобы показать, что до заданной даты 8897, 8965 и 9135 были отдельные магазины которые сейчас все новые магазин 9700.

Кроме того, что, если бизнес-номер нового магазина не 9700, но новый магазин берет один из бизнес-идентификаторов предыдущего магазина. Таким образом, вместо 9700 новый бизнес-идентификатор объединенного магазина — 8897.

SurrogateKey -------- StoreBusinessID---------- StoreName
========================== ======== ===================

          1                8897   Alpha Electronic  
          2                8965   Beta Electronics  
          3                9135   Gamma Electronic  
          4                9700   Mega Electornics  

=============== =================== ==================


person Faisal Majeed    schedule 13.03.2018    source источник


Ответы (2)


Вам нужно использовать «Тип 6», медленно изменяя размерность. По сути, это комбинация изменений Типа 2 и Типа 1.

Как это работает: чтобы зафиксировать изменение «Типа 2», вам понадобятся «Дата начала» и «Дата окончания» для каждой записи в таблице «Магазин». Для текущих записей конечная дата обычно представляет собой какую-то отдаленную дату в будущем, например 2999-12-31. Когда вы подключаете такую ​​таблицу к таблицам фактов, вам нужно будет соединить измерение и факт по естественному ключу (StoreBusinessID) и по дате факта между датой начала и датой окончания.

Чтобы зафиксировать изменение «Типа 1», вам нужно будет добавить поле в таблицу «Магазин» для отслеживания «Последнего бизнес-идентификатора». Это поле будет содержать последнюю версию бизнес-ключа. Если изменений нет, Store Business ID и Latest Business ID будут содержать один и тот же ключ. Если магазины объединятся, все записи 8897, 8965, 9135 и 9700 будут содержать «Последний идентификатор компании» 9700.

В результате можно как «путешествовать во времени» (воспроизвести точную историю в любой период), так и сгруппировать по последней версии магазина.

person RADO    schedule 17.03.2018
comment
Тип 3 — это когда вы добавляете новый столбец для одновременного отслеживания нескольких альтернативных реальностей — они не совпадают с комбинацией Типа 2 и Типа 1 — согласно kimballgroup.com/2008/09/slowly-changing-dimensions-part-2. Это больше похоже на тип 6. - person Rich; 17.03.2018
comment
Я вижу значение Type 6. Сценарий с одной итерацией store joins работает, я не уверен, что происходит во второй итерации и как это отслеживать. Так, например, последний идентификатор BUsiness ID 9700 проштампован для 8897,8965,9135 и 9700. Что происходит, когда 9700 объединяется, скажем, с 9900 через 6 месяцев. В этом случае магазины 8897,8965,9135 и 9700 будут иметь Latest Business ID как 9900. Как узнать, что за 6 месяцев 8897, 8695, 9135 и 9700 были 9700? а не 9900? - person Faisal Majeed; 19.03.2018
comment
Если вам нужно просмотреть полную историю слияний магазинов, вам придется использовать несбалансированную иерархию. Это очень продвинутое и сложное решение, включающее рекурсию; прежде чем вы решите это сделать, убедитесь, что это действительно стоит того. Если это так, эти статьи могут указать вам правильное направление: blog.chrisadamson.com/2012/05/ или brazenly.blogspot.com/2015/02/ - person RADO; 20.03.2018
comment
@RADO Спасибо, я считаю, что ваше последнее предложение по использованию несбалансированной иерархии отвечает всем требованиям, но определенно за счет дополнительной сложности. Я считаю, что с этими знаниями теперь я могу пересмотреть требования, установленные бизнесом, и сформулировать, какую сложность они получат для функций, которые они запрашивают, и логически показать, почему они должны быть такими сложными. Я думаю, что Тип 6 будет адекватным, если мы пойдем на компромисс в отношении требования на определенный момент времени и будем придерживаться отчетности «КАК БЫЛО» и «КАК ЕСТЬ» на основе дат вступления в силу. хотя я мог бы перейти от использования последнего бизнес-идентификатора к надежной ссылке на ключ - person Faisal Majeed; 20.03.2018

Таблицы фактов уже содержат данные, относящиеся к магазинам с SK 1, 2 и 3 (ID 8897, 8965 и 9135), поэтому вы можете оставить таблицы фактов без изменений, и у вас всегда будут данные о прошлой работе этих магазинов. до того момента, когда они были сняты с производства.

Когда появится этот новый магазин (ID 9700), вы можете добавить его как новую строку (SK 4) в измерении Store, установить его как активную строку и установить «прекращенные» строки магазина как неактивные (вы можете использовать логический столбец для это, например, «isActive» или «версия»). С этого момента все данные, загруженные в таблицы фактов, будут указывать на магазин с SK 4 (ID 9700).

До этого момента у него были данные только для SK 1, 2 и 3 (ID 8897, 8965 и 9135). По этой причине вы всегда сможете просматривать данные из прошлых и/или текущих хранилищ, используя поле isActive в измерении Store, когда вы соединяете его с таблицами фактов (используя SK).

Это известно как медленно меняющееся измерение типа 2:

Этот метод отслеживает исторические данные, создавая несколько записей для заданного естественного ключа в многомерных таблицах с отдельными суррогатными ключами и/или разными номерами версий. Для каждой вставки сохраняется неограниченная история.

Редактировать: относительно второй части вашего вопроса: "требуемая гибкость заключается в том, что я мог бы получить его для 9700 до того, как 9700 существовал в истории, объединив SK 1, 2 и 3"

Одним из простых вариантов было бы ввести иерархию (родительский магазин -> магазин) в измерение «Магазин» и для каждого из других магазинов установить в поле «Идентификатор родительского магазина» значение 9700. Таким образом, вы можете просматривать данные о продажах конкретно для каждого прошлых магазинов, используя их идентификаторы, или просто изучите данные для родительского магазина (родительский ID = 9700), которые предоставят совокупное представление всех данных для всех магазинов под родительским 9700.

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

person jmng    schedule 14.03.2018
comment
Проблема с обработкой этого как простого SCD ​​2 заключается в том, что он нигде не показывает, что три магазина объединились в один магазин 9700. Когда я извлекаю отчет о продажах, необходимая гибкость заключается в том, что я мог получить его для 9700 до того, как 9700 существовал в истории. путем слияния SK 1, 2 и 3 (ID 8897, 8965 и 9135). Поскольку информация о слиянии не фиксируется SCD Type 2, я не смогу показать сшитую историю данных. - person Faisal Majeed; 14.03.2018
comment
Тогда почему бы не 1) обновить измерение как SCD и добавить строку для представления магазина 9700+8897+8965+9135 ; 2) создать новую таблицу фактов, например. FactSalesMerged, который содержит реплику показателей продаж, но указывает на новый элемент измерения. Таким образом, вы будете обращаться к этой конкретной таблице фактов, когда вам понадобится историческое и объединенное представление данных о продажах. - person jmng; 14.03.2018
comment
Другой вариант — ввести иерархию (родительский магазин -> магазин) в измерение «Магазин» и для каждого из остальных магазинов установить в поле «Идентификатор родительского магазина» значение 9700. Таким образом, вы сможете изучить данные о продажах конкретно для каждого из прошлых хранилища или просто найдите родительское хранилище (которое обеспечит совокупное представление данных). Добавлено как редактирование к ответу. - person jmng; 14.03.2018
comment
Я не уверен в предложенной вами таблице FactSalesMerged. Я больше склоняюсь к вашему второму варианту Parent Store Key. Это похоже на введение надежного ключа в таблицу измерений и добавление еще одного столбца в таблицу фактов для ключа родительского хранилища. Таким образом, я думаю, что данные могут быть получены либо для текущего хранилища, либо для родительского хранилища. По сути, передать ключ SK4 и сделать его ключом родительского хранилища для объединенных хранилищ. Но что произойдет, когда позже Sk4 разделится на два хранилища, Sk5 и Sk6, что является ключом родительского хранилища для sk5 и sk6, а также sk4, мы все обновляем? и к чему? - person Faisal Majeed; 15.03.2018
comment
На самом деле, предлагаемая концепция бизнеса/домена, кажется, существует в вашем случае: некоторые магазины будут объединены в родительский магазин, а некоторые нет. У вас может быть концепция магазинов без родительских магазинов для SK5 и SK6, и у них может быть идентификатор родительского магазина, равный идентификатору дочернего магазина. - person jmng; 15.03.2018
comment
Итак, SK5 и Sk6 будут иметь идентификатор родительского магазина в качестве своих собственных идентификаторов, но в этом случае как мы узнаем, что SK5 и SK6 произошли от SK4? Может быть, я что-то упускаю - person Faisal Majeed; 15.03.2018
comment
Я неправильно понял ваш предыдущий комментарий. В случае, который вы упомянули, если хранилище 4 разбивается на хранилище 5 и 6, вы можете установить 4 в качестве родителя для 5 и 6, чтобы отслеживать разделение. Другим вариантом было бы смоделировать это как отношение «многие ко многим»: использовать таблицу мостов/фактов, чтобы соединить измерение с самим собой, и использовать столбцы/ключи таблиц мостов/фактов, чтобы зафиксировать родителя каждого хранилища и дату изменения. . - person jmng; 15.03.2018