Dimensio on dataa kuvaileva taulu joka vastaa kysymyksiin kuka, mitä, missä, milloin ja miten. Dimensioita käytetään usein kertomaan tapahtumien lisätietoja esim. asiakaskohtaisesti. Faktataulussa on luvut ja dimensiossa konteksti sekä metatiedot. Ilman hyvin mallinnettuja dimensioita faktataulun rivit ovat pelkkää numerosarjaa.
Dimensiot toimivat 1:M relaatioiden kautta. Jokaiselle faktataulun riville löytyy tasan yksi vastaava rivi dimensiossa. Tämä yksi-moneen-suhde (1:*) on tähtimallin perusrakenne.
Hyvin rakennettu dimensio on leveä ja litteä: paljon kuvailevia sarakkeita, ei alatauluja. Tämä on tietoista denormalisointia. Loppukäyttäjät haluavat suodattaa asiakasta maan, segmentin ja toimialan mukaan yhdestä taulusta, ei kolmesta liittyneestä taulusta. Jos data tulee hierarkkisena lumihiutalemallina, se on hyvä yhdistää yhdeksi tauluksi ennen lataamista — katso taulujen litistäminen.
| Osa | Rooli | Esimerkki |
|---|---|---|
| Surrogaattiavain (SK) | Dimension pääavain (PK). Aina kokonaisluku, aina järjestelmän generoima — ei koskaan lähdejärjestelmän avain. Mahdollistaa historian säilyttämisen. | AsiakasAvain INT |
| Luonnollinen avain (NK / Business Key) | Lähdejärjestelmän tunniste. Säilytetään dimensiossa hakua ja debug-työtä varten, mutta ei käytetä relaatioihin. | AsiakasTunnus VARCHAR |
| Attribuutit | Kuvailevat sarakkeet, joilla raportissa suodatetaan, ryhmitellään ja leikataan. Matala kardinaliteetti = nopea suorituskyky. | Maa, Kaupunki, Segmentti, Toimiala |
| Voimassaoloaika | SCD Type 2 -mallinnuksessa: mistä alkaen ja mihin saakka rivi on voimassa. | AlkuPvm DATE, LoppuPvm DATE, OnkoNykyinen BIT |
Lähes kaikki dimensiot muuttuvat ajan myötä: asiakas vaihtaa kaupunkia, tuote vaihtaa kategoriaa, myyjä siirtyy toiseen tiimiin. SCD-tyyppi määrittää, miten dimensio käsittelee muutokset — säilytetäänkö historia vai ylikirjoitetaanko vanha tieto.
| Tyyppi | Nimi | Toiminta | Historia | Käyttötilanne |
|---|---|---|---|---|
| Type 0 | Kiinteä | Arvo ei muutu koskaan latauksen jälkeen. | Ei | Syntymäpäivä, alkuperäinen rekisteröintipäivä |
| Type 1 | Ylikirjoita | Vanha arvo korvataan uudella. Yksinkertaisin toteutus. | Ei, historia katoaa | Kirjoitusvirheen korjaus, osoitteen päivitys kun historialla ei ole merkitystä |
| Type 2 | Lisää uusi rivi | Muutos luo uuden rivin uudella surrogaattiavaimella. Vanha rivi suljetaan (LoppuPvm). Faktataulun historialliset rivit viittaavat edelleen vanhan rivin avaimeen. | Kyllä, täydellinen historia | Asiakkaan siirtyminen toiseen segmenttiin, myyjän tiimivaihdos, silloin kun historiatiedolla on liiketoiminnallinen merkitys |
| Type 3 | Lisää sarake | Lisätään erillinen sarake "edellinen arvo" varten. Tallentaa vain yhden historiavaiheen. | Osittain, vain yksi askel taaksepäin | Harvinainen. Toimii kun tarvitaan vain "nykyinen vs. edellinen" -vertailu |
| Type 4 | Historiataulu | Nykyarvot pysyvät päädimensiossa. Muutoshistoria tallennetaan erilliseen historiatauluun. | Kyllä, erillisessä taulussa | Kun dimensio on erittäin suuri ja historiamuutoksia paljon — Type 2 turpoaa liikaa |
| Type 6 | Hybridi (1+2+3) | Yhdistää tyypit 1, 2 ja 3: uusi rivi muutoksesta (Type 2), nykyarvo päivitetään kaikkiin riveihin (Type 1), edellinen arvo säilyy omassa sarakkeessa (Type 3). | Kyllä + nykyarvo helposti saatavilla | Kun tarvitaan sekä historia että helppo suodatus nykyisellä arvolla ilman monimutkaisia DAX-kaavoja |
Asiakas Matti Meikäläinen (AsiakasTunnus = CU-001) siirtyy segmentistä "Pienasiakas" segmenttiin "Avainasiakas" 15.3.2024.
| AsiakasAvain (SK) | AsiakasTunnus (NK) | Nimi | Segmentti | AlkuPvm | LoppuPvm | OnkoNykyinen |
|---|---|---|---|---|---|---|
| 1001 | CU-001 | Matti Meikäläinen | Pienasiakas | 2020-01-01 | 2024-03-14 | 0 |
| 1847 | CU-001 | Matti Meikäläinen | Avainasiakas | 2024-03-15 | 9999-12-31 | 1 |
Faktataulun myyntirivit ennen 15.3.2024 viittaavat AsiakasAvaimeen 1001 → segmentti "Pienasiakas". Myyntirivit sen jälkeen viittaavat avaimeen 1847 → segmentti "Avainasiakas". Historia säilyy täydellisenä ilman erillistä muutoslokia.
Power BI:n VertiPaq-moottori pakkaa sarakkeet kardinaliteetin perusteella: mitä vähemmän uniikkeja arvoja, sitä parempi pakkaussuhde ja sitä nopeampi kysely. Surrogaattiavain on ainoa sarake, jolla odotetaan korkea kardinaliteetti — kaikki muut attribuutit tulisi pyrkiä pitämään matalana.
| Dimension koko | Uniikkeja avaimia | Esimerkki | Muistivaikutus | Huomiot |
|---|---|---|---|---|
| Pieni | < 1 000 | Maa, alue, tuotekategoria, myyntikanava | Minimaali | Erinomainen pakkaus. Ei suorituskykyhuolia missään tilanteessa. |
| Pieni–keski | 1 000 – 100 000 | Tuotedimensio (laaja katalogi), kustannuspaikat | Matala | Toimii hyvin. Varmista että attribuuttisarakkeet eivät ole korkean kardinaliteetin tekstikenttiä. |
| Keski | 100 000 – 1 000 000 | Asiakasdimensio (keskisuuri yritys) | Kohtalainen | VertiPaq pakkaa edelleen hyvin jos attribuutit ovat koodeja/kategorioita. Vältä vapaamuotoisia tekstisarakkeita. |
| Suuri | 1 000 000 – 10 000 000 | Asiakasdimensio (suuri yritys tai kuluttajapalvelu) | Merkittävä | Suunnittele huolellisesti. Poista turhat sarakkeet. Harkitse Type 4 -historiamallinnusta Type 2:n sijasta ettei rivisarakkeiden määrä räjähdä. |
| Erittäin suuri | > 10 000 000 | Verkkosivuston käyttäjät, IoT-laitteet | Korkea — arkkitehtuurivalinta | Harkitse aggregointeja tai hierarkkista rakennetta. Taulussa on enemmän rivejä kuin tavanomaisessa faktataulussa — varmista onko se oikeasti dimensio vai fakta. |
Asiakasdimensio, 2 000 000 riviä:
| Sarake | Uniikkeja arvoja | Tyyppi | Arvioitu koko muistissa |
|---|---|---|---|
| AsiakasAvain (SK) | 2 000 000 | INT | ~8 MB, INT pakkautuu erinomaisesti |
| Segmentti | 5 | VARCHAR | < 1 MB, lähes ilmainen |
| Maa | 40 | VARCHAR | < 1 MB, lähes ilmainen |
| Sähköposti (korkea kardinaliteetti) | 2 000 000 | VARCHAR | ~200–400 MB, ei pakkaudu, jokainen arvo tallennetaan erikseen |
| Rekisteröintiaika (timestamp) | ~1 800 000 | DATETIME | ~150–300 MB, lähes jokainen arvo uniikki, pakkaus epäonnistuu |
Ratkaisu: Poista raporteille hyödyttömät korkean kardinaliteetin sarakkeet (sähköposti, puhelin) dimensiosta tai lataa ne erilliseen dimensioon josta niihin viitataan vain tarvittaessa. Timestamp-sarakkeet muunna DATE-tyypiksi tai liitä erilliseen Päivämääradimensioon.
Kolme asiaa, jotka on tehtävä oikein ennen kaikkea muuta: