• Increase font size
  • Default font size
  • Decrease font size
Home BI / Datawarehouses Waarom niet enkel Type 2?

Waarom niet enkel Type 2?

E-mail Afdrukken
(3 stemmen)

batch_process_2_unlock_128Bij een Slowly Changing Dimension scenario wordt normaliter per veld bepaald of het een type 1, type 2 of type 3 veld betreft. Bij een type 1 wordt het record overschreven met de nieuwe waarde, bij een type 2 wordt er een nieuw record aangemaakt en bij een type 3 wordt de oude waarde als een extra kolom bewaard in de dimensie. Waarom zou je echter niet alles als type 2 behandelen?



Benadering als type 2
Alle mutaties die impact hebben op de dimensie worden behandeld als een type 2 wijziging. Om tegemoet te komen aan alle mogelijke rapportage-eisen biedt deze benadering veel voordelen. Door alle mutaties te behandelen als een type 2 kun je namelijk alles eenvoudig terugvinden en blijft de volledige historie beschikbaar.

In de dimensie worden een paar extra metavelden opgenomen om tegemoet te komen aan de rapportage-eisen:

  • MetaPreviousID
  • MetaNextID
  • MetaCurrentID


Om bovenstaande te verduidelijken het onderstaande voorbeeld:

CompanyID   
CompanyCode   
Naam   
Adres   
MetaPreviousID   
MetaNextID   
MetaCurrentID   
MetaStartDate   
MetaEndDate 
IsCurrent
1 100   
KPN   
AAA   
1 2 3 2009-01-01
2009-01-05 0
2 100   
KPN   
BBB 1 3 3 2009-01-06 2009-01-12 0
3 100   
KPN   
CCC 2 3 2009-01-13 9999-12-31 
1



Voor Company met code 100 zijn er door de tijd mutaties uitgevoerd op het adres. Het gevolg is geweest dat er twee nieuwe records zijn aangemaakt. Bij het bijwerken van de dimensie worden de previousid, nextid en currentid bijgewerkt. Door dit bij te houden kan op ieder gewenst moment de nieuwste versie van een record worden teruggevonden.



Stel dat er een feit-record wordt aangemaakt op 2 januari 2009. Het bijhorende dimensierecord is het record met ID = 1. Het feit wordt nu gevuld met ID = 1 zodat er een relatie ontstaat tussen het feit en de dimensie. Wellicht is men in de rapportage helemaal niet geïnteresseerd in het oude adres “AAA” van deze Company. Normaal gesproken zou dit veld een Type 1 veld zijn waardoor steeds het adres wordt overschreven en het huidige adres wordt gerapporteerd. Dit vangen we nu op door een recursieve join te leggen op de dimensie. Met behulp van de MetaCurrentID kan eenvoudig de Actieve dimensie-rij worden teruggevonden. De SQL zou er ongeveer zo uitzien:

SELECT    DC.Adres AS  ToenGeldigeAdres,
DC2.Adres AS CurrentAdres,
DC3.Adres AS VorigeAdres
FROM FactVerkopen AS FV
INNER JOIN DimCompany AS DC ON FV.CompanyID = DC.CompanyID
INNER JOIN DimCompany AS DC2 ON DC.MetaCurrentID = DC2.CompanyID
INNER JOIN DimCompany AS DC3 ON DC.MetaPreviousID = DC3.CompanyID



Zoals je ziet biedt dit alle mogelijke combinaties. Je kunt het adres achterhalen welke geldig was op het moment dat het feit binnenkwam, het huidige adres en het vorige adres (type 3).

Waarschijnlijk gebruiken de meeste mensen een Datamart bovenop het Datawarehouse die enkel de data bevat die interessant is om te rapporteren. De input voor de ETL om de Datamarts te vullen zijn waarschijnlijk Views. De views die als input dienen voor je Datamart bouw je op zo’n manier dat je enkel de informatie aanbiedt die interessant is voor de eindgebruiker. In bovenstaand voorbeeld zul je, indien de gebruikers niet geïnteresseerd zijn in de oude adres van de company, enkel de CurrentID tonen!

Voordelen:

  • Volledige historie beschikbaar van een record
  • Eenvoudige ETL, enkel inserts
  • Nog niet na hoeven denken over history bij ETL-ontwikkeling, dit komt later
  • Type 1, 2 en 3 ondersteuning
  • Wat is mijn huidig geldige dimensierecord
  • Wat was mijn vorige geldige dimensierecord
  • Wat is mijn volgende geldige dimensierecord


Nadelen

  • Extra opslag
  • Extra join om current of previous te achterhalen
  • CurrentID, NextID moet iedere keer worden bijgewerkt.


De voordelen wegen zwaarder dan de nadelen. Door een geclusterde index te gebruiken op de surrogatkey kunnen de joins snel worden gemaakt en kunnen de oude type 2 records snel worden bijgewerkt (bijvoorbeeld het updaten van de currentID).

 

Graag uw commentaar Cool

Copyright 2008. All Rights Reserved.

Trackback(0)

TrackBack URI voor deze post

Commentaar (4)

RSS feed Commentaar
...
0
Tja,

De vraag is of je dit probleem op dimensie-data of metadata niveau(modelniveau) op moet lossen. Tegen die tijd heb je gewoon een Data Vault en dan kun je via views je dimensies zelf inregelen/generen.

De meesten kiezen zolang het kan voor het volledig verversen van de data. Pas als je sterschemas vanwege tijdvensters alleen incrementeel kan bijwerken zijn dit soort oplossingen te overwegen. Maar dan zit je waarschijnlijk ook al met een lastig performance probleem vanwege je (monster)dimensies. En daar werkt deze oplossing misschien niet optimaal.

Deze oplossing laad wel netjes incrementeel en zonder updates, en dat is wel zo performant. Alleeen heetf de Data Vault dat ook al, en ik zou dat ook liever daar oplossen dan in mijn dimensies.

Over de metadata:

MetaCurrent bevat dezelfde data als Iscurrent en MetAend=9999. MetaNext and Metaprevious kun je als je het goed vervangen mbv company_code en MetaStart en MetaEnd gegeven dat de start en einddatums op elkaar aansluiten.
M. Evers AKA DM Unseen , september 08, 2009
...
63
Je bedoelt dat je in aparte tabellen per bronsleutel dit soort zaken gaat bijhouden en niet in de dimensie zelf? Dat is natuurlijk ook een manier. Ik ken Data Vault niet goed genoeg om te bepalen of deze manier van werken in de buurt komt.

Ik maak nog een tweede artikel waarbij ik de technische afhandeling van deze methode behandel waarbij ik de inserts via een tijdelijke tabel registreer en de updates op oude records in een aparte metadata tabel.

En over het verversen, dat is geen optie aangezien ik historie wil bewaren.

Metadata
In de dimensie zitten meer metavelden, dit is slechts een voorbeeld. Zodra er een type 2 insert plaatsvindt dient de einddatum van het vorige record bepaald te worden. Dit is de begindatum van het nieuwe record - 1 seconde. Op deze manier sluiten de records altijd op elkaar aan. Meer hierover in een later artikel.
Ronald Kraijesteijn , september 08, 2009
...
0
Data Vault gebruikt een stapelmethode die in feite op een volledige type2 dimensie neerkomt.Je houd gewoon alles bij. De metadata die Data Vault bijhoud is in feite dezelfde die jij nu bijhoud, alleen die je dit voor een Data vault per bronentiteit. Mocht dit niet aansluiten op je sterschemas dan kun je ook nog een Business Vault maken.

Waar dit op neerkomt is dat je de informatie opslag (Data Vault) en informatiepresentatie(sterschemas) van elkaar scheid. Wat jij nu laat zien is dit weer samenvoegen in je sterschema om de flexibiliteit daarvan te verbeteren. Als DWH acrhitect vind ik gegevensborging belangrijker dan gegevenspresentatie, maar YMMV natuurlijk.

Overigens Ik snap hoe jij je tijdlijnen bijhoud en ik prefereer zelf volledige aansluiting van tijdlijnen zonder huplseconden (maar dat wordt een hele diepe discussie).
M. Evers AKA DM Unseen , september 08, 2009
...
63
Inderdaad, ik combineer de metadata en de data gewoon in mijn dimensie.nOver die tijdslijn; het kan allebei. Bij het vullen van je feit moet je alleen je statement anders opbouwen als je voor directe aansluiting kiest. >= smilies/smiley.gifnnOverigens, voordat deze ster wordt geladen wordt de data in een HSA / HDSA (Historical (data) Staging Area) opgeslagen waarbij er een volledige historie van de brondata wordt opgebouwd inclusief tijdslijnen. Dit lijkt een klein beetje op datavault, alleen niet in dezelfde structuur. Voordeel hiervan is dat je altijd alle historie tot je beschikking hebt.
Ronald Kraijesteijn , september 08, 2009

Schrijf commentaar

kleiner | groter
security image
Schrijf de volgende tekens

busy