Star schéma v datovém skladu (DWH)
DWH

Dimenze v datovém skladu (DWH) – 6. díl

V tomto článku se podívám podrobněji na dimenze, jejich typy – STAR/SNOWFLAKE/CONSTELLATION, jejich plnění, úrovně historizace a typické dimenze v datovém skladu.

Jak už jistě víte s existencí dimenzí je nutně propojená existence faktových tabulek. Faktová tabulka obsahuje metriky a dimenze statické atributy a různá dělení přes, která lze nahlížet na fakta. Obě struktury najdeme v l2 nejvyšší vrstvě datového skladu.

Star schéma v datovém skladu (DWH)

STAR vs SNOWFLAKE dimenze

Pro začátek je třeba připomenout si STAR/SNOWFLAKE systém uspořádání dimenzí. STAR znamená denormalizovaná dimenze s redundantními daty – hierarchická struktura je přímo v jedné tabulce. SNOWFLAKE znamená normalizovaná dimenze s cizími klíči do další dimenze – hierarchická struktura ve více tabulkách. Pro jednodušší pochopení uvedu příklad na produktové hierarchii.

Mám dimenzi produktů DIM_PRODUCT, ve které mám odkaz na dimenzi DIM_BRAND, ve které jsou informace o značce daného produktu. Například vyrábím výrobky z kožešiny a mám dvě značky. Jednu klasickou, která se jmenuje LASICA a pak luxusní značku GRIZZLY. Každá má trochu jiný segment zákazníků. No a pak mám dva produkty ‚Rukavice LASICA šedé‘ a ‚Luxusní rukavice GRIZZLY šedé‘. V dimenzi produktu mám informaci o názvu, barvě a odkaz do dimenze značky. V dimenzi značky mám pak rozdělení LASICA a GRIZZLY. Toto je typický snowflake. Případ kdy budu mít vše v dimenzi DIM_PRODUCT a dimenze DIM_BRAND neexistuje je STAR. Pro lepší pochopení přikládám obrázky.

SNOWFLAKE dimenze BRAND
SNOWFLAKE dimenze PRODUCT
STAR dimenze PRODUCT

Pojmenování po hvězdě a sněhové vločce velmi odpovídá grafickému uspořádání tabulek. Data ze zdrojového systému se budou blížit spíše SNOWFLAKE uspořádání, doporučuji však data analyzovat dle potřeb a spíše využít STAR uspořádání. Ve výsledku používáte kombinaci STAR/SNOWFLAKE, pro velmi používané atributy je lepší použít STAR (o JOIN méně v loadech), a pro méně používané postačí SOWFLAKE.

Ještě malá poznámka k dělení na značku. Nemusí být nutně jen značka a konec. Můžu mít ještě také pod značku – na to je krásný příklad do pivovarnictví, kdy mám značku piva a pod značkou rozlišuji ještě stupňovitost.

V obou případech jsme měli 1 faktovou tabulku, CONSTELLATION pak je jen rozšíření o více faktových tabulek.

XNA záznam v dimenzi

Na obrázcích jste si jistě všimli záznamu s XNA. Takový záznam vkládám do dimenze automaticky po vytvoření. Je to velmi častá praxe v datových skladech. Ve výsledku je to jen o tom, že když píši SELECT z faktové tabulky a připojuji dimenzi pomocí INNER JOINu, nezmizí mi záznamy co se nepropojí. Dělá to z toho LEFT JOIN, protože když připojujete dimenzi, nechcete, aby záznamy zmizely. Takže to zabraňuje především chybě na straně vývojáře.

Historizace dimenze

Dimenze není jen o master datech. Na většinu dimenzí nejspíš MD pohled postačí, ovšem existují i jiné pohledy. Nejčastěji se potkáte se základními třemi: MD pohled, MD pohled + historické hodnoty, TD pohled. Na pohledy lze nahlížet jako na podmnožiny, kdy každý pohled více vpravo přidává nějakou hodnotu navíc. Kromě těchto nejčastějších pak existují různé modifikace pro konkrétní potřeby – v literatuře je najdete pod pojmem SCD (= Slowly Changing Dimension). Defaultně doporučuji používat alespoň druhou úroveň, tedy MD pohled + historické hodnoty a pro konkrétní potřeby sáhnout po TD pohledu.

Historizace dimenze – Master Datový pohled

MD pohled je 1:1 tak jak je tomu v současném časovém okamžiku.

Historizace dimenze – Master Datový pohled + historické hodnoty

Následující pohled je MD pohled a navíc obsahuje hodnoty, které se vyskytly v dimenzi v minulosti, ale současně se již nepoužívají. Tyto hodnoty lze označit například příznakem, ale není to nutné – záleží na vaší potřebě. Tento pohled je velmi užitečný jakmile se pustíte do historických záznamů, pouze MD pohled by nestačil.

Za touto dimenzí už je schovaný mechanismus, který automaticky zajistí, že již nepoužívané hodnoty z dimenze nezmizí. Jednoduše toho lze docílit pomocí ‚mezi‘ tabulky a speciálního loadu (v přiloženém SQL s příklady). Mechanismus není třeba, pokud už toto obstarává zdrojový systém a sám obsahuje pole, ve kterém označuje nepoužívané záznamy.

Transakční dimenze

Transakční dimenze obsahuje všechny hodnoty, které se v dimenzi vyskytly a navíc obsahuje sloupce DATE_FROM a DATE_TO, takže znáte konkrétní období výskytu hodnot. Dimenzi pak připojím stejně jako předchozí s tím rozdílem, že musím přidat podmínku na období DATE_DAY BETWEEN DATE_FROM and DATE_TO.

Za takovou dimenzí je opět schovaný mechanismus, který automaticky takové uchování dat zajistí. Je ovšem komplexní a budu se mu v budoucnu věnovat v samostatném článku. Tento mechanismus lze aplikovat nejen na dimenze, ale i jakékoliv jiné tabulky.

Základní dimenze v datovém skladu

Za základní dimenze v datovém skladu považuji dimenze zákazník, produkt, kalendář, perioda, organizační struktura. Některé jsem už popsal dříve. Každopádně sem dimenze uvedu ve formě popisu datové struktury tabulek.

DIM_CALENDAR

SloupecTypVlastnostiPopis
DIM_CALENDAR_DATEDATEPRIMARY KEYDen př.: ‚2023-12-31‘
WEEK_DAYSMALLINTNOT NULLDen v týdnu. Neděle = 0, pondělí= 1, …, sobota = 6
WEEK_DAY_DESCRVARCHAR(50)NOT NULLTexty ke dnu v týdnu: Sunday, Monday, …, Saturday
WEEK_DAY_DESCR_SHORTVARCHAR(10)NOT NULLKrátké texty ke dnu v týdnu: Sun, Mon, …, Sat
WEEK_NUMBERSMALLINTNOT NULLČíslo týdne v roce
QUARTER_IDVARCHAR(10)NOT NULLKvartál ve formátu ‚Q4 2023‘
FLAG_WORKING_DAYSMALLINTNOT NULLFlag 1/0 -> 1 = pracovní den (není víkend, není svátek)
FLAG_WEEKENDSMALLINTNOT NULLFlag 1/0 -> 1 = víkend (sobota nebo neděle)
FLAG_HOLIDAYSMALLINTNOT NULLFlag 1/0 -> 1 = svátek
Datová struktura dimenze kalendáře

DIM_PERIOD

SloupecTypVlastnostiPopis
DIM_PERIOD_IDVARCHAR(10)PRIMARY KEYIdentifikátor měsíce ve formátu: ‚yyyyMM‘
PERIOD_FIRST_DATEDATENOT NULLPrvní den měsíce
PERIOD_LAST_DATEDATENOT NULLPoslední den měsíce
QUARTER_IDVARCHAR(10)NOT NULLKvartál ve formátu ‚Q4 2023‘
CNT_WDINTNOT NULLPočet pracovních dní
QUARTER_FIRST_DATEDATENOT NULLPrvní den kvartálu
QUARTER_LAST_DATEDATENOT NULLPoslední den kvartálu
CNT_QTD_WDINTNOT NULLPočet pracovních dní v kvartále po současný měsíc včetně
YEAR_FIRST_DATEDATENOT NULLPrvní den v roce
CNT_YTD_WDINTNOT NULLPočet pracovních dní v roce po současný měsíc včetně
Dimenze periody – agregace z DIM_CALENDAR pro měsíc

DIM_CUSTOMER

SloupecTypVlastnostiPopis
DIM_CUSTOMER_IDVARCHAR(10)PRIMARY KEYId zákazníka př.: ‚55455‘
CUSTOMER_NAMEVARCHAR(255)NOT NULLJméno zákazníka
CUSTOMER_ADDRESSVARCHAR(255)NOT NULLAdresa zákazníka
CUSTOMER_PHONEVARCHAR(50)Telefonní číslo
CUSTOMER_SEGMENTATION_01_IDSMALLINTNOT NULLZákaznická top (lvl1) segmentace – kód, 1 = Domestic, 2 = Export
CUSTOMER_SEGMENTATION_01_TEXTVARCHAR(10)NOT NULLZákaznická top (lvl1) segmentace – text, 1 = Domestic, 2 = Export
CUSTOMER_SEGMENTATION_02_IDSMALLINTNOT NULLZákaznická lvl2 segmentace kód
CUSTOMER_SEGMENTATION_02_TEXTVARCHAR(10)NOT NULLZákaznická lvl2 segmentace text
Datová struktura dimenze zákazníka

