Медленно меняющееся измерение - Slowly changing dimension

Размеры в управление данными и хранилище данных содержат относительно статические данные о таких объектах, как географические местоположения, клиенты или продукты. Данные, собранные Медленно меняющиеся размеры (SCD) меняются медленно, но непредсказуемо, а не по регулярному графику.[1]

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

Например, база данных может содержать таблица фактов хранит записи о продажах. Эта таблица фактов будет связана с измерениями с помощью внешние ключи. Одно из этих измерений может содержать данные о продавцах компании: например, о региональных офисах, в которых они работают. Однако иногда продавцов переводят из одного регионального офиса в другой. Для целей исторической отчетности по продажам может потребоваться учет того факта, что конкретный продавец был назначен в конкретный региональный офис ранее, тогда как этот продавец теперь назначен в другой региональный офис.[требуется разъяснение ]

Решение этих проблем включает в себя методологии управления SCD, которые называются типами от 0 до 6. SCD типа 6 также иногда называют гибридными SCD.

Тип 0: сохранить оригинал

Атрибуты измерения Тип 0 никогда не меняются и назначаются атрибутам, которые имеют постоянные значения или описаны как «Исходные». Примеры: Дата рождения, Первоначальный кредитный рейтинг. Тип 0 применяется к большинству атрибутов измерения даты.[2]

Тип 1: перезапись

Этот метод перезаписывает старые данные новыми и поэтому не отслеживает исторические данные.

Пример таблицы поставщиков:

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_State
123ABCAcme Supply CoCA

В приведенном выше примере Supplier_Code - это естественный ключ а Supplier_Key - это суррогатный ключ. Технически суррогатный ключ не нужен, поскольку строка будет уникальной по естественному ключу (Supplier_Code).

Если поставщик перенесет штаб-квартиру в Иллинойс, запись будет перезаписана:

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_State
123ABCAcme Supply CoIL

Недостатком метода типа 1 является отсутствие истории в хранилище данных. Однако его преимущество заключается в простоте обслуживания.

Если кто-то рассчитал агрегированную таблицу, суммирующую факты по состояниям, ее необходимо будет пересчитать при изменении Supplier_State.[1]

Тип 2: добавить новую строку

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

Например, если поставщик переезжает в Иллинойс, номера версий будут последовательно увеличиваться:

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_StateВерсия
123ABCAcme Supply CoCA0
124ABCAcme Supply CoIL1

Другой способ - добавить столбцы «Дата вступления в силу».

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_StateДата началаДата окончания
123ABCAcme Supply CoCA2000-01-01T00: 00: 002004-12-22T00: 00: 00
124ABCAcme Supply CoIL2004-12-22T00: 00: 00НОЛЬ

Дата и время начала второй строки равны дате / времени окончания предыдущей строки. Нулевое значение End_Date во второй строке указывает текущую версию кортежа. Вместо этого в качестве конечной даты может использоваться стандартизованная суррогатная высокая дата (например, 9999-12-31), чтобы поле можно было включить в индекс и чтобы при запросе не требовалась подстановка нулевого значения.

И третий метод использует дату вступления в силу и текущий флаг.

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_StateДата вступления в силуCurrent_Flag
123ABCAcme Supply CoCA2000-01-01T00: 00: 00N
124ABCAcme Supply CoIL2004-12-22T00: 00: 00Y

Значение Current_Flag «Y» указывает текущую версию кортежа.

Транзакции, которые ссылаются на конкретный суррогатный ключ (Supplier_Key) затем навсегда привязаны к временным отрезкам, определенным этой строкой медленно меняющейся таблицы измерений. Сводная таблица, обобщающая факты по штатам, продолжает отражать историческое состояние, то есть состояние, в котором поставщик находился во время транзакции; обновление не требуется. Чтобы ссылаться на объект через естественный ключ, необходимо удалить уникальное ограничение, создающее Ссылочная целостность СУБД невозможно.

Если в содержимое измерения были внесены ретроактивные изменения, или если в измерение добавлены новые атрибуты (например, столбец Sales_Rep), даты вступления которых в силу отличаются от уже определенных, то это может привести к тому, что существующие транзакции должны быть обновлено, чтобы отразить новую ситуацию. Это может быть дорогостоящей операцией с базой данных, поэтому SCD 2-го типа не лучший выбор, если размерная модель подвержена частым изменениям.[1]

Тип 3: добавить новый атрибут

Этот метод отслеживает изменения, используя отдельные столбцы, и сохраняет ограниченную историю. Тип 3 сохраняет ограниченную историю, поскольку она ограничена количеством столбцов, предназначенных для хранения исторических данных. Исходная структура таблицы для Типа 1 и Типа 2 такая же, но Тип 3 добавляет дополнительные столбцы. В следующем примере к таблице был добавлен дополнительный столбец для записи исходного состояния поставщика - сохраняется только предыдущая история.

Supplier_KeyКод поставщикомНаименование поставщикаOriginal_Supplier_StateДата вступления в силуCurrent_Supplier_State
123ABCAcme Supply CoCA2004-12-22T00: 00: 00IL

Эта запись содержит столбец для исходного состояния и текущего состояния - не может отслеживать изменения, если поставщик переезжает во второй раз.

Одним из вариантов этого является создание поля Previous_Supplier_State вместо Original_Supplier_State, которое будет отслеживать только самые последние исторические изменения.[1]

Тип 4: добавить таблицу истории

В Тип 4 Метод обычно называется использованием «таблиц истории», где одна таблица хранит текущие данные, а дополнительная таблица используется для записи некоторых или всех изменений. Оба суррогатных ключа упоминаются в таблице фактов для повышения производительности запроса.

В приведенном выше примере исходное имя таблицы Поставщик и таблица истории Supplier_History.

Поставщик
Supplier_keyКод поставщикомНаименование поставщикаSupplier_State
124ABCAcme & Johnson Supply CoIL
Supplier_History
Supplier_keyКод поставщикомНаименование поставщикаSupplier_StateCreate_Date
123ABCAcme Supply CoCA2003-06-14T00: 00: 00
124ABCAcme & Johnson Supply CoIL2004-12-22T00: 00: 00

Этот метод похож на то, как таблицы аудита базы данных и изменение сбора данных функции техники.

Тип 5

Техника типа 5 основывается на мини-измерении типа 4 путем встраивания ключа мини-измерения «текущего профиля» в базовое измерение, которое перезаписывается как атрибут типа 1. Этот подход, названный типом 5, поскольку 4 + 1 равно 5, позволяет получить доступ к назначенным в данный момент значениям атрибутов мини-измерения вместе с другими значениями базового измерения без привязки через таблицу фактов. По логике, мы обычно представляем базовое измерение и текущую опору профиля мини-измерения в виде единой таблицы на уровне представления. Атрибуты аутригеров должны иметь отдельные имена столбцов, например «Текущий уровень дохода», чтобы отличать их от атрибутов в мини-измерении, связанном с таблицей фактов. Команда ETL должна обновлять / перезаписывать ссылку на мини-измерение типа 1 всякий раз, когда текущее мини-измерение изменяется с течением времени. Если подход аутригера не обеспечивает удовлетворительной производительности запроса, тогда атрибуты мини-измерения могут быть физически встроены (и обновлены) в базовое измерение.[3]

Тип 6: комбинированный подход

В Тип 6 Метод сочетает подходы 1, 2 и 3 типов (1 + 2 + 3 = 6). Одним из возможных объяснений происхождения термина было то, что он был придуман Ральф Кимбалл во время разговора со Стивеном Пейсом из Калидо[нужна цитата ]. Ральф Кимбалл называет этот метод «непредсказуемыми изменениями с наложением одной версии» в Набор инструментов хранилища данных.[1]

Таблица Supplier начинается с одной записи для нашего примера поставщика:

Supplier_KeyRow_KeyКод поставщикомНаименование поставщикаТекущее состояниеHistorical_StateДата началаДата окончанияCurrent_Flag
1231ABCAcme Supply CoCACA2000-01-01T00: 00: 009999-12-31T23: 59: 59Y

Current_State и Historical_State одинаковы. Необязательный атрибут Current_Flag указывает, что это текущая или самая последняя запись для этого поставщика.

Когда Acme Supply Company переезжает в Иллинойс, мы добавляем новую запись, как при обработке типа 2, однако ключ строки включен, чтобы гарантировать, что у нас есть уникальный ключ для каждой строки:

Supplier_KeyRow_KeyКод поставщикомНаименование поставщикаТекущее состояниеHistorical_StateДата началаДата окончанияCurrent_Flag
1231ABCAcme Supply CoILCA2000-01-01T00: 00: 002004-12-22T00: 00: 00N
1232ABCAcme Supply CoILIL2004-12-22T00: 00: 009999-12-31T23: 59: 59Y

Мы перезаписываем информацию Current_State в первой записи (Row_Key = 1) новой информацией, как при обработке типа 1. Мы создаем новую запись для отслеживания изменений, как при обработке типа 2. И мы сохраняем историю во втором столбце State (Historical_State), который включает обработку типа 3.

Например, если поставщик снова переместится, мы добавим еще одну запись в измерение «Поставщик» и перезапишем содержимое столбца Current_State:

Supplier_KeyRow_KeyКод поставщикомНаименование поставщикаТекущее состояниеHistorical_StateДата началаДата окончанияCurrent_Flag
1231ABCAcme Supply CoНью-ЙоркCA2000-01-01T00: 00: 002004-12-22T00: 00: 00N
1232ABCAcme Supply CoНью-ЙоркIL2004-12-22T00: 00: 002008-02-04T00: 00: 00N
1233ABCAcme Supply CoНью-ЙоркНью-Йорк2008-02-04T00: 00: 009999-12-31T23: 59: 59Y

Реализация фактов типа 2 / типа 6

Суррогатный ключ типа 2 с атрибутом типа 3

Во многих реализациях SCD типа 2 и типа 6 суррогатный ключ из измерения помещается в таблицу фактов вместо естественный ключ когда данные фактов загружаются в хранилище данных.[1] Суррогатный ключ выбирается для данной записи факта на основе ее даты вступления в силу, а также Start_Date и End_Date из таблицы измерений. Это позволяет легко присоединить данные фактов к правильным данным измерений для соответствующей даты вступления в силу.

Вот таблица поставщиков, которую мы создали выше, используя методологию гибрида типа 6:

Supplier_KeyКод поставщикомНаименование поставщикаТекущее состояниеHistorical_StateДата началаДата окончанияCurrent_Flag
123ABCAcme Supply CoНью-ЙоркCA2000-01-01T00: 00: 002004-12-22T00: 00: 00N
124ABCAcme Supply CoНью-ЙоркIL2004-12-22T00: 00: 002008-02-04T00: 00: 00N
125ABCAcme Supply CoНью-ЙоркНью-Йорк2008-02-04T00: 00: 009999-12-31T23: 59: 59Y

Как только таблица Delivery содержит правильный Supplier_Key, ее можно легко присоединить к таблице Supplier с помощью этого ключа. Следующий запрос SQL извлекает для каждой записи факта текущее состояние поставщика и состояние, в котором поставщик находился во время доставки:

ВЫБРАТЬ  Доставка.стоимость доставки,  поставщик.наименование поставщика,  поставщик.историческое_стейт,  поставщик.Текущее состояниеИЗ ДоставкаВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ поставщик  НА Доставка.поставщик_key = поставщик.поставщик_key;

Реализация чистого типа 6

Наличие суррогатного ключа типа 2 для каждого временного интервала может вызвать проблемы, если размерность может измениться.[1]

Реализация чистого типа 6 не использует это, но использует суррогатный ключ для каждого элемента основных данных (например, каждый уникальный поставщик имеет один суррогатный ключ).

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

Это также дает больше возможностей при запросе транзакций.

Вот таблица поставщиков с использованием чистой методологии Типа 6:

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_StateДата началаДата окончания
456ABCAcme Supply CoCA2000-01-01T00: 00: 002004-12-22T00: 00: 00
456ABCAcme Supply CoIL2004-12-22T00: 00: 002008-02-04T00: 00: 00
456ABCAcme Supply CoНью-Йорк2008-02-04T00: 00: 009999-12-31T23: 59: 59

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

ВЫБРАТЬ  поставщик.Код поставщиком,  поставщик.provider_stateИЗ поставщикВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ Доставка  НА поставщик.поставщик_key = Доставка.поставщик_key И Доставка.Дата доставки >= поставщик.Дата начала И Доставка.Дата доставки < поставщик.Дата окончания;

Запись факта с датой вступления в силу (Delivery_Date) 9 августа 2001 г. будет связана с Supplier_Code в ABC с Supplier_State как «CA». Запись факта с датой вступления в силу 11 октября 2007 г. также будет связана с тем же кодом Supplier_Code ABC, но со статусом Supplier_State "IL".

Этот более сложный подход имеет ряд преимуществ, в том числе:

  1. Ссылочная целостность СУБД теперь возможно, но нельзя использовать Supplier_Code как иностранный ключ в таблице Product и используя Supplier_Key в качестве внешнего ключа, каждый продукт привязан к определенному временному интервалу.
  2. Если в факте указано более одной даты (например, Дата заказа, Дата доставки, Дата оплаты счета), можно выбрать, какую дату использовать для запроса.
  3. Вы можете выполнять запросы «как сейчас», «как во время транзакции» или «как в определенный момент времени», изменив логику фильтрации даты.
  4. Вам не нужно повторно обрабатывать таблицу фактов, если есть изменение в таблице измерений (например, добавление дополнительных полей ретроспективно, которые изменяют временные интервалы, или если кто-то допустил ошибку в датах в таблице измерений, их можно легко исправить) .
  5. Вы можете представить двухвременной даты в таблице измерений.
  6. Вы можете присоединить этот факт к нескольким версиям таблицы измерений, чтобы предоставить одну и ту же информацию с разными датами вступления в силу в одном запросе.

В следующем примере показано, как можно использовать конкретную дату, например '2012-01-01T00: 00: 00' (которая может быть текущим datetime).

ВЫБРАТЬ  поставщик.Код поставщиком,  поставщик.provider_stateИЗ поставщикВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ Доставка  НА поставщик.поставщик_key = Доставка.поставщик_key И поставщик.Дата начала <= '2012-01-01T00: 00: 00' И поставщик.Дата окончания > '2012-01-01T00: 00: 00';

И суррогатный, и естественный ключ

Альтернативная реализация - разместить обе то суррогатный ключ и естественный ключ в таблицу фактов.[4] Это позволяет пользователю выбирать соответствующие записи измерений на основе:

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

Этот метод обеспечивает более гибкие связи с измерением, даже если вы использовали подход Типа 2 вместо Типа 6.

Вот таблица поставщиков, которую мы могли бы создать, используя методологию типа 2:

Supplier_KeyКод поставщикомНаименование поставщикаSupplier_StateДата началаДата окончанияCurrent_Flag
123ABCAcme Supply CoCA2000-01-01T00: 00: 002004-12-22T00: 00: 00N
124ABCAcme Supply CoIL2004-12-22T00: 00: 002008-02-04T00: 00: 00N
125ABCAcme Supply CoНью-Йорк2008-02-04T00: 00: 009999-12-31T23: 59: 59Y

Следующий SQL извлекает самые последние Supplier_Name и Supplier_State для каждой записи факта:

ВЫБРАТЬ  Доставка.стоимость доставки,  поставщик.наименование поставщика,  поставщик.provider_stateИЗ ДоставкаВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ поставщик  НА Доставка.Код поставщиком = поставщик.Код поставщикомКУДА поставщик.current_flag = 'Y';

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

Следующий SQL извлекает правильные Supplier_Name и Supplier_State для каждой записи факта на основе Order_Date:

ВЫБРАТЬ  Доставка.стоимость доставки,  поставщик.наименование поставщика,  поставщик.provider_stateИЗ ДоставкаВНУТРЕННИЙ ПРИСОЕДИНИТЬСЯ поставщик  НА Доставка.Код поставщиком = поставщик.Код поставщиком И Доставка.Дата заказа >= поставщик.Дата начала И Доставка.Дата заказа < поставщик.Дата окончания;

Некоторые предостережения:

  • Ссылочная целостность СУБД невозможно, поскольку нет уникального ключа для создания связи.
  • Если для решения проблемы, описанной выше, устанавливается связь с суррогатом, то одно заканчивается сущностью, привязанной к определенному временному интервалу.
  • Если запрос на соединение написан неправильно, он может вернуть повторяющиеся строки и / или дать неправильные ответы.
  • Сравнение дат может работать некорректно.
  • Немного Бизнес-аналитика инструменты плохо справляются с созданием сложных объединений.
  • В ETL Процессы, необходимые для создания таблицы измерений, должны быть тщательно спроектированы, чтобы гарантировать отсутствие дублирования периодов времени для каждого отдельного элемента справочных данных.

Комбинирование типов

Пример модели scd

К разным столбцам таблицы можно применять разные типы SCD. Например, мы можем применить Тип 1 к столбцу Supplier_Name и Тип 2 к столбцу Supplier_State той же таблицы.

Смотрите также

Примечания

  1. ^ а б c d е ж грамм Кимбалл, Ральф; Росс, Марджи. Набор инструментов хранилища данных: полное руководство по размерному моделированию.
  2. ^ http://www.kimballgroup.com/2013/02/design-tip-152-slowly-changing-dimension-types-0-4-5-6-7/
  3. ^ https://www.kimballgroup.com/2013/02/design-tip-152-slowly-changing-dimension-types-0-4-5-6-7/
  4. ^ Росс, Марджи; Кимбалл, Ральф (1 марта 2005 г.). «Медленно меняющиеся размеры не всегда так просто, как 1, 2, 3». Интеллектуальное предприятие.

Рекомендации

  • Брюс Оттманн, Крис Ангус: Система обработки данных, Патентное ведомство США, номер патента 7,003,504. 21 февраля 2006 г.
  • Ральф Кимбалл:Университет Кимбалла: обработка произвольных переформулировок истории [1]. 9 декабря 2007 г.