SCD Type 2 i inne - Wersjonowanie wymiarów w hurtowni danych

Marcin Baran .

1 czerwca 2026

Schemat procesu ETL: dane źródłowe są analizowane pod kątem zmian, a następnie logika ładowania aktualizuje wymiary, co pozwala na stopniowe zmienianie wymiarów.

W hurtowni danych największe problemy zwykle nie zaczynają się od braku rekordów, tylko od tego, że rekordy się zmieniają. W praktyce chodzi o podejście slowly changing dimensions, czyli kontrolowane wersjonowanie wymiarów tak, aby raporty pokazywały albo stan bieżący, albo prawdziwą historię, zależnie od potrzeb biznesu. W tym artykule pokazuję, jak rozpoznać właściwy typ zmiany, jak zaprojektować tabelę wymiaru i jak uniknąć błędów, które później psują analitykę.

Najważniejsze zasady, które porządkują historię w hurtowni

  • Typ 1 nadpisuje dane i usuwa historię, więc nadaje się tylko tam, gdzie liczy się wyłącznie obecny stan.
  • Typ 2 tworzy nowy wiersz i zachowuje pełną historię, dlatego jest najbezpieczniejszy dla raportów „as-was”.
  • Typ 3 przechowuje ograniczoną historię, zwykle tylko poprzednią wartość wybranego atrybutu.
  • Do poprawnego wersjonowania potrzebujesz zwykle klucza zastępczego, dat obowiązywania i flagi bieżącego rekordu.
  • Najwięcej błędów wynika nie z samej logiki zmian, ale z pełnych reloadów, opóźnionych danych i mieszania reguł dla różnych atrybutów.
  • W nowoczesnych platformach hurtownianych nadal liczy się to samo: spójna historia, stabilne klucze i jasna decyzja, co ma się zmieniać, a co nie.

Dlaczego zmiany w wymiarach trzeba obsługiwać inaczej niż zwykłe aktualizacje

Wymiar w hurtowni danych nie jest tylko tabelą pomocniczą. To kontekst dla faktów, czyli odpowiedź na pytania typu: kto kupił, jaki produkt sprzedano, do jakiego regionu należał klient i jak ten region wyglądał w chwili zdarzenia. Jeśli nadpiszesz taki kontekst bez zasad, analityka zaczyna mieszać przeszłość z teraźniejszością.

Najlepszy przykład to klient. Dziś mieszka w Krakowie, rok temu mieszkał w Rzeszowie, a sprzedaż z tamtego okresu dalej powinna być raportowana tak, jak wyglądała wtedy. Gdybyś po prostu zaktualizował adres w tabeli wymiaru, historyczne raporty zaczęłyby pokazywać fałszywy obraz. I właśnie dlatego standardowe UPDATE nie wystarcza.

Ja zwykle zaczynam od prostego pytania: czy użytkownik ma widzieć prawdę historyczną, czy tylko aktualny stan? Odpowiedź na to pytanie decyduje, czy potrzebujesz nadpisania, nowej wersji rekordu, czy jedynie dodatkowego pola z poprzednią wartością. To brzmi prosto, ale oszczędza mnóstwo kosztownych poprawek na końcu projektu.

Gdy ta różnica jest już jasna, można przejść do konkretów i rozróżnić typy zmian, które w praktyce pojawiają się najczęściej.

Porównanie schematów gwiazdy i płatka śniegu. Schemat płatka śniegu pokazuje, jak wymiary **slowly changing dimensions** są normalizowane.

Jak rozróżniam typy zmian bez nieporozumień

Klasyczna terminologia, którą porządkuje Kimball Group, wyróżnia kilka sposobów obsługi zmian w wymiarach. W codziennej pracy najczęściej spotyka się typy 1, 2 i 3, ale warto znać też rozwiązania bardziej hybrydowe, bo właśnie one ratują model, gdy dane zmieniają się szybciej albo bardziej złożenie niż zakładał projekt.

Typ Co robi Kiedy ma sens Minus
Typ 0 Nie zmienia wartości. Gdy atrybut ma być niezmienny, np. wartość pierwotna albo stabilny identyfikator. Nie obsługuje korekt i nie nadaje się do danych, które realnie się zmieniają.
Typ 1 Gorąca wartość jest nadpisywana. Gdy potrzebujesz wyłącznie obecnego stanu, np. poprawionego e-maila lub literówki. Kasuje historię, więc nie da się odtworzyć wcześniejszego obrazu.
Typ 2 Dodaje nowy wiersz dla każdej wersji. Gdy raporty muszą pokazywać stan „jak było wtedy”. Rośnie liczba rekordów, a model wymaga bardziej świadomego ładowania danych.
Typ 3 Przechowuje ograniczoną historię w dodatkowym atrybucie. Gdy wystarcza bieżąca i poprzednia wartość. Nie daje pełnej osi czasu.
Typ 4 Wydziela szybko zmieniający się zestaw cech do mini-wymiaru. Gdy część atrybutów zmienia się zbyt często, by trzymać je w dużym wymiarze. Wprowadza dodatkowe połączenia i zwiększa złożoność modelu.
Typ 5 Łączy mini-wymiar z nadpisywanym odnośnikiem w bazowym wymiarze. Gdy chcesz jednocześnie zachować historię i łatwy dostęp do bieżącej cechy. To już kompromis architektoniczny, nie najprostsza ścieżka.
Typ 6 Łączy historię typu 2 z bieżącymi wartościami typu 1. Gdy analitycy chcą raportować zarówno „wtedy”, jak i „dziś”. Model staje się bardziej wymagający przy ładowaniu i testach.
Typ 7 Udostępnia dwa spojrzenia na ten sam wymiar: typu 1 i typu 2. Gdy różne zespoły potrzebują różnych perspektyw na te same dane. To rozwiązanie dla dojrzałych modeli, a nie dla każdej tabeli.

W tej tabeli najważniejsza jest jedna rzecz: nie każdy atrybut musi żyć według tej samej reguły. Adres klienta często warto wersjonować typu 2, ale status korekty błędu może spokojnie działać jako typ 1. Dobrze zaprojektowany wymiar nie jest dogmatem, tylko zestawem świadomych decyzji.

Gdy typy są już rozróżnione, warto przejść od teorii do wyboru konkretnego wariantu w zależności od celu raportowego.

Kiedy wybrać nadpisanie, nową wersję, a kiedy tylko dopisać jedno pole

W praktyce nie wybieram typu na podstawie samej technologii, tylko na podstawie pytania biznesowego. Jeżeli zespół raportowy chce widzieć tylko bieżące dane, typ 1 jest najprostszy i najtańszy. Jeśli jednak potrzebna jest analiza zmian w czasie, typ 2 daje najczystszy obraz. Typ 3 działa wtedy, gdy historyczność ma być ograniczona do jednego poprzedniego stanu, bez pełnej osi czasu.

Sytuacja biznesowa Najlepszy wybór Dlaczego
Poprawa literówki w nazwie produktu Typ 1 Historia nie wnosi tu wartości, liczy się aktualna, poprawna wersja.
Zmiana opiekuna klienta, którą trzeba widzieć w raportach sprzedaży Typ 2 Każda zmiana powinna zostać zapisana jako osobna wersja.
Analiza tylko poprzedniego i obecnego regionu przypisania Typ 3 Wystarcza ograniczona historia, bez pełnego archiwum.
Duży zestaw flag, które zmieniają się często i niezależnie od reszty wymiaru Typ 4 lub 5 Rozdzielenie gorących cech zmniejsza chaos w głównej tabeli.
Równoczesna potrzeba raportu „jak było” i „jak jest teraz” Typ 6 lub 7 Dwa spojrzenia na te same dane pomagają różnym odbiorcom bez dublowania modelu.

Ja najczęściej odradzam typ 1 w miejscach, gdzie ktoś „na zapas” chce zobaczyć historię później. To prawie zawsze kończy się przebudową modelu, bo brak historii jest trudniejszy do naprawienia niż jej nadmiar. Z kolei typ 2 bywa przesadą dla danych, które naprawdę mają znaczenie tylko w stanie bieżącym.

Wybór typu to dopiero połowa pracy. Druga połowa zaczyna się wtedy, gdy trzeba zaprojektować tabelę tak, aby historia była technicznie spójna i dało się ją bezpiecznie ładować.

Jak zbudować tabelę wymiaru, żeby historia była wiarygodna

W dobrze zaprojektowanym wymiarze historia nie powstaje przypadkiem. Trzeba ją świadomie opisać strukturą tabeli. Dokumentacja Microsoft Learn zwraca uwagę na to, że przy wymiarach typu 2 wygasza się bieżący wiersz i wstawia nową wersję, a w modelach hurtownianych warto stosować klucz zastępczy. To nie jest detal techniczny, tylko fundament spójnych joinów z tabelami faktów.

Kolumna Po co jest potrzebna Na co uważać
Business key Łączy rekord z systemem źródłowym. Nie używaj go jako jedynego klucza wersjonowania, bo może się powtarzać w czasie.
Surrogate key Stabilnie identyfikuje konkretną wersję wymiaru. Nie wolno go gubić przy pełnym reloadzie.
Valid from Pokazuje, od kiedy wersja obowiązuje. Data musi być spójna z logiką ładowania i strefą czasową.
Valid to Pokazuje, do kiedy wersja obowiązuje. Warto jasno ustalić, czy granica jest włącznie, czy wyłącznie.
Current flag Ułatwia szybkie filtrowanie bieżącego rekordu. Musisz utrzymywać zgodność flagi z datami.
Source system / load timestamp Pomaga odtwarzać pochodzenie danych i kolejność ładowania. To nie zastępuje daty biznesowej.
Change hash Przyspiesza wykrywanie zmian w porównaniu z pełnym porównaniem kolumn. Hash musi obejmować te pola, które naprawdę definiują zmianę.

Najważniejsza zasada brzmi: surrogate key powinien wskazywać wersję, a business key osobę, produkt albo kontrakt. Tę różnicę łatwo zgubić na etapie projektu, a potem fakt zaczyna łączyć się z niewłaściwą wersją wymiaru. To jeden z tych błędów, które nie wybuchają od razu, tylko psują pojedyncze raporty przez wiele miesięcy.

Drugi punkt to reloady. Jeśli wymiar korzysta z automatycznie nadawanych kluczy zastępczych, pełny truncate i ponowne ładowanie zwykle rozwala powiązania z faktami albo uniemożliwia odtworzenie historii. W praktyce lepiej budować proces inkrementalny, nawet jeśli na początku wydaje się bardziej wymagający.

Gdy struktura jest już ustalona, pojawia się kolejny zestaw problemów: rekordy przychodzą w złej kolejności, część danych jest niepełna, a niektóre zmiany trzeba obsłużyć wyjątkowo.

Co robić z opóźnionymi danymi i częściowymi zmianami

To właśnie tutaj modele hurtowniane najczęściej się wykładają. Nie na typowych aktualizacjach, tylko na przypadkach brzegowych. Fakt może przyjść wcześniej niż wymiar, część atrybutów może jeszcze nie istnieć, a źródło może wysłać tylko fragment zmiany. Jeśli nie masz na to reguł, wiersze zaczynają lądować w złym stanie albo w ogóle się nie łączą.

  • Opóźnione fakty - gdy fakt pojawia się zanim wymiar zostanie zaktualizowany, trzeba odtworzyć wersję wymiaru obowiązującą w chwili zdarzenia. To normalny przypadek, nie wyjątek.
  • Inferred members - gdy fakt wskazuje jeszcze niezaładowany wymiar, można wstawić minimalny rekord tymczasowy i później go uzupełnić. To lepsze niż utrata referencji.
  • Puste klucze biznesowe - takich rekordów nie traktuję jak zwykłych danych do wersjonowania. Najpierw trzeba je wyczyścić albo odrzucić, bo nie da się wiarygodnie ustalić tożsamości obiektu.
  • Mieszane reguły - niektóre atrybuty tej samej tabeli mogą być typu 1, a inne typu 2. To poprawne, ale wymaga bardzo jasnej dokumentacji, żeby zespół nie zaczął nadpisywać wszystkiego „bo tak było szybciej”.
  • Zmiany logiczne i usunięcia - jeśli źródło oznacza rekord jako nieaktywny, nie zawsze oznacza to fizyczne usunięcie z hurtowni. Często lepsze jest zachowanie wersji z odpowiednim statusem niż kasowanie śladu.

W praktyce najbardziej pomaga mi jedna zasada: ładowanie historii musi być deterministyczne. Ten sam wsad danych powinien zawsze dać ten sam wynik, niezależnie od tego, czy trafił pierwszy, drugi czy trzeci raz. To prosty test jakości procesu, który od razu pokazuje, czy model jest stabilny.

Kiedy te przypadki są pod kontrolą, zostaje jeszcze temat, który wiele zespołów traktuje zbyt lekko: koszty i kompromisy. A właśnie tam widać, czy model będzie działał długo, czy tylko do pierwszego wzrostu wolumenu.

Najczęstsze błędy, które widzę w projektach hurtowni

  • Wersjonowanie wszystkiego typu 2 - brzmi bezpiecznie, ale szybko robi z tabeli wielowierszowy bałagan i podnosi koszt utrzymania.
  • Brak rozdzielenia historii biznesowej od technicznej - data ładowania to nie to samo co data obowiązywania zmian.
  • Pełne reloady przy kluczach zastępczych - to skrót, który bardzo często kończy się rozjechaniem faktów z wymiarami.
  • Brak uzgodnienia definicji zmiany - jeśli biznes i data team różnie rozumieją „zmianę adresu” albo „zmianę segmentu”, model zaczyna kłamać w detalach.
  • Ignorowanie wydajności - każdy dodatkowy wiersz typu 2 to więcej joinów, więcej miejsca i więcej pracy dla zapytań analitycznych.
  • Mylenie archiwizacji z historią - przechowywanie starych danych w osobnym archiwum nie daje tej samej jakości raportowania co poprawnie wersjonowany wymiar.

