Monta moneen -suhteen ohjeet
Tämä artikkeli koskee tietojen mallintajaa, joka työskentelee Power BI Desktopin kanssa. 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 Model -suhteet Power BI Desktop -artikkelissa.
On myös tärkeää, että ymmärrät tähtirakenteen suunnittelun. Lisätietoja on kohdassa Tutustu tähtirakenteeseen ja sen merkitykseen Power BI -.
Monta-moneen-skenaarioita on kolme erilaista. Ne ilmenevät, kun teet seuraavaa:
- Liitä kaksi dimensiotaulukkoa
- Liitä kaksi faktataulukkoa
- Liitä yksityiskohtaiset faktataulukot, kun faktataulukko tallentaa rivit yksityiskohtaisemmin kuin dimensiotaulukon rivit
Liitä monta-moneen-dimensiot
Perinteinen monta-moneen-skenaario yhdistää kaksi entiteettiä, esimerkiksi pankkiasiakkaat ja pankkitilit. Ajattele, että asiakkailla voi olla useita tilejä ja tileillä voi olla useita asiakkaita. Kun tilillä on useita asiakkaita, heitä kutsutaan yleisesti yhteistilien haltijoiksi.
Näiden entiteettien mallintaminen on yksinkertaista. Toisessa dimensiotaulukko tallentaa tilit ja toisessa dimensiotaulukkoon asiakkaat. Dimensiotaulukoille ominaisesti jokaisessa taulukossa on yksilöllinen tunnistesarake (ID). Jos haluat mallintaa kahden taulukon välisen suhteen, tarvitaan kolmas taulukko. Tätä taulukkoa kutsutaan yleensä välitaulukon -. Tässä esimerkissä sen tehtävänä on tallentaa yksi rivi jokaista asiakastililiitosta kohden. Kun tämä taulukko sisältää vain tunnistesarakkeita, sitä kutsutaan faktattomaksi faktataulukoksi,.
Tässä on yksinkertainen kaavio kolmesta mallitaulukosta.
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. Faktataulukko nimeltä Transaction
on lisätty. Siihen kirjataan tilitapahtumat. Välitaulukko ja kaikki tunnistesarakkeet on piilotettu.
Mallikaaviota on muokattu taulukon rivien paljastamiseksi, jotta voidaan kuvata suhteiden suodatuksen leviämisen toimintaa.
Neljän taulukon rivien tiedot esitetään seuraavassa luettelossa:
-
Account
taulukossa on kaksi riviä:-
AccountID
1 liittyy tiliin Account-01 -
AccountID
2 liittyy tiliin Account-02
-
-
Customer
taulukossa on kaksi riviä:-
CustomerID
91 liittyy Customer-91 - -
CustomerID
92 liittyy Customer-92 -
-
-
AccountCustomer
taulukossa on kolme riviä:-
AccountID
1 liittyyCustomerID
91 -
AccountID
1 liittyyCustomerID
92 -
AccountID
2 liittyyCustomerID
92
-
-
Transaction
taulukossa on kolme riviä:1. tammikuuta 2019 , 1, 100 2. helmikuuta 2019 , 2, 200 3. maaliskuuta 2019 , , 1, -25
Katsotaan, mitä tapahtuu, kun malliin tehdään kysely.
Seuraavassa kuvassa on kaksi taulukon visualisointia, jotka tekevät yhteenvedon Transaction
-taulukon Amount
sarakkeesta. Ensimmäinen visualisointi on ryhmitelty tilin mukaan, joten Amount
sarakkeiden summa edustaa tilin saldoa. Toinen visualisointi on ryhmitelty asiakkaan mukaan, joten Amount
sarakkeiden summa edustaa asiakkaan saldoa.
Ensimmäisessä taulukon visualisoinnissa (Account Balance) 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 .
Toisessa taulukon visualisoinnissa (Customer Balance) 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. Jokaisella tämän visualisoinnin asiakkaalla 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. Suodattimet eivät virtaa Transaction
-taulukkoon asti.
Jos noudatat yhteyden suodatuksen ohjeita Customer
-taulukosta Transaction
-taulukkoon, voit päätellä, että Account
ja AccountCustomer
taulukoiden välinen suhde leviää väärään suuntaan. Tämän suhteen suodatuksen suunnaksi on asetettava Both
.
Account Balance -visualisointiin ei ole odotetusti tehty muutoksia.
Customer Balance -visualisoinnissa 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 sitä, kaikki asiakkaat.
Joku, joka ei tunne mallien suhteita, voisi päätellä, että tulos on virheellinen. Hän saattaisi kysyä seuraavaa: Miksi Customer-91
ja Customer-92
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 ei-lisääviä.
Liitä monta-moneen-dimensiot – ohjeet
Kun dimensiotaulukoiden välillä on monta-moneen-suhde, noudata seuraavia ohjeita:
- Lisää kukin monta-moneen-liittyvästä entiteetistä mallitaulukkona ja varmista, että siinä on tunnussarake.
- Lisää välitaulukko liittyvien entiteettien tallentamiseksi.
- Luo yksi-moneen-suhteita kolmen taulukon välille.
- Määritä yksi kaksisuuntainen suhde, jotta suodatuksen levitys voi jatkua faktataulukkoon.
- Kun ei ole sopivaa, että tunnistearvoja puuttuu, poista
Is Nullable
-ominaisuus käytöstä – tietojen päivittäminen epäonnistuu, kun puuttuvia arvoja annetaan. - Piilota välitaulukko (ellei se sisällä muita raportointiin tarvittavia sarakkeita tai mittareita).
- Piilota kaikki tunnussarakkeet, jotka eivät sovellu raportointiin (esimerkiksi, kun sarakkeet tallentavat korvaavia avainarvoja).
- Jos on järkevää jättää tunnussarake näkyviin, varmista, että se on suhteen "yksi"-puolella – piilota aina "monta"-puolen sarake. Tämä johtuu siitä, että "yksi"-diaan käytetyt suodattimet parantavat 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, että liität monta-moneen-dimensiotaulukot suoraan. Tämä rakennemenetelmä edellyttää moni-moneen-kardinaliteetin sisältävien suhteiden määrittämistä. Se voidaan saavuttaa käsitteellisesti, mutta se viittaa siihen, että liittyvät sarakkeet saattavat sisältää arvojen kaksoiskappaleita. Se on kuitenkin yleinen rakennekäytäntö, että dimensiotaulukoissa on tunnussarake. Dimensiotaulukoissa tunnussarakkeen on aina oltava suhteen "yksi"-puolella.
Liitä monta-moneen-faktat
Toinen monta-moneen-skenaariotyyppi koskee kahden faktataulukon liittamista. Kaksi faktataulukkoa 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 faktataulukkoa: Order
ja Fulfillment
.
Order
taulukossa on yksi rivi tilausriviä kohden, ja Fulfillment
-taulukko voi sisältää nolla riviä tai enemmän rivejä tilausriviä kohden.
Order
taulukon rivit vastaavat myyntitilauksia.
Fulfillment
taulukon rivit edustavat toimitettuja tilauskohteita. Monta-moneen-suhde yhdistää kummankin taulukon OrderID
sarakkeet siten, että suodatin leviää vain Order
taulukosta (eli Order
taulukko suodattaa Fulfillment
taulukon).
Suhteen kardinaliteeti on määritetty Many-to-many
, joka tukee OrderID
sarakearvojen kaksoiskappaleiden tallentamista molempiin taulukoihin.
Order
taulukossa voi olla tunnusarvojen kaksoiskappaleita, koska tilauksella voi olla useita rivejä.
Fulfillment
-taulukossa voi olla tunnusarvojen kaksoiskappaleita, koska tilauksissa voi olla useita rivejä ja tilausriveillä voi olla useita lähetyksiä.
Tarkastellaan nyt taulukon rivejä. Huomaa Fulfillment
-taulukossa, että 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 2. helmikuuta 2019 , 2,2 ,Prod-C ,1 ,20 -
OrderDate
3. maaliskuuta 2019,OrderID
3,OrderLine
1,ProductID
Prod-C,OrderQuantity
5,Sales
100
-
-
Fulfillment
taulukossa on neljä riviä:-
FulfillmentDate
1. tammikuuta 2019FulfillmentID
, 50,OrderID
1,OrderLine
1,FulfillmentQuantity
2 -
FulfillmentDate
2. helmikuuta 2019, 51FulfillmentID
,OrderID
2,OrderLine
1,FulfillmentQuantity
5 -
FulfillmentDate
2.2.2019, 52FulfillmentID
,OrderID
1,OrderLine
1,FulfillmentQuantity
3 -
FulfillmentDate
1.1.2019, 53FulfillmentID
,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, koska voit suodattaa tai ryhmitellä vain Order
taulukon OrderID
sarakkeen mukaan.
Liitä monta-moneen-faktat – ohjeet
Emme yleisesti ottaen suosittele kahden faktataulukon liittävän suoraan toisiinsa 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. Jos tietojen eheydessä on ongelmia, joitakin rivejä voidaan jättää pois kyselyjen tekemisen aikana, koska kyseessä on moni-mies-kardinaliteetti ja rajoitetut suhteet.
Sen sijaan, että liitäisit faktataulukot suoraan, suosittelemme, että otat käyttöön tähtirakenteen suunnittelun. Tämä tarkoittaa, että lisäät dimensiotaulukoita. Nämä dimensiotaulukot liittyvät faktataulukoihin yksi moneen -yhteyksillä. Tämä suunnittelumenetelmä on tehokas, sillä se tarjoaa tehokkaasti joustavia raportointivaihtoehtoja. Sen avulla voit suodattaa tai ryhmitellä käyttämällä mitä tahansa dimensiotaulukon sarakkeista ja tehdä yhteenvedon minkä tahansa liittyvän faktataulukon sarakkeista.
Mietitäänpä parempi ratkaisu.
Huomioi seuraavat rakennemuutokset:
- Mallissa on nyt neljä lisätaulukkoa:
OrderLine
,OrderDate
,Product
, jaFulfillmentDate
. - Kaikki neljä ylimääräistä taulukkoa ovat dimensiotaulukoita, joissa yksi-moneen-suhteet liittavat ne faktataulukoihin.
-
OrderLine
-taulukko sisältääOrderLineID
-sarakkeen, joka tallentaaOrderID
arvon kerrottuna sadalla sekäOrderLine
sarakkeen arvon – kunkin tilausrivin tunnuksen. -
Order
- jaFulfillment
-taulukot sisältävät nytOrderLineID
sarakkeen, eivätkä ne enää sisälläOrderID
- jaOrderLine
-sarakkeita. -
Fulfillment
-taulukko sisältää nytOrderDate
- jaProductID
-sarakkeet. -
FulfillmentDate
-taulukolla on suhde vainFulfillment
-taulukkoon. - Kaikki tunnussarakkeet on piilotettu.
Kun otat käyttöön tähtirakenteen, saat seuraavat edut:
- Raportin visualisoinnit voivat suodattaa tai ryhmitellä minkä tahansa dimensiotaulukon näkyvissä olevan sarakkeen mukaan.
- Raportin visualisoinnit voivat tehdä yhteenvedon faktataulukoista minkä tahansa näkyvissä olevan sarakkeen.
-
OrderLine
-,OrderDate
- taiProduct
-taulukoihin käytetyt suodattimet leviävät molempiin faktataulukoihin. - Kaikki suhteet ovat yksi moneen -suhteita, ja jokainen suhde on tavallinen suhde. Tietojen eheyteen liittyviä ongelmia ei peitetä. Lisätietoja suhteiden arvioinnista on artikkelissa mallisuhteiden Power BI Desktopin.
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
-taulukot ovat dimensiotaulukoita, ja yksi moneen -suhteet liittyvät kumpikin Sales
faktataulukkoon. Tähän asti tämä sopii hyvin tähtirakenteen rakenteeseen.
Target
-taulukkoa ei kuitenkaan ole vielä liitetty muihin taulukoihin.
Target
taulukossa on 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ä.
Koska Target
-taulukko tallentaa tiedot korkeammalle tasolle kuin dimensiotaulukot, yksi moneen -suhdetta ei voida luoda. Tämä koskee vain yhtä suhdetta. Katsotaan, miten Target
-taulukko voidaan liittää dimensiotaulukoihin.
Liitä yksityiskohtaiset ajanjaksot
Date
ja Target
taulukoiden välisen suhteen tulee olla yksi moneen -suhde. Tämä johtuu siitä, että TargetYear
sarakearvot ovat päivämääriä. Tässä esimerkissä jokainen TargetYear
-sarake tallentaa kohdevuoden ensimmäisen päivämäärän.
Juomaraha
Kun tallennat faktoja, joiden ajan rakeisuus on suurempi kuin päivä, määritä sarakkeen tietotyypiksi Date (tai Kokonaisluku, 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 saattavat ilmoittaa, että kohdepäivämäärät ovat kirjaimellisesti jokaisen 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 alaspäin 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 DAX funktiota Date
ja Month
sarakkeita ei suodateta.
Target Quantity =
IF(
NOT ISFILTERED('Date'[Date])
&& NOT ISFILTERED('Date'[Month]),
SUM(Target[TargetQuantity])
)
Seuraava matriisivisualisointi käyttää Target Quantity
-mittaria. Se näyttää, että kaikki kuukausittaiset kohdemäärät ovat TYHJIÄ.
Liitä yksityiskohtainen (ei-päivämäärä)
Erilaista rakennemenetelmää edellytetään, kun dimensiotaulukosta ei-päivämääräsarake liittyy faktataulukkoon (ja se on yksityiskohtainen kuin dimensiotaulukko).
Category
sarakkeet (sekä Product
että Target
taulukosta) sisältävät arvojen kaksoiskappaleita. Yksi moneen -suhteessa ei siis ole "yhtä"-puolta. Tässä tapauksessa sinun on luotava monta-moneen-suhde. Suhteen on levitettävä suodattimet yhteen suuntaan dimensiotaulukosta faktataulukkoon.
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 kuitenkin oikean tuloksen. Katsotaan nyt, mitä tapahtuu, kun Product
-taulukon Color
-saraketta käytetään kohdemäärän ryhmittelyyn.
Visualisointi tuottaa virheellistä tietoa. Mitä täällä tapahtuu?
Product
-taulukon Color
sarakkeen suodatin antaa tulokseksi 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ä, 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 suodattimet testataan.
Target Quantity =
IF(
NOT ISFILTERED('Product'[ProductID])
&& NOT ISFILTERED('Product'[Product])
&& NOT ISFILTERED('Product'[Color]),
SUM(Target[TargetQuantity])
)
Seuraava taulukkovisualisointi käyttää 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 haluat liittää dimensiotaulukon faktataulukkoon ja faktataulukkoon on tallennettu yksityiskohtaisempia rivejä kuin dimensiotaulukon rivejä, noudata seuraavia ohjeita:
-
yksityiskohtaiset faktat
- Tallenna faktataulukkoon ajanjakson ensimmäinen päivämäärä.
- Luo yksi-moneen-suhde päivämäärätaulukon ja faktataulukon välille.
-
muut yksityiskohtaiset faktat
- Luo monta-moneen-suhde dimensiotaulukon ja faktataulukon välille.
-
Kummallekin tyypille
- Hallitse yhteenvetoa mittarilogiikalla – palauta TYHJÄ, kun alemman tason dimensiosarakkeita käytetään suodatukseen tai ryhmittelyun.
- Piilota yhteenvedetvissä olevat faktataulukon sarakkeet, mikä varmistaa, että vain mittareita voidaan käyttää faktataulukon yhteenvetoon.
Aiheeseen liittyvä sisältö
Saat lisätietoja tähän artikkeliin liittyen tutustumalla seuraaviin resursseihin:
- mallisuhteiden Power BI Desktopin
- Tutustu tähtirakenteeseen ja sen merkitykseen Power BI -
- yhteyden vianmääritysohjeiden
- Kysymyksiä? Voit esittää kysymyksiä Fabric-yhteisön
- Ehdotuksia? Edistä ideoita Fabric- parantamiseksi