Вступ до типів повільної зміни розмірів (SCD)

Розмірковуючи з написанням нещодавнього допису в блозі, я хотів зробити посилання на чіткий, стислий допис у блозі про різні типи повільно змінюваних розмірів (SCD) для тих, хто не знайомий з темою. Хоча там є цілий ряд ґрунтовних вступів, я не знайшов такого чіткого та стислого, як хотілося б.

зміни

Тому я пропоную вам власну пропозицію, короткий вступ до Повільно змінюються розмірів (SCD) у сценарії зберігання даних.

Для більш детального обговорення повільно мінливих розмірів я б запропонував переглянути власні публікації Kimball Group щодо типу 1 та типів 2 та 3.

Що повільно змінюють розміри?

Організовуючи сховище даних за зірковими схемами за стилем Кімбола, ви пов'язуєте записи фактів із записом конкретного виміру з відповідними атрибутами. Але що, якщо інформація у вимірі зміниться? Тепер ви пов'язуєте всі записи фактів з новим значенням? Ви ігноруєте зміни, щоб зберегти історичну точність? Або ви ставитесь до фактів до зміни виміру інакше, ніж до тих, що існують після?

Саме це рішення визначає, чи робити свій вимір повільно мінливим. Існує кілька різних типів SCD залежно від того, як ви ставитеся до вхідних змін.

Які бувають типи ССД?

Дуже просто, існує 6 типів повільно мінливих розмірів, які зазвичай використовуються, вони такі:

  • Тип 0 - фіксований розмір
    • Жодні зміни не допускаються, розмір ніколи не змінюється
  • Тип 1 - немає історії
    • Оновіть запис безпосередньо, немає запису історичних цінностей, є лише поточний стан
  • Тип 2 - Версія рядків
    • Відстежуйте зміни як записи версій із поточними прапорами та активними датами та іншими метаданими
  • Тип 3 - стовпець Попереднє значення
    • Відстежуйте зміну до певного атрибута, додайте стовпець, щоб показати попереднє значення, яке оновлюється у міру подальших змін
  • Тип 4 - Таблиця історії
    • Показувати поточне значення в таблиці розмірностей, але відстежувати всі зміни в окремій таблиці
  • Тип 6 - Гібридний SCD
    • Використовуйте методи з SCD типів 1, 2 та 3 для відстеження змін

Насправді широко використовуються лише типи 0, 1 і 2, а інші зарезервовані для цілком конкретних вимог. Заплутано, але в загально узгоджених визначеннях немає SCD типу 5.

Після того, як ви застосуєте вибраний тип вимірювання, ви зможете направити свої записи фактів на відповідний бізнес або сурогатний ключ. Сурогатні ключі в цих прикладах стосуються конкретної історичної версії запису, усуваючи складність об’єднання з пізніших структур даних.

Практичні приклади

Ми маємо дуже простий вимір «замовник», що має лише 2 атрибути - ім’я та країна замовника:

Однак Боб щойно повідомив нас, що зараз переїхав до США, і ми хочемо оновити наш запис розмірів, щоб це відобразити. Ми можемо бачити, як різні типи SCD будуть обробляти цю зміну та плюси/мінуси кожного методу.

Наш стіл залишається незмінним. Це означає, що в наших існуючих звітах і надалі будуть відображатися однакові цифри, можливо, це бізнес-вимога, щоб кожен клієнт завжди був розподілений у країні, з якої він зареєструвався.

Усі майбутні операції, пов’язані з Бобом, також будуть розподілені в країні „Великобританія”.

Таблиця оновлена ​​з урахуванням нової країни Боба:

Усі записи фактів, пов’язані з Бобом, тепер будуть пов’язані з країною „США”, незалежно від того, коли вони відбулися.

Ми часто просто хочемо побачити поточне значення атрибута виміру - може бути, що єдиними змінами виміру, що відбуваються, є виправлення помилок, можливо, немає вимоги до історичної звітності.

Для підтримки змін типу 2 нам потрібно додати до нашої таблиці чотири стовпці:

· Сурогатний ключ - оригінального посвідчення більше не буде достатньо для ідентифікації конкретного запису, який нам потрібен, тому нам потрібно створити новий ідентифікатор, до якого записи фактів можуть приєднатися.

· Поточний прапор - швидкий метод повернення лише поточної версії кожного запису

· Дата початку - дата, з якої починає діяти конкретна історична версія

· Дата завершення - дата, до якої активний конкретний запис історичної версії

Завдяки цим елементам наша таблиця тепер буде виглядати так:

Цей метод є дуже потужним - ви зберігаєте історію для всього запису і можете легко виконувати аналіз змін за часом. Однак він також постачається із більшими накладними витратами на технічне обслуговування, збільшеними вимогами до зберігання та потенційними наслідками для продуктивності, якщо його використовувати на дуже великих розмірах.

Тип 2 - найпоширеніший метод відстеження змін у сховищах даних.

Тут ми додаємо новий стовпець під назвою “Попередня країна”, щоб відстежувати останнє значення для нашого атрибута.

Зверніть увагу, як це забезпечить лише одну історичну цінність для країни. Якщо клієнт змінить своє ім’я, ми не зможемо відстежити його без додавання нового стовпця. Подібним чином, якщо Боб знову переїхав до країни, нам або потрібно буде додати додаткові стовпці "Попередня попередня країна", або втратити той факт, що він колись жив у Великобританії.

Тут немає змін до нашої існуючої таблиці, ми просто оновлюємо запис так, ніби відбулася зміна типу 1. Однак ми одночасно ведемо таблицю історії, щоб відстежувати ці зміни:

У нашій таблиці розмірів написано:

Тоді як наша історична таблиця типу 4 створюється як:

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

Розділення історичних даних зменшує ваші розміри, а отже, зменшує складність та покращує продуктивність, якщо для більшості застосувань потрібне лише поточне значення.

Однак якщо вам потрібні історичні значення, ця структура додає складності та накладні витрати на надмірність даних. Зазвичай передбачається, що система використовуватиме тип 1 або тип 2, а не тип 4.

«Гібридний» метод просто приймає типи SCD 1, 2 і 3 і застосовує всі методи. Ми зберігали б історію всіх змін, одночасно оновлюючи стовпець "поточне значення" у всіх записах.

Це дає вам можливість надати елемент порівняння змін без додаткових розрахунків, зберігаючи при цьому повну, детальну історію всіх змін у системі.

Особисто, якби ця вимога виникла, я б уникнув надмірності даних цього додаткового стовпця і просто обчислив би поточне значення за допомогою функції вікна “LAST_VALUE ()” під час виконання. Хоча це залежить від ваших пріоритетів між збереженням даних та виконанням прямих запитів.