Najtrudniejszy kompromis dotyczy zwykle kosztu przechowywania versus wartości biznesowej. Jeśli zmiana jest rzadko używana w analizach, pełna historia może być niepotrzebnym obciążeniem. Jeśli jednak na jej podstawie budujesz rozliczenia, audyt albo analizę sprzedaży, oszczędzanie na wersjonowaniu jest pozorne. Właśnie dlatego model trzeba oceniać przez pryzmat decyzji, jakie mają z niego zapadać.

To prowadzi do ostatniej rzeczy, którą zawsze porządkuję przed wdrożeniem: jakie reguły muszą być zapisane zanim pojawi się pierwszy rekord produkcyjny.

Co warto ustalić przed wdrożeniem, żeby później nie przepisywać modelu

Przed startem projektu robię krótką listę decyzji, które muszą być uzgodnione z biznesem i zespołem danych. Bez tego nawet dobry model szybko zaczyna się rozjeżdżać z oczekiwaniami użytkowników.

  • Które atrybuty mają pokazywać tylko stan bieżący, a które muszą zachować historię.
  • Czy historia ma być pełna, czy wystarczy tylko poprzednia wartość.
  • Jak definiujemy datę obowiązywania wersji: biznesowo, technicznie czy po stronie ETL.
  • Czy w tabeli wymiaru dopuszczamy mieszane typy zmian dla różnych kolumn.
  • Co robimy z rekordami opóźnionymi, niepełnymi i tymczasowymi.
  • Jak długo przechowujemy historię i czy istnieją ograniczenia retencyjne albo prywatnościowe.

Jeżeli mam wskazać jedną praktyczną rzecz na koniec, to byłaby ona taka: najpierw ustal semantykę zmiany, potem technikę jej zapisu. To porządkuje cały model, skraca dyskusje z biznesem i zmniejsza ryzyko, że zespół zbuduje hurtownię poprawną technicznie, ale bezużyteczną analitycznie.

W dobrze zaprojektowanej hurtowni dane nie tylko się ładują, ale też zachowują sens w czasie. I właśnie to jest główna wartość porządnego wersjonowania wymiarów: można ufać zarówno bieżącym raportom, jak i temu, co wydarzyło się naprawdę kilka miesięcy wcześniej.

FAQ - Najczęstsze pytania

SCD to techniki zarządzania zmianami w danych wymiarowych w hurtowni danych. Pozwalają śledzić historię atrybutów, które zmieniają się w czasie, zapewniając spójność raportów historycznych i bieżących.
Najczęściej spotykane to Typ 1 (nadpisanie danych, brak historii), Typ 2 (nowy wiersz dla każdej zmiany, pełna historia) i Typ 3 (ograniczona historia, np. poprzednia wartość). Istnieją też bardziej złożone typy hybrydowe.
Typ 1 stosuj, gdy potrzebujesz tylko aktualnego stanu (np. poprawka literówki). Typ 2 jest idealny, gdy wymagana jest pełna historia zmian (np. adres klienta w momencie zakupu), co jest kluczowe dla raportów "jak było".
Niezbędne są: klucz biznesowy (identyfikator źródłowy), klucz zastępczy (unikalny dla wersji), daty obowiązywania (Valid From/To) oraz flaga bieżącego rekordu (Current Flag). Pomaga to w precyzyjnym śledzeniu historii.
Częste błędy to: wersjonowanie wszystkiego Typem 2 (niepotrzebne koszty), brak rozróżnienia daty biznesowej od technicznej, pełne reloady przy kluczach zastępczych oraz brak uzgodnienia definicji zmian z biznesem.
Oceń artykuł

Średnia: 0.0 / 5 · 0 ocen

Tagi

slowly changing dimensions scd type 2 w hurtowni danych slowly changing dimensions przykłady wersjonowanie wymiarów w data warehouse typy scd w hurtowni obsługa zmian w wymiarach
Autor Marcin Baran
Marcin Baran
Nazywam się Marcin Baran i mam trzy lata doświadczenia w obszarze technologii, sztucznej inteligencji oraz zarządzania projektami. Moje zainteresowanie tymi tematami zaczęło się od fascynacji nowinkami technologicznymi i ich wpływem na codzienne życie. Lubię dzielić się wiedzą, wyjaśniając złożone zagadnienia w przystępny sposób, co pozwala mi pomagać innym lepiej zrozumieć otaczający nas świat technologii. W mojej pracy koncentruję się na analizie najnowszych trendów w AI oraz efektywnym zarządzaniu projektami. Staram się zawsze weryfikować źródła informacji, porównywać różne punkty widzenia i organizować wiedzę w sposób klarowny. Moim celem jest dostarczanie użytecznych, dokładnych i zrozumiałych treści, które będą aktualne i pomocne dla czytelników.
Komentarze (0)
Dodaj komentarz