DIM_PRODUCT

SloupecTypVlastnostiPopis
DIM_PRODUCT_IDVARCHAR(255)PRIMARY KEYId produktu
PRODUCT_NAMEVARCHAR(255)NOT NULLJméno produktu
PRODUCT_SERIESVARCHAR(10)NOT NULLDomestic/Export/Other
BRAND_FAMILY_CODEVARCHAR(10)NOT NULLRodina značek – kód
BRAND_FAMILYVARCHAR(255)NOT NULLRodina značek
BRAND_CODEVARCHAR(10)NOT NULLZnačka – kód
BRANDVARCHAR(255)NOT NULLZnačka
BRAND_TYPEVARCHAR(255)Typ značky
PRODUCT_COLORVARCHAR(10)Barva produktu
BASE_PRICEDECIMAL(38, 14)Základní cena
VATDECIMAL(38, 14)Sazba DPH
EXCISE_DUTYDECIMAL(38, 14)Spotřební daň
PRODUCT_SEGMENTVARCHAR(255)Segment produktu – dělení
PRODUCT_TYPEVARCHAR(255)Typ produktu – dělení
PACKAGINGVARCHAR(255)Typ balení (obal)
Produktová dimenze

DIM_ORGANISATION

SloupecTypVlastnostiPopis
DIM_ORGANISATION_STRUCTURE_IDVARCHAR(10)PRIMARY KEYId pozice
POSITION_CODEVARCHAR(10)NOT NULLČitelný kód pozice
POSITION_NAMEVARCHAR(255)NOT NULLJméno pozice
EMPLOYEE_NAMEVARCHAR(255)Jméno zaměstnance
EMPLOYEE_PHONEVARCHAR(50)Telefon zaměstnance
EMPLOYEE_EMAILVARCHAR(50)Email zaměstnance
PERSONAL_NUMBERVARCHAR(50)Osobní číslo zaměstnance
DOMAIN_LOGINVARCHAR(50)Login zaměstnance
FLAG_EXTERNALSMALLINTNOT NULLZda se jedná o externistu
DEPARTMENT_NAMEVARCHAR(255)NOT NULLJméno oddělení
MANAGER_CODEVARCHAR(10)Kód nadřízeného
BOSS_CODEVARCHAR(10)NOT NULLKód šéfa oddělení
Dimenze organizace

Shrnutí

Faktová tabulka obsahuje metriky a dimenze statické atributy a různá dělení přes, která lze nahlížet na fakta

STAR je denormalizovaná dimenze s redundantními daty – hierarhie je přímo v tabulce. SNOWFLAKE je normalizovaná dimenze s cizími klíči do další dimenze – hierarchická struktura ve více tabulkách. Ve výsledku používáte kombinaci STAR/SNOWFLAKE, pro velmi používané atributy je lepší použít STAR.

Do dimenze se po vytvoření vkládá 1 záznam s XNA hodnotami – při JOINu nezmizí záznamy co se nepropojí, ale připojí se přes XNA.

Historizace dimenze – 3 hlavní způsoby: MD pohled, MD pohled + historické hodnoty, TD pohled. Lze najít pod termínem Slowly Changing Dimension. Za historizací je schovaný mechanismus co ji zajišťuje.

Základní dimenze v DWH jsou dimenze zákazník, produkt, kalendář, perioda, organizační struktura.

Doporučené články

Předchozí články

Co je to datový sklad (DWH)? – 1. díl

Základní tipy v datovém skladu (DWH) – 2. díl

Vrstvy datového skladu (DWH) – 3. díl

SELECT – 4. díl

SQL funkce a DML – 5. díl

Následující články

Fakta – 7.díl

Pojmenovávání a dokumentace – 8. díl

Orchestrace (noční load) – 9. díl

Pokročilé agregační funkce – 10. díl

Surrogate key – 11. díl

Tipy a triky – 12. díl

Příklady

Příklady na dimenze kalendáře a periody Examples.Dimensions

Doplňky k příkladům Example.Dimensions.insertHolidaysUS

Nastavení DWH v PostgreSQL – 1.příklady

SELECT dotazování – 2. příklady

User-defined funkce – 3. příklady

Příklady na fakta – 5. příklady

Windowed functions – 6. příklady

DWH, SQL & BI tutorials Website dwhguru.eu Email info@dwhguru.eu

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *