EDW #10: Data Marts

https://xpil.eu/rso

Dotychczas om贸wili艣my sobie pi臋膰 z siedmiu warstw logicznych hurtowni danych. Dzi艣 czas na warstw臋 sz贸st膮: Data Marts (w skr贸cie: DMARTS albo DM).

Jest to ostatnia warstwa hurtowni, nad kt贸r膮 mamy pe艂n膮 kontrol臋. Dane w warstwie DMARTS pochodz膮 bezpo艣rednio z EDW, a wi臋c z punktu widzenia jako艣ci danych jest to warstwa r贸wnie solidna, jak bezpo艣rednio j膮 poprzedzaj膮ca EDW.

DMARTS to warstwa "dla leniwych" (cudzys艂贸w zamierzony). Dane tutaj s膮 pouk艂adane w spos贸b 艂atwy do konsumpcji przez warstw臋 si贸dm膮 (i ostatni膮), czyli konsument贸w danych - ko艅cowych u偶ytkownik贸w hurtowni.

Dane w DMARTS s膮 zdenormalizowane (o denormalizacji wspomina艂em w drugim odcinku serii), co znacznie upraszcza przeprowadzanie analiz ad-hoc i zwalnia ko艅cowego u偶ytkownika od konieczno艣ci "rozgryzania" zale偶no艣ci mi臋dzy poszczeg贸lnymi encjami w hurtowni.

Nie ma jednoznacznego przepisu na to, co powinno a czego nie powinno by膰 w DMARTS. Potrzeby tworzenia obiekt贸w w tej warstwie s膮 dyktowane potrzebami u偶ytkownik贸w ko艅cowych.

W "czystej" formie w DMARTS powinny znajdowa膰 si臋 tylko dwa rodzaje tabel: fakty i wymiary, przy czym "fakty" b臋d膮 tu ju偶 na og贸艂 "wzbogacone" atrybutami ze skojarzonych z nimi wymiar贸w. Zwyczajowo nazwy tabel w dmarts poprzedza si臋 przedrostkami D_ i F_ aczkolwiek oczywi艣cie standardy nazewnictwa ka偶dy mo偶e sobie narzuci膰 we w艂asnym zakresie. Wa偶ne, 偶eby konsument wiedzia艂, czy ma do czynienia z danymi transakcyjnymi (fakty, F_) czy opisowymi (wymiary, D_).

Oczywi艣cie "czysta" forma istnieje wy艂膮cznie w wyobra藕ni teoretyk贸w i puryst贸w. W rzeczywisto艣ci opr贸cz fakt贸w i wymiar贸w zazwyczaj dochodz膮 jeszcze tabele pomocnicze. Na przyk艂ad zagregowane pomosty mi臋dzy dwoma wymiarami (to ostatnie brzmi troch臋 jak fragment z powie艣ci SF, ale to mo偶e innym razem). Za艂贸偶my, 偶e mamy wymiar D_KLIENT oraz inny wymiar, D_TYP_TRANSAKCJI. I 偶e chcemy da膰 konsumentowi mo偶liwo艣膰 szybkiego sprawdzenia, ile razy ka偶dy z klient贸w wygenerowa艂 transakcje r贸偶nych typ贸w. Oczywi艣cie mo偶na w tym celu po prostu da膰 u偶ytkownikowi do dyspozycji fakt F_TRANSAKCJE z danymi wyci膮gni臋tymi z tabeli EDW.TRANSAKCJA plus podpi臋te do niej tabele EDW.KLIENT i EDW.TYP_TRANSAKCJI - ale w takim przypadku konsument musi sobie policzy膰 ilo艣ci transakcji poszczeg贸lnych typ贸w per klient samodzielnie. Niekt贸rzy u偶ytkownicy sobie z tym poradz膮. Inni - niekoniecznie. Dlatego dla u艂atwienia tworzymy tabel臋 DMARTS.AGG_KLIENT_TYP_TRANSAKCJI, w kt贸rej udost臋pniamy wy艂膮cznie dane zagregowane na poziomie szczeg贸艂owo艣ci pojedynczego klienta. Mo偶emy to tego do艂o偶y膰 drug膮 tabel臋: DMARTS.AGG_TYP_TRANSAKCJI_KLIENT, kt贸ra b臋dzie robi艂a co艣 odwrotnego: pokazywa艂a ilu klient贸w wygenerowa艂o poszczeg贸lne typy transakcji. A wi臋c: bardzo niewiele rekord贸w (ile mo偶emy mie膰 typ贸w transakcji? trzy? pi臋膰? dziesi臋膰?) z du偶ymi licznikami.

Innym "dodatkowym" typem tabeli w DMARTS mo偶e by膰 tabela 艂膮cz膮ca dwa r贸偶ne fakty. Co艣, co zazwyczaj wymaga JOIN-a mi臋dzy dwiema stosunkowo du偶ymi tabelami z EDW, mo偶e by膰 zmaterializowane w postaci gotowej do konsumpcji tabeli w DMARTS. Przyk艂adowo mo偶emy sobie wyobrazi膰 tabel臋 fakt贸w ZAM脫WIENIA oraz drug膮, FAKTURY - obydwie dotycz膮 w zasadzie tego samego procesu, ale innych jego etap贸w. Nie do ka偶dego zam贸wienia b臋dzie faktura, nie do ka偶dej faktury b臋dzie zam贸wienie, ale w wi臋kszo艣ci przypadk贸w b臋dzie istnie膰 mi臋dzy nimi po艂膮czenie. I tu mo偶emy stworzy膰 "pomost" mi臋dzy faktami, kojarz膮cy rekordy z jednej tabeli z rekordami z drugiej. W warstwie EDW b臋dzie to tabela "faktopodobna", w takim sensie, 偶e b臋dzie mia艂a bardzo du偶o rekord贸w, za to tylko dwie w膮skie kolumny: ID faktury i ID zam贸wienia. Natomiast w warstwie DMARTS wywleczemy wszystkie "strawne" kolumny z obydwu tabel spi臋tych ww. pomostem, plus ewentualne wymiary i wszystko zapiszemy jako DMARTS.B_ZAMOWIENIA_FAKTURY (przedrostek B_ oznacza tu "bridge" czyli "pomost" mi臋dzy dwoma faktami).

Powy偶szy scenariusz jest tylko jednym z wielu mo偶liwych - w rzeczywisto艣ci mo偶emy mie膰 1:1 mi臋dzy pojedyncz膮 pozycj膮 w zam贸wieniu, a pojedyncz膮 pozycj膮 na fakturze, albo nawet n:m mi臋dzy nimi - i tak dalej

Oczywi艣cie wszystko zale偶y tutaj od tego, w jaki spos贸b wymodelujemy dane w hurtowni. Zam贸wienie => Faktura => P艂atno艣膰 => Dostawa to tak naprawd臋 etapy tego samego procesu i mo偶na je wymodelowa膰 w jednej tabeli / grupie tabel, zamiast kombinowa膰 z ich rozbijaniem na cz臋艣ci, a nast臋pnie budowaniem mi臋dzy tymi cz臋艣ciami pomost贸w. Ale tu tu偶 schodzimy na tematy niezwi膮zane z DMARTS. Mo偶e wi臋c innym razem.

Wracaj膮c do Data Marts: najcz臋艣ciej b臋dzie tak, 偶e dane w tej warstwie b臋d膮 zmaterializowane (a wi臋c: tabela lub przynajmniej materialized view), ale czasami dla niewielkich encji mo偶na sobie pozwoli膰 na utworzenie zwyk艂ych widok贸w (view) ci膮gn膮cych dane bezpo艣rednio z EDW, dla uproszczenia ETL.

Do艣膰 powszechn膮 praktyk膮 jest te偶 "pivotowanie" danych z EDW do DMARTS. Je偶eli mamy w EDW dane z kilku lat, mo偶emy w DMARTS stworzy膰 tabel臋, kt贸rej poszczeg贸lne kolumny b臋d膮 reprezentowa艂y kolejne lata. Rozwi膮zanie jest o tyle nieelastyczne, 偶e raz do roku trzeba zmienia膰 t臋 tabel臋 (dok艂ada膰 oklejny rok), ale mo偶na ten problem "obej艣膰" u偶ywaj膮c kolumn typu "ROK_BIEZACY", "ROK_MINUS_1", "ROK_MINUS_2" i tak dalej. Wszystko zale偶y od tego, czego oczekuj膮 do DMARTS u偶ytkownicy ko艅cowi.

Kolejna sprawa, dotycz膮ca zar贸wno EDW jak i DMARTS, to utrzymywanie "porz膮dku" w referencjach mi臋dzy tabelami. A wi臋c je偶eli mamy fakt F_FAKTURA i podpi臋ty do niego wymiar D_KLIENT, to stw贸rzmy mi臋dzy nimi referential integrity constraint, dzi臋ki czemu nie tylko unikniemy duplikacji danych, ale dodatkowo poprawimy wydajno艣膰 wykonywania zapyta艅, jak r贸wnie偶 upro艣cimy prac臋 warstwie si贸dmej (czyli konsumentom danych z naszej hurtowni). Niekt贸re platformy raportuj膮ce potrafi膮 rozpozna膰 "po艂膮czenia" mi臋dzy tabelami, je偶eli takie po艂膮czenia - w艂a艣nie w formie referential integrity constraints - stworzymy na poziomie bazy danych.

Ostatnia, do艣膰 istotna sprawa, o kt贸rej warto pami臋ta膰: DMARTS jest dla u偶ytkownik贸w ko艅cowych, a wi臋c postarajmy si臋 tu zminimalizowa膰 ilo艣膰 atrybut贸w technicznych, eksponuj膮c g艂贸wnie atrybuty biznesowe. Klienta nie interesuje, jakie ID nadali艣my z lokalnej sekwencji jego fakturze. U偶ytkownika interesuje numer faktury.

Za tydzie艅 postaram si臋 - o ile czas i ch臋ci pozwol膮 - na zbudowanie pro艣ciutkiego przyk艂adu obrazuj膮cego "przej艣cie" mi臋dzy warstwami EDW i DMARTS.

https://xpil.eu/rso

Leave a Comment

Komentarze mile widziane.

Je偶eli chcesz do komentarza wstawi膰 kod, u偶yj sk艂adni:
[code]
tutaj wstaw sw贸j kod
[/code]

Je偶eli zrobisz liter贸wk臋 lub zmienisz zdanie, mo偶esz edytowa膰 komentarz po jego zatwierdzeniu.