Monta moneen -suhteen ohjeet
Tämä artikkeli koskee tietojen mallintajaa, joka käsittelee Power BI Desktopia. Tässä kuvataan kolme erilaista monta-moneen-mallinnusskenaariota. Artikkelissa on myös ohjeita niiden onnistuneeseen suunnitteluun malleissasi.
Muistiinpano
Tämä artikkeli ei johdata malliyhteyksiin. Jos et ole täysin perehtynyt suhteisiin, niiden ominaisuuksiin tai niiden määrittämiseen, suosittelemme, että luet ensin Mallien suhteet Power BI Desktopissa -artikkelin.
On myös tärkeää, että ymmärrät tähtirakenteen suunnittelun. Lisätietoja on kohdassa Tutustu tähtirakenteeseen ja sen merkitykseen Power BI:ssä.
Monta-moneen-skenaarioita on itse asiassa kolme. Ne ilmenevät, kun teet seuraavaa:
- Liitä kaksi dimensiotyyppistä taulukkoa
- Liitä kaksi faktatyyppistä taulukkoa
- Liitä yksityiskohtaiset faktatyyppiset taulukot, kun faktatyyppinen taulukko sisältää yksityiskohtaisempia rivejä kuin dimensiotyyppisen taulukon rivit
Muistiinpano
Power BI tukee nyt suoraan monta moneen -yhteyksiä. Lisätietoja on artikkelissa Monta-moneen-yhteyksien käyttäminen Power BI Desktopissa.
Liitä monta-moneen-dimensiot
Käsitellään ensimmäistä monta-moneen-skenaariotyyppiä esimerkin avulla. Klassinen skenaario yhdistää kaksi entiteettiä: pankin asiakkaat ja pankkitilit. Ajattele, että asiakkailla voi olla useita tilejä ja tileillä voi olla useita asiakkaita. Kun tilillä on useita asiakkaita, heitä kutsutaan yhteistilin haltijoiksi.
Näiden entiteettien mallintaminen on yksinkertaista. Toinen dimensiotyyppinen taulukko sisältää tilit ja toinen dimensiotyyppinen taulukko sisältää asiakkaat. Dimensiotyyppisten taulukoiden tavoin jokaisessa taulukossa on tunnussarake. Jos haluat mallintaa kahden taulukon välisen suhteen, tarvitaan kolmas taulukko. Tätä taulukkoa kutsutaan yleensä välitaulukoksi. Tässä esimerkissä sen tehtävänä on tallentaa yksi rivi jokaista asiakastililiitosta kohden. Kun tämä taulukko sisältää vain tunnussarakkeita, sitä kutsutaan faktattomaksi faktataulukoksi.
Tässä on yksinkertainen mallikaavio kolmesta taulukosta.
Ensimmäisen taulukon nimi on Account, ja se sisältää kaksi saraketta: AccountID ja Account. Toisen taulukon nimi on AccountCustomer, ja se sisältää kaksi saraketta: AccountID ja CustomerID. Kolmannen taulukon nimi on Customer, ja se sisältää kaksi saraketta: CustomerID ja Customer. Minkään taulukoiden välillä ei ole suhteita.
Kaksi yksi-moneen-suhdetta lisätään taulukoiden liimiseksi. Tässä on päivitetty mallikaavio liittyvistä taulukoista. Transaction-niminen faktatyyppinen taulukko on lisätty. Siihen kirjataan tilitapahtumat. Välitaulukko ja kaikki tunnussarakkeet on piilotettu.
Mallikaaviota on muokattu taulukon rivien paljastamiseksi, jotta voidaan kuvata suhteiden suodatuksen leviämisen toimintaa.
Muistiinpano
Taulukon rivejä ei voi näyttää Power BI Desktop -mallikaaviossa. Tässä artikkelissa niin on kuitenkin tehty, jotta voidaan antaa selkeitä esimerkkejä keskustelun tueksi.
Neljän taulukon rivien tiedot kerrotaan seuraavassa luettelossa:
- Account-taulukossa on kaksi riviä:
- AccountID 1 liittyy tiliin Account-01
- AccountID 2 liittyy tiliin Account-02
- Asiakas-taulukossa on kaksi riviä:
- CustomerID 91 liittyy asiakkaaseen Customer-91
- CustomerID 92 liittyy asiakkaaseen Customer-92
- AccountCustomer-taulukossa on kolme riviä:
- AccountID 1 liittyy asiakkaaseen CustomerID 91
- AccountID 1 liittyy kohteeseen CustomerID 92
- AccountID 2 liittyy kohteeseen CustomerID 92
- Transaction-taulukossa on kolme riviä:
- Date 1. tammikuuta 2019, AccountID 1, Amount 100
- Date 2. helmikuuta 2019, AccountID 2, Amount 200
- Date 3. maaliskuuta 2019, AccountID 1, Amount -25
Katsotaan, mitä tapahtuu, kun malliin tehdään kysely.
Alla on kaksi visualisointia, jotka tekevät yhteenvedon Transaction-taulukon Amount-sarakkeesta. Ensimmäinen visualisointi on ryhmitelty tilin mukaan, joten Amount-sarakkeiden summa vastaa tilin saldoa. Toinen visualisointi on ryhmitelty asiakkaan mukaan, joten Amount-sarakkeiden summa vastaa asiakkaan saldoa.
Ensimmäisen visualisoinnin nimi on Account Balance, ja siinä on kaksi saraketta: Account ja Amount. Se näyttää seuraavan tuloksen:
- Account-01:n saldo on 75
- Account-02:n saldo on 200
- Kokonaismäärä on 275
Toisen visualisoinnin nimi on Customer Balance, ja siinä on kaksi saraketta: Customer ja Amount. Se näyttää seuraavan tuloksen:
- Customer-91:n saldo on 275
- Customer-92:n saldo on 275
- Kokonaismäärä on 275
Nopea silmäys taulukon riveihin ja Account Balance -visualisointiin kertoo, että tilien ja kokonaissumman tulos on oikea. Tämä johtuu siitä, että tilien ryhmittely johtaa suodatuksen levittämiseen kyseisen tilin Transaction-taulukkoon .
Kaikki ei kuitenkaan näy oikein Customer Balance -visualisoinnissa. Customer Balance -visualisoinnin molemmilla asiakkailla on sama saldo kuin kokonaissaldo. Tämä tulos voi olla oikea vain, jos jokainen asiakas on kaikkien tilien yhteinen tilin haltija. Näin ei ole tässä esimerkissä. Ongelma liittyy suodatuksen levittämiseen. Se ei ole matkalla Transaction-taulukkoon.
Noudata suhteiden suodatuksen ohjeita Customer-taulukosta Transaction-taulukkoon. On selvää, että Account- ja AccountCustomer-taulukoiden välinen suhde leviää väärään suuntaan. Tämän suhteen suodatuksen suunnaksi on asetettava Molemmat.
Account Balance -visualisointiin ei ole odotetusti tehty muutoksia.
Customer Balance -visualisoinneissa näkyy kuitenkin nyt seuraava tulos:
- Customer-91:n saldo on 75
- Customer-92:n saldo on 275
- Kokonaismäärä on 275
Customer Balance -visualisoinnissa näkyy nyt oikea tulos. Noudata itse suodatusohjeita ja katso, miten asiakkaiden saldot laskettiin. Huomaa myös, että visuaalinen summa tarkoittaa kaikkia asiakkaita.
Joku, joka ei tunne mallien suhteita, voisi päätellä, että tulos on virheellinen. Hän saattaisi kysyä seuraavaa: Miksi Customer-91:n ja Customer-92:n kokonaissaldo ei ole 350 (75 + 275)?
Vastaus hänen kysymykseensä edellyttää monta-moneen-suhteen ymmärtämistä. Asiakkaan saldo voi edustaa useiden tilien saldojen lisäystä, joten asiakkaiden saldot eivät ole lisääviä.
Liitä monta-moneen-dimensiot – ohjeet
Kun dimensiotyyppisten taulukoiden välillä on monta-moneen-suhde, annamme seuraavat ohjeet:
- Lisää kukin monta-moneen-liittyvästä entiteetistä mallitaulukkona ja varmista, että siinä on yksilöivä tunniste (ID) -sarake
- Lisää välitaulukko liittyvien entiteettien tallentamiseksi
- Luo yksi-moneen-suhteita kolmen taulukon välille
- Määritä yksi kaksisuuntainen suhde, jotta suodatuksen levitys jatkuu faktatyyppisiin taulukoihin
- Kun ei ole sopivaa, että tunnistearvoja puuttuu, määritä tunnussarakkeiden Is Nullable -ominaisuuden arvoksi FALSE – silloin tietojen päivittäminen epäonnistuu, jos puuttuvia arvoja ilmenee.
- Piilota välitaulukko (ellei se sisällä raportointiin tarvittavia lisäsarakkeita tai -mittareita)
- Piilota kaikki tunnussarakkeet, jotka eivät sovellu raportointiin (esimerkiksi, kun tunnukset ovat korvaavia avaimia).
- Jos on järkevää jättää tunnussarake näkyviin, varmista, että se on suhteen "yksi"-puolella – piilota aina "monta"-puolen sarake. Tuloksena on paras suodattimen suorituskyky.
- Sekaannusten ja väärinkäsitysten välttämiseksi kirjoita selitykset raportin käyttäjille – voit lisätä kuvauksia tekstiruutuihin tai visualisoinnin otsikon työkaluvihjeisiin.
Emme suosittele liittäväsi monta-moneen-dimensiotyyppisiä taulukoita suoraan. Tämä rakennemenetelmä edellyttää monta moneen -kardinaliteetin sisältävien suhteiden määrittämistä. Se voidaan saavuttaa käsitteellisesti, mutta se viittaa siihen, että liittyvät sarakkeet sisältävät arvojen kaksoiskappaleita. Se on kuitenkin hyvä rakennekäytäntö, että dimensiotyyppisissä taulukoissa on tunnussarake. Dimensiotyyppisissä taulukoissa tunnussarakkeen on aina oltava suhteen "yksi"-puolella.
Liitä monta-moneen-faktat
Toinen monta-moneen-skenaariotyyppi koskee kahden faktatyyppisen taulukon liittamista. Kaksi faktatyyppistä taulukkoa voidaan liittää suoraan. Tästä suunnittelutekniikasta voi olla hyötyä nopeassa ja yksinkertaisessa tietojen tarkastelussa. Emme kuitenkaan yleensä suosittele tätä rakennemenetelmää. Kerromme syyn tälle myöhemmin tässä osiossa.
Käsitellään esimerkkiä, joka koskee kahta faktatyyppistä taulukkoa: Order ja Fulfillment. Order-taulukko sisältää yhden rivin tilausriviä kohti, ja Fulfillment-taulukko voi sisältää nolla riviä tai enemmän rivejä tilausriviä kohti. Tilaus-taulukon rivit vastaavat myyntitilauksia. Fulfillment-taulukon rivit edustavat toimitettuja tilauskohteita. Monta-moneen-suhde yhdistää kaksi OrderID-saraketta, ja suodatus leviää vain Order-taulukosta (Order suodattaa Fulfillment-kohteen).
Suhteen kardinaliteeti on määritetty monta moneen OrderID-arvojen kaksoiskappaleiden tallentamisen tukemiseksi molemmissa taulukoissa. Order-taulukossa voi olla OrderID-arvojen kaksoiskappaleita, koska tilaukseen voi olla useita rivejä. Fulfillment-taulukossa voi olla OrderID-arvojen kaksoiskappaleita, koska tilauksissa voi olla useita rivejä ja tilausriveillä voi olla useita lähetyksiä.
Tarkastellaan nyt taulukon rivejä. Huomioi, että Fulfillment-taulukon tilausriveillä voi olla useita lähetyksiä. (Jos tilausriviä ei ole, se tarkoittaa, että tilausta ei ole vielä toteutettu.)
Kahden taulukon rivien tiedot kerrotaan seuraavassa luettelossa:
- Order-taulukossa on viisi riviä:
- OrderDate 1. tammikuuta 2019, OrderID 1, OrderLine 1, ProductID Prod-A, OrderQuantity 5, Sales 50
- OrderDate 1. tammikuuta 2019, OrderID 1, OrderLine 2, ProductID Prod-B, OrderQuantity 10, Sales 80
- OrderDate 2. helmikuuta 2019, OrderID 2, OrderLine 1, ProductID Prod-B, OrderQuantity 5, Sales 40
- OrderDate 2. helmikuuta 2019, OrderID 2, OrderLine 2, ProductID Prod-C, OrderQuantity 1, Sales 20
- OrderDate 3. maaliskuuta 2019, OrderID 3, OrderLine 1, ProductID Prod-C, OrderQuantity 5, Sales 100
- Fulfillment-taulukossa on neljä riviä:
- FulfillmentDate 1. tammikuuta 2019, FulfillmentID 50, OrderID 1, OrderLine 1, FulfillmentQuantity 2
- FulfillmentDate 2. helmikuuta 2019, FulfillmentID 51, OrderID 2, OrderLine 1, FulfillmentQuantity 5
- FulfillmentDate 2. helmikuuta 2019, FulfillmentID 52, OrderID 1, OrderLine 1, FulfillmentQuantity 3
- FulfillmentDate 1. tammikuuta 2019, FulfillmentID 53, OrderID 1, OrderLine 2, FulfillmentQuantity 10
Katsotaan, mitä tapahtuu, kun malliin tehdään kysely. Tässä on taulukon visualisointi, jossa verrataan Order-taulukon OrderID-sarakkeen tilaus- ja huolintamääriä.
Visualisointi näyttää tarkan tuloksen. Mallin hyödyllisyys on kuitenkin rajallinen – voit suodattaa tai ryhmitellä vain Order-taulukon OrderID-sarakkeen mukaan.
Liitä monta-moneen-faktat – ohjeet
Emme yleisesti ottaen suosittele kahden faktatyyppisen taulukon liittamista suoraan monta-moneen-kardinaliteetin avulla. Tärkein syy on se, että malli ei tarjoa joustavuutta raportin visualisointien suodatukseen tai ryhmittelyyn. Esimerkissä visualisoinnit voivat suodattaa tai ryhmitellä vain Order-taulukon OrderID-sarakkeen mukaan. Toinen syy liittyy tietoihisi laatuun. Jos tietoihisi liittyy eheysongelmia, joitakin rivejä voidaan jättää pois kyselyjen tekemisen aikana rajoitetun suhteen vuoksi. Lisätietoja on artikkelissa Mallien suhteet Power BI Desktopissa (Suhteen arviointi).
Faktatyyppisten taulukoiden suora liittelyn sijaan suosittelemme tähtirakenteen periaatteiden käyttöönottoa. Voit tehdä sen lisäämällä dimensiotyyppisiä taulukoita. Dimensiotyyppiset taulukot liittyvät faktatyyppisiin taulukoihin yksi-moneen-suhteiden avulla. Tämä suunnittelumenetelmä on tehokas, sillä se tarjoaa joustavia raportointivaihtoehtoja. Sen avulla voit suodattaa tai ryhmitellä käyttämällä mitä tahansa dimensiotyypin sarakkeita ja tehdä yhteenvedon mistä tahansa liittyvästä faktatyyppisestä taulukosta.
Mietitäänpä parempi ratkaisu.
Huomioi seuraavat rakennemuutokset:
- Mallissa on nyt neljä lisätaulukkoa: OrderLine, OrderDate, Product ja FulfillmentDate
- Kaikki neljä lisätaulukkoa ovat dimensiotyyppisiä, ja yksi-moneen-suhteet liittävät nämä taulukot faktatyyppisiin taulukoihin
- OrderLine-taulukko sisältää OrderLineID-sarakkeen, joka edustaa OrderID-arvoa kerrottuna sadalla sekä OrderLine-arvoa eli kunkin tilausrivin yksilöllistä tunnistetta.
- Order- ja Fulfillment-taulukot sisältävät nyt OrderLineID-sarakkeen, eivätkä ne enää sisällä OrderID- ja OrderLine-sarakkeita
- Fulfillment-taulukko sisältää nyt OrderDate- ja ProductID-sarakkeet
- FulfillmentDate-taulukko liittyy vain Fulfillment-taulukkoon
- Kaikki yksilöivän tunnisteen sarakkeet on piilotettu
Kun otat käyttöön tähtirakenteen periaatteet, saat seuraavat edut:
- Raportin visualisoinnit voivat suodattaa tai ryhmitellä dimensiotyyppisen taulukon minkä tahansa näkyvissä olevan sarakkeen mukaan
- Raportin visualisoinnit voivat tehdä yhteenvedon faktatyyppisen taulukon mistä tahansa näkyvissä olevasta sarakkeesta
- OrderLine-, OrderDate- tai Product-taulukoihin käytetyt suodattimet leviävät molempiin faktatyyppisiin taulukoihin
- Kaikki suhteet ovat yksi moneen -suhteita, ja jokainen suhde on tavallinen suhde. Tietojen eheyteen liittyviä ongelmia ei peitetä. Lisätietoja on artikkelissa Mallien suhteet Power BI Desktopissa (Suhteen arviointi).
Liitä yksityiskohtaiset faktat
Tämä monta-moneen-skenaario on hyvin erilainen kuin kaksi muuta tässä artikkelissa jo kuvattua skenaariota.
Käsitellään esimerkkiä, joka koskee neljää taulukkoa: Date, Sales, Product ja Target. Date ja Product ovat dimensiotyyppisiä taulukoita, ja ne kaikki liittyvät faktatyyppiseen Sales-taulukkoon yksi-moneen-suhteiden avulla. Tähän asti tämä sopii hyvin tähtirakenteen rakenteeseen. Target-taulukko ei kuitenkaan ole vielä liitetty muihin taulukoihin.
Target-taulukko sisältää kolme saraketta: Category, TargetQuantity ja TargetYear. Taulukon riveillä näkyvät vuosi- ja tuoteluokat. Toisin sanoen kullekin tuoteluokalle määritetään joka vuosi tavoitteet, joilla mitataan myynnin suorituskykyä.
Target-taulukko sisältää ylemmän tason tietoja kuin dimensiotyyppiset taulukot, joten yksi-moneen-suhdetta ei voi luoda. Tämä koskee vain yhtä suhdetta. Tutkitaan, miten Target-taulukko voidaan liittää dimensiotyyppisiin taulukoihin.
Liitä yksityiskohtaiset ajanjaksot
Date- ja Target-taulukoiden välisen suhteen tulee olla yksi-moneen-suhde. Tämä johtuu siitä, että TargetYear-sarakkeen arvot ovat päivämääriä. Tässä esimerkissä jokainen TargetYear-sarakearvo on kohdevuoden ensimmäinen päivämäärä.
Vihje
Kun tallennat faktoja, joiden ajan rakeisuus on suurempi kuin päivä, määritä sarakkeen tietotyypiksi Päivämäärä (tai Ken numero, jos käytät päivämääräavaimia). Tallenna sarakkeeseen arvo, joka edustaa ajanjakson ensimmäistä päivää. Esimerkiksi vuosijaksoon tallennetaan kyseisen vuoden 1. tammikuuta, ja kuukausijaksoon tallennetaan kyseisen kuukauden ensimmäinen päivä.
On kuitenkin varmistettava, että kuukausi- tai päivämäärätason suodattimet tuottavat merkityksellisen tuloksen. Ilman erityistä laskentalogiikkaa raportin visualisoinnit voivat ilmoittaa, että kohdepäivämäärät ovat kirjaimellisesti kunkin vuoden ensimmäinen päivä. Kaikki muut päivät – ja kaikki kuukaudet lukuun ottamatta tammikuuta – tekevät kohdemäärästä tyhjän.
Seuraavasta matriisivisualisoinnista näet, mitä tapahtuu, kun raportin käyttäjä poraudutaan vuodesta kuukausiin. Visualisointi tekee yhteenvedon TargetQuantity-sarakkeesta. (. Näytä kohteet, joilla ei ole tietoja -asetus on otettu käyttöön matriisin riveille.)
Jos haluat välttää tämän, suosittelemme, että hallitset faktatietojen yhteenvetoa mittareita käyttämällä. Yksi tapa hallita yhteenvetoa on palauttaa TYHJÄ, kun alemman tason ajanjaksoille tehdään kyselyjä. Toinen tapa – joka on määritetty joillekin kehittyneille DAX:ille – on jakaa arvot alemman tason ajanjaksoille.
Katso seuraavaa mittarimääritystä, jossa käytetään ISFILTERED DAX-funktiota. Se palauttaa arvon vain, kun Date- tai Month-sarakkeita ei ole suodatettu.
Target Quantity =
IF(
NOT ISFILTERED('Date'[Date])
&& NOT ISFILTERED('Date'[Month]),
SUM(Target[TargetQuantity])
)
Seuraava matriisivisualisointi käyttää nyt Target Quantity -mittaria . Se näyttää, että kaikki kuukausittaiset kohdemäärät ovat TYHJIÄ.
Liitä yksityiskohtainen (ei-päivämäärä)
Erilaista rakennemenetelmää vaaditaan, kun dimensiotyyppisen taulukon ei-päivämääräsarake liittyy faktatyyppiseen taulukkoon (ja se on yksityiskohtainen kuin dimensiotyyppinen taulukko).
Category-sarakkeet (sekä Product- että Target-taulukoista) sisältävät arvojen kaksoiskappaleita. Yksi-moneen-suhteen "yhtä" ei siis ole. Tässä tapauksessa sinun on luotava monta-moneen-suhde. Yhteyden on levitettävä suodattimet yhteen suuntaan dimensiotyyppisestä taulukosta faktatyyppiseen taulukkoon.
Tarkastellaan nyt taulukon rivejä.
Target-taulukossa on neljä riviä: kaksi riviä kullekin kohdevuodelle (2019 ja 2020) ja kaksi luokkaa (Clothing ja Accessories). Product-taulukossa on kolme tuotetta. Kaksi niistä kuuluu vaateluokkaan ja toinen kuuluu asusteluokkaan. Yhden vaatteen väri on vihreä ja kahden muun sininen.
Taulukon visualisoinnin ryhmittely Product-taulukon Category-sarakkeen mukaan tuottaa seuraavan tuloksen.
Tämä visualisointi tuottaa oikean tuloksen. Katsotaan nyt, mitä tapahtuu, kun kohdemäärän ryhmittelyyn käytetään Product-taulukon Color-saraketta.
Visualisointi tuottaa virheellistä tietoa. Mitä täällä tapahtuu?
Product-taulukon Color-sarakkeen suodatin aiheuttaa kaksi riviä. Toinen rivi on Clothing-luokalle ja toinen Accessories-luokalle. Nämä kaksi luokka-arvoa levitetään suodattimina Target-taulukkoon. Toisin sanoen kahden luokan tuotteissa käytetään sinistä väriä, joten näitä luokkia käytetään kohteiden suodattamiseen.
Jos haluat välttää tämän, suosittelemme, että hallitset faktatietojen yhteenvetoa mittareita käyttämällä, kuten edellä kuvattiin.
Kokeile seuraavaa mittarimääritystä. Huomaa, että kaikkien luokkatason alapuolella olevien Product-taulukon sarakkeiden suodatus testataan.
Target Quantity =
IF(
NOT ISFILTERED('Product'[ProductID])
&& NOT ISFILTERED('Product'[Product])
&& NOT ISFILTERED('Product'[Color]),
SUM(Target[TargetQuantity])
)
Seuraava taulukkovisualisointi käyttää nyt Target Quantity -mittaria . Se näyttää, että kaikki värien kohdemäärät ovat TYHJIÄ.
Lopullinen mallirakenne näyttää seuraavalta.
Liitä yksityiskohtaiset faktat – ohjeet
Kun sinun täytyy liittää dimensiotyyppinen taulukko faktatyyppiseen taulukkoon ja faktatyyppisessä taulukossa on yksityiskohtaisempia rivejä kuin dimensiotyyppisessä taulukossa, huomioi seuraavat ohjeet:
- Yksityiskohtaiset faktat, päivämäärät:
- Tallenna faktatyyppiseen taulukkoon ajanjakson ensimmäinen päivämäärä
- Luo yksi-moneen-suhde päivämäärätaulukon ja faktatyyppisen taulukon välille
- Muut yksityiskohtaiset faktat:
- Luo monta-moneen-suhde dimensiotyyppisen taulukon ja faktatyyppisen taulukon välille
- Kummallekin tyypille:
- Hallitse yhteenvetoa mittarilogiikalla – palauta TYHJÄ, kun alemman tason dimensiotyyppisiä sarakkeita käytetään suodatukseen tai ryhmittelyun
- Piilota yhteenvedetyt faktatyyppisen taulukon sarakkeet – tällä tavalla vain mittareita voidaan käyttää faktatyyppisen taulukon yhteenvetoon
Liittyvä sisältö
Saat lisätietoja tähän artikkeliin liittyen tutustumalla seuraaviin resursseihin: