Faktataulun mallinnus

Kirjoittanut Samu Lahdenperä · Julkaistu

Faktataulu on tähtimallin laskennallinen ydin: jokainen rivi edustaa yhtä mitattavaa tapahtumaa — myyntiä, tilausta, klikkausta tai muuta liiketoiminnan kannalta merkityksellistä tapahtumaa. Faktataulussa on luvut, dimensiossa konteksti. Yhteys dimensioihin kulkee kokonaislukumuotoisten vierasavaimien (FK) kautta yksi-moneen-relaatiolla: yhdelle dimensioriville voi löytyä tuhansia faktataulun rivejä, mutta jokaisella faktataulun rivillä on tasan yksi vastine jokaisessa dimensiossa. Tämä relaatiorakenne on edellytys sille, että Power BI:n VertiPaq-moottori pystyy pakkaamaan datan tehokkaasti ja laskemaan mittarit oikein.

Miten faktataulu rakentuu?

Hyvin rakennettu faktataulu on pitkä ja kapea: miljoonia rivejä, mutta vähän sarakkeita. Sarakkeet jakautuvat vierasavaimiin ja mittareihin, ei mitään muuta. Kuvailevat attribuutit kuuluvat dimensioihin, ei faktatauluun.

Taulukko 1, Myyntifaktan rakenne – Faktataulun saraketyypit, niiden roolit ja esimerkit
Osa Rooli Esimerkki
Vierasavain (FK, Foreign Key) INT-kokonaisluku joka linkittää dimension pääavaimeen (PK). Jokaista dimensiota kohti yksi FK-sarake. Mahdollistaa suodattamisen ja ryhmittelyn dimension attribuuteilla. AsiakasAvain, TuoteAvain, PvmAvain, MyyjaAvain
Additiivinen mittari (Additive Measure) Luku jota voi summata kaikkien dimensioiden yli — tulos on oikea riippumatta siitä, miltä kantilta katsot: maittain, kuukausittain tai tuotteittain. Yksinkertaisin ja suorituskykyisin mittarityyppi. Myyntisumma, Kappalemäärä, Kustannus
Semi-additiivinen mittari (Semi-Additive Measure) Voidaan summata joidenkin dimensioiden yli, muttei kaikkien. Useimmiten aika on se dimensio, jonka yli ei voi summata — kyseessä on silloin tilannekuva eikä tapahtuma. Varastosaldo, Tilin saldo, Avoimet tilaukset
Ei-additiivinen mittari (Non-Additive Measure) Ei voi summata minkään dimension yli. Laske aina DAX-kaavalla kontekstin mukaan. Tallenna sen sijaan komponentit (osoittaja ja nimittäjä) erillisinä additiivisina mittareina. Kateprosentti, Yksikköhinta, Konversioprosentti
Degeneraatioavain (DD, Degenerate Dimension) Lähdejärjestelmän tunniste jolla ei ole omaa dimensiotaulua eikä kuvailevia attribuutteja. Säilytetään faktataulussa hakua ja debug-työtä varten. TilausNumero, LaskuNumero, KuittiNumero
Esimerkki: FactMyynti — täydellinen faktataulu

Viisi matalan kardinaliteetin vierasavainta ja kolme additiivista mittaria — ei mitään muuta. Pääavain (PK) ja degeneraatioavaimet on jätetty tästä esimerkistä pois: molemmat ovat korkean kardinaliteetin sarakkeita (uniikki tai lähes uniikki arvo joka rivillä), jotka eivät pakkaudu VertiPaqissa. Faktataulu ei myöskään välttämättä tarvitse omaa surrogaattipääavainta — rivin yksilöi vierasavainten yhdistelmä. Jäljelle jää siis vain matalan kardinaliteetin vierasavaimia ja mittareita.

Taulukko 2, FactMyynti — rakenne ja esimerkkidata. Vain matalan kardinaliteetin vierasavaimet (INT) ja numeeriset mittarit — pääavain ja degeneraatioavaimet jätetty pois.
PvmAvain (FK) TuoteAvain (FK) AsiakasAvain (FK) MyymäläAvain (FK) MyyjaAvain (FK) Myyntisumma Kappalemäärä Kustannus
20260601 42 1042 7 18 149,90 1 89,50
20260601 17 1042 7 18 29,90 2 12,40
20260602 42 2205 3 24 149,90 1 89,50

Myyntisumma, Kappalemäärä ja Kustannus ovat additiivisia — niitä voi summata minkä tahansa dimension yli ja tulos on oikein. Kateprosentti puuttuu: se ei ole additiivinen, joten se lasketaan DAX:ssä Myyntisummasta ja Kustannuksesta.

Mitkä ovat faktataulun parhaat käytännöt?

Faktataulun kultaiset säännöt:
  1. Granulariteetti on päätettävä ensin. Ennen yhtäkään saraketta: mitä yksi rivi edustaa? Yksittäinen myyntirivi, päivätason yhteenveto vai kuukausitason aggregaatti? Granulariteetti ei saa muuttua taulun sisällä — eri tarkkuuden rivit samassa taulussa johtavat vääristyneisiin laskureihin.
  2. Pelkkiä lukuja — ei tekstiä. Kaikki kuvailevat attribuutit kuuluvat dimensioihin. Faktataulussa on avaimia ja mittareita, ei asiakkaan nimeä, tuotteen kuvausta eikä myyjän sähköpostia. VARCHAR-sarake faktataulussa on yleensä dimensioattribuutti joka ei ole löytänyt kotiaan.
  3. Jokainen FK löytää parin. Vierasavain joka ei löydä vastaavaa dimensioriviä luo Power BI:hin automaattisen "Blank"-rivin. Se näkyy raporteissa eikä siihen voi liittää attribuutteja. Korjaa ETL-prosessi tai käytä "tuntematon"-rivejä dimensioissa — katso dimensioiden mallinnus.
  4. Ei GUID- tai VARCHAR-avaimia relaatioihin. INT-surrogaattiavain pakkaantuu VertiPaqissa tehokkaasti. Teksti- ja GUID-avaimet kasvattavat mallin muistikokoa merkittävästi ja hidastavat relaatioiden läpikäyntiä.
  5. Faktataulu on ohut. Dimensiot ovat leveitä ja litistettyjä — faktataulu kapea.
  6. Ei laskettuja sarakkeita faktatauluun. Kateprosentti, muutos-% ja muut johdetut luvut lasketaan DAX-mittareina, ei tallenneta sarakkeiksi. Laskettu sarake vie muistia pysyvästi; DAX-mittari laskee vain pyydettäessä oikeassa suodatinkontekstissa.
  7. Additiivinen mittari on paras. Suunnittele granulariteetti niin, että mahdollisimman moni mittari on additiivinen. Kateprosentti ei ole additiivinen — tallenna sen sijaan Myyntisumma ja Kustannus erikseen ja laske prosentti DAX:ssä. Näin summaukset toimivat automaattisesti kaikilla tasoilla.

Faktataulujen kolme arkkityyppiä

Kaikki faktataulut eivät ole samanlaisia. Kimball jakaa faktataulut kolmeen perusarkkityyppiin sen mukaan, mitä yksi rivi edustaa ja miten rivit syntyvät ja muuttuvat ajan myötä. Valitse arkkityyppi liiketoimintatarpeen mukaan, ei teknisten preferenssien. Kimball Groupin dimensionaalisen mallinnuksen tekniikkaoppaassa käydään läpi kaikki kolme tyyppiä käytännön esimerkein.

Taulukko 3, Faktataulujen arkkityypit – Kolme perustyyppiä, niiden toimintaperiaate ja käyttötilanteet
Tyyppi Toiminta Rivimäärän kasvu Käyttötilanne
Transaktio
Transaction grain
Yksi rivi per tapahtuma. Rivejä ei koskaan päivitetä — vain lisätään uusia. Nopea: yksi rivi per tapahtuma, voi kasvaa satoihin miljooniin Myyntirivit, tilausrivit, verkkosivuklikkaukset, maksutapahtumat
Kausi
Periodic snapshot
Otetaan tilannekuva säännöllisesti (päivä, viikko, kuukausi). Yksi rivi per ajanjakso per seurattava kohde. Rivejä ei päivitetä — uusi ajanjakso luo uuden rivin. Tasainen: rivimäärä = ajanjaksojen määrä × kohteiden määrä Kuukausivarastosaldo, viikoittainen kassaennuste, kuukausittainen asiakassaldo
Kumulatiivinen
Accumulating snapshot
Yksi rivi per prosessi tai elinkaari. Rivejä päivitetään prosessin edetessä. Useita päivämäärä-FK:ta eri vaiheille — viittaa "ei tiedossa" -riviin dimensiossa jos vaihe ei ole vielä tapahtunut. Pysyy pienenä: rivi per prosessi, ei per tapahtuma Tilauksen elinkaari (tilaus → pakkaus → lähetys → toimitus), reklamaation käsittely, rekrytointiprosessi

Miten granulariteetti vaikuttaa suorituskykyyn Power BI:ssä?

Granulariteetti on faktataulun tärkein suunnittelupäätös — se määrittää sekä mitä kysymyksiä raporteissa voi esittää että kuinka nopeasti VertiPaq-moottori pystyy vastaamaan. Mitä hienompi granulariteetti, sitä enemmän rivejä — mutta Power BI:ssä rivimäärä ei ole merkittävin suorituskykytekijä. VertiPaq on sarakepohjainen tietokanta: se pakkaa datan sarake kerrallaan RLE- ja sanakirjapakkauksella, jolloin ratkaisevaa on sarakkeiden kardinaliteetti. Matala kardinaliteetti (muutama eri arvo, kuten alue tai tuotekategoria) pakkautuu tehokkaasti pitkien toistosekvenssien ansiosta; korkea kardinaliteetti (uniikki arvo jokaisella rivillä, kuten tilausnumero) ei pakkaudu. Perinteisessä rivipohjaisessa tietovarastossa rivimäärä on sen sijaan pääasiallinen suorituskykytekijä. Power BI:ssä todelliset pullonkaulat ovat DISTINCTCOUNT-laskenta, korkean kardinaliteetin sarakkeet ja RAM:n riittävyys. Mitä karkeampi granulariteetti (vähemmän yksilöiviä arvoja), sitä pienempi malli — mutta myös sitä enemmän yksityiskohtia menetät.

Taulukko 4, Granulariteetin vaikutus – Eri granulariteettitasojen rivimäärät, kardinaliteetti, suorituskyky ja käyttötilanteet
Granulariteetti Esimerkki Rivimäärä (esim.) Kardinaliteetti (esim.) Suorituskyky Käyttötilanne
Transaktiorivi Yksi myyntirivi 50–500 milj. Korkea — uniikki avain joka rivillä Nopea INT-avaimilla ja additiivisilla mittareilla — DISTINCTCOUNT ja VARCHAR-sarakkeet hidastavat enemmän kuin rivimäärä Tarvitaan tilausnumeron tai yksittäisen asiakkaan tarkkuudella
Päivätaso Myynti per tuote per päivä 1–10 milj. Matala — pvm × tuote toistuu Hyvä Ei tarvita transaktiotason hakuja — vain päivittäisiä trendejä
Kuukausitaso Myynti per tuote per kk alle 1 milj. Hyvin matala — kk × tuote Erinomainen Vain kuukausi- tai kvartaalitason raportointi, ei päiväkohtaisia trendejä tarvita
Granulariteetin vaikutus malliin — esimerkki:

Sama myyntidata kolmella eri granulariteetilla, 3 vuoden historia, 500 tuotetta, 50 000 myyntiä per päivä:

Taulukko 5, Granulariteetti ja muistikoko – Sama data kolmella granulariteetilla, korkeimman kardinaliteetin, muistikoon ja kyselymahdollisuuksien vertailu
Granulariteetti Rivimäärä Korkein kardinaliteetti (esim.) Arvioitu muistikoko Voi hakea yksittäisen tilauksen?
Transaktiorivi ~54 700 000 ~54,7 milj. — tilausnumero uniikki joka rivillä, ei pakkaudu ~800 MB – 2 GB Kyllä
Päivätaso ~547 500 ~1 095 — pvm (3 v × 365); tuote 500, pakkautuu hyvin ~10–30 MB Ei
Kuukausitaso ~18 000 ~500 — tuote; kk vain ~36, pakkautuu erinomaisesti ~1–3 MB Ei

Ratkaisu käytännössä: Jos tarvitset sekä transaktiotason yksityiskohtia (esim. tilausnumerot) että nopeat kuukausitrendit, harkitse kahta erillistä faktataulua eri granulariteeteilla — transaktiotaulu operatiiviseen käyttöön ja aggregoitu taulu johtoryhmäraportoinnille.

Dataneuvoksen mielipide

Kolme asiaa, jotka on tehtävä oikein ennen kaikkea muuta: