Použitie vzťahov typu many-to-many v aplikácii Power BI Desktop

Pomocou vzťahov s kardinalitou many-to-many v aplikácii Power BI Desktop môžete spájať tabuľky, ktoré používajú kardinalitu typu many-to-many. Môžete jednoduchšie vytvárať dátové modely, ktoré obsahujú dva zdroje údajov alebo viac. Vzťahy s kardinalitou many-to-many sú súčasťou možností väčších zložených modelov v aplikácii Power BI Desktop. Ďalšie informácie o zložených modeloch nájdete v téme Používanie zložených modelov v aplikácii Power BI Desktop.

Screenshot of a many-to-many relationship in the Edit relationship pane.

Na čo sa vyrieši vzťah s kardinalitou many-to-many

Pred sprístupnením vzťahov s kardinalitou many-to-many bol vzťah medzi dvoma tabuľkami definovaný v službe Power BI. Aspoň jeden zo stĺpcov v tabuľke, ktoré boli zapojené do vzťahu, musel obsahovať jedinečné hodnoty. Často ich však neobsahuje ani jeden stĺpec.

Dve tabuľky mohli mať napríklad stĺpec s označením KrajinaOblasť. Hodnoty krajinyOblasť však neboli jedinečné ani v jednej z tabuliek. Na spojenie takýchto tabuliek bolo potrebné vytvoriť alternatívne riešenie. Jedným alternatívnym riešením by mohlo byť uvedenie ďalších tabuliek s potrebnými jedinečnými hodnotami. Vďaka vzťahom s kardinalitou many-to-many môžete takéto tabuľky spájať priamo pomocou vzťahu s kardinalitou many-to-many.

Použitie vzťahov s kardinalitou many-to-many

Pri definovaní vzťahu medzi dvoma tabuľkami v službe Power BI je nutné definovať kardinalitu vzťahu. Napríklad vzťah medzi tabuľkami PredajProduktov a Produkt – pomocou stĺpcov ProductSales[ProductCode] a Product[ProductCode]– by bol definovaný ako vzťah typu Many-1. Vzťah takto definujeme, pretože pre každý produkt je množstvo predajov a stĺpec v tabuľke Produkt (ProductCode) je jedinečný. Pri definovaní kardinality vzťahu ako Many-1, 1-Many alebo 1-1 ho služba Power BI overí a zabezpečí, aby kardinalita, ktorú ste vybrali, zodpovedá skutočným údajom.

Pozrite sa napríklad na jednoduchý model na tomto obrázku:

Screenshot of ProductSales and Product table in Relationship view.

Teraz si predstavte, že tabuľka Produkt zobrazuje len dva riadky, ako je to znázornené:

Screenshot of a Product table visual with two rows.

Predstavte si tiež, že tabuľka Predaj obsahuje len štyri riadky, vrátane riadka pre produkt C. Z dôvodu chyby referenčnej integrity riadok v produkte C v tabuľke Produkt neexistuje.

Screenshot of a Sales table visual with four rows.

Stĺpce NázovProduktu a Cena (z tabuľky Produkt) spolu s celkovým Qty pre každý produkt (z tabuľky PredajProduktov) by sa zobrazili takto:

Screenshot of a Visual displaying the product name, price, and quantity.

Ako môžete vidieť na predchádzajúcom obrázku, vo vyobliekaní sa nachádza prázdny riadok s názvom NázovProduktu , ktorý súvisí s predajom pre produkt C. Tento prázdny riadok zodpovedá nasledujúcim aspektom:

  • Všetky riadky v tabuľke PredajProduktov , pre ktoré neexistuje žiadny zodpovedajúci riadok v tabuľke Produkt . Ide o problém s referenčnou integritou, ako vidíme pri produkte C v tomto príklade.

  • Všetky riadky v tabuľke PredajProduktov , pre ktoré má cudzí kľúč stĺpca hodnotu null.

Pre tieto dôvody v oboch prípadoch prázdny riadok zodpovedá predaju, pričom stĺpce NázovProduktu a Cena nie sú známe.

Niekedy sa stáva, že tabuľky sú spojené dvomi stĺpcami, no žiadn zo stĺpcov nie je jedinečný. Pozrime sa napríklad na tieto dve tabuľky:

  • Tabuľka Predaj zobrazuje údaje o predaji podľa Štátu a každý riadok obsahuje objem predaja pre typ predaja v danom štáte. Medzi tieto štáty patria KALIFORNIA (CA), Washington (WA) a TX (TX).

    Screenshot of a Sales table displaying sales by state.

  • Tabuľka ÚdajeOMeste zobrazuje údaje o mestách vrátane obyvateľstva a štátu (vrátane štátov Kalifornia (CA), Washington (WA) a New York).

    Screenshot of a Sales table displaying city, state, and population.

Stĺpec pre štát je teraz v oboch tabuľkách. Je rozumné chcieť nahlásiť celkový predaj podľa štátu aj celkový počet obyvateľov každého štátu. Nastáva však problém: stĺpec Štát nie je jedinečný ani v jednej tabuľke.

Predchádzajúce alternatívne riešenie

Ešte pred verziou vydanou v júli 2018 nemohli ste medzi týmito tabuľkami vytvoriť priamy vzťah. Bežným alternatívnym riešením bolo:

  • Vytvorenie tretej tabuľky, ktorá obsahuje iba jedinečné identifikátory Štát. Mohlo ísť o:

    • Vypočítaná tabuľka (definovaná pomocou jazyka Data Analysis Expressions [DAX]).
    • Tabuľka založená na dotaze, ktorý je definovaný v Editor Power Query a na základe ktorého by sa mohli zobraziť jedinečné identifikátory pochádzajúce z jednej z tabuliek.
    • Celú kombinovanú množinu.
  • Potom vytvorte vzťah medzi dvomi pôvodnými tabuľkami a danou novou tabuľkou s použitím bežných vzťahov typu Many-1 .

Mohli by ste nechať tabuľku s alternatívnym riešením viditeľnú. Prípadne môžete tabuľku s alternatívnym riešením skryť, aby sa nezobývala v zozname Polia . Ak by ste tabuľku skryli, vzťahy typu Many-1 by boli bežne nastavené na filtrovanie v oboch smeroch a pole Štát by ste mohli použiť z jednej z tabuliek. Toto krížové filtrovanie by sa rozšírilo do inej tabuľky. Tento prístup je znázornený na nasledujúcom obrázku:

Screenshot of a hidden State table in Relationship view.

Vizuál zobrazujúci údaj Štát (z tabuľky ÚdajeOMeste) spolu s celkovým údajom obyvateľstva a celkovou položkou Predaj by potom mal vyzerať nasledovne:

Screenshot showing a table with State, Population, and Sales data.

Poznámka

Vzhľadom na fungovanie štátov z tabuľky ÚdajeOMeste v tomto alternatívnych riešeniach sú v zozname tejto tabuľky len dané štáty, a preto je štát TX vylúčený. A okrem toho, na rozdiel od vzťahov Many-1 , zatiaľ čo riadok súčtu zahŕňa všetky hodnoty Predaja (vrátane predaja v TX (TX)), podrobnosti neobsahujú prázdny riadok zahŕňajúci podobné nezhodné riadky. Podobne by žiaden prázdny riadok nezahŕňal položku Predaj , ktorej hodnota pre položku Štát by bola null.

Predpokladajme, že by ste do vizuálu pridali aj Mesto. Počet obyvateľov na Mesto by bol známy a v položke Predaj zobrazenej pre Mesto by sa jednoducho zopakovala hodnota Predaja pre zodpovedajúci Štát. Tento scenár sa zvyčajne vyskytuje, keď sa zoskupenie stĺpcov nesúvisí s niektorými agregovanými mierkami, ako je to znázornené tu:

Screenshot of a table showing State and city population and sales.

Povedzme, že tu zadefinujete novú tabuľku predaja ako kombináciu všetkých štátov, a urobíme ju viditeľnou v zozname Polia . Rovnaký vizuál by zobrazoval Štát (v novej tabuľke), celkový počet obyvateľov a celkový predaj:

Screenshot of a visual showing State, population, and sales visual.

Ako vidíte, štát TX (so známou položkou Údaje o predaji , ale neznámy počet obyvateľov ) a Štát New York so známymi údajmi o obyvateľstve , ale neznámou položkou Predaj sa zahrnú. Toto alternatívne riešenie nie je optimálne a má množstvo problémov. Pre vzťahy s kardinalitou many-to-many prejdú nasledujúce problémy tak, ako je to popísané v nasledujúcej časti.

Ďalšie informácie o implementácii tohto alternatívneho riešenia nájdete v téme Pokyny na prácu so vzťahmi Many-to-many.

Použitie vzťahu s kardinalitou many-to-many namiesto alternatívneho riešenia

Tabuľky, ako napríklad tie, ktoré sme opísali skôr, môžete vytvoriť priamo bez potreby uchýliť sa k podobným alternatívnym riešeniam. Teraz je možné nastaviť kardinalitu vzťahu na many-to-many. Toto nastavenie naznačuje, že žiadna z tabuliek neobsahuje jedinečné hodnoty. V prípade takýchto vzťahov môžete stále kontrolovať, ktorá tabuľka filtruje druhú tabuľku. Prípadne môžete použiť obojsmerné filtrovanie, pričom každá tabuľka filtruje druhú.

V aplikácii Power BI Desktop sa kardinalita nastaví na typ many-to-many , pokiaľ je určené, že ani jedna tabuľka neobsahuje jedinečné hodnoty pre stĺpce vo vzťahu. V takýchto prípadoch výstražné hlásenie potvrdí, že chcete nastaviť vzťah a že zmena nie je nezamýšľaným účinkom problému s údajmi.

Napríklad pri vytváraní vzťahu priamo medzi tabuľkami ÚdajeOMeste a Predaj – pričom filtre by mali prúdiť z tabuľky ÚdajeOMeste do tabuľky Predaj – aplikácia Power BI Desktop zobrazí dialógové okno Upraviť vzťah :

Screenshot of the Edit relationship dialog box with Cardinality and Cross filter direction highlighted.

Výsledné zobrazenie vzťahu bude potom zobrazovať priamy vzťah typu many-to-many medzi danými dvoma tabuľkami. Vzhľad tabuliek v zozname Polia a neskoršie správanie pri vytváraní vizuálov je potom podobné ako použitie alternatívneho riešenia. V alternatívnych riešeniach tabuľka navyše, ktorá zobrazuje odlišné údaje o štáte, nie je viditeľná. Ako sme uviedli predtým, zobrazil by sa vizuál s údajmi Štát, Obyvateľstvo a Predaj :

Screenshot of a State, Population, and Sales table.

Hlavné rozdiely medzi vzťahmi s kardinalitou many-to-many a typickejšími vzťahmi typu Many-1 sú nasledovné:

  • Zobrazené hodnoty neobsahujú prázdny riadok predstavujúci nezhodné riadky v inej tabuľke. Hodnoty tiež nerátajú riadkom, ktorých stĺpec je použitý vo vzťahu v inej tabuľke s hodnotou null.

  • Nie je možné použiť RELATED() funkciu , pretože vo vzťahu môže byť viac ako jeden riadok.

  • Použitím funkcie v ALL() tabuľke sa neodstránia filtre použité na iné súvisiace tabuľky, ktoré sú s ním vo vzťahu typu many-to-many. Mierka z predchádzajúceho príkladu, ktorá je definovaná podľa tohto príkladu, by neodstránila filtre v stĺpcoch so súvisiacou tabuľkou ÚdajeOMeste:

    Screenshot of a script example. The example is, Sales total = Calculate(Sum('Sales'[Sales]), All('Sales')).

    Vizuál zobrazujúci údaje Štát, Predaj a Predaj celkom by mal mať za následok tento grafický prvok:

    Screenshot of a table visual showing State, Sales, and Sales total resulting from the formula.

Vzhľadom na spomenuté rozdiely sa uistite, že výpočty, ktoré používajú ALL(<Table>)metódu , ako % z celkovej hodnoty vracajú požadované výsledky.

Dôležité informácie a obmedzenia

Existuje niekoľko obmedzení pre túto verziu vzťahov s kardinalitou many-to-many a zložených modelov.

Nasledujúce dynamické Pripojenie (multidimenzionálne) zdroje sa nedajú používať so zloženými modelmi:

  • SAP HANA
  • SAP Business Warehouse
  • SQL Server Analysis Services
  • Sémantické modely Služby Power BI
  • Azure Analysis Services

Keď sa pripojíte k týmto multidimenzionálnym zdrojom pomocou režimu DirectQuery, nemôžete sa pripojiť k inému zdroju DirectQuery ani ho kombinovať s importovanými údajmi.

Pri používaní vzťahov s kardinalitou many-to-many sa aj naďalej vzťahujú existujúce obmedzenia použitia režimu DirectQuery. Mnohé z týchto obmedzení sa teraz týkajú jednotlivých tabuliek v závislosti od ich režimu úložiska. Napríklad vypočítaný stĺpec importovaných tabuliek môže odkazovať na iné tabuľky, ale vypočítaný stĺpec v tabuľke DirectQuery stále môže odkazovať len na stĺpce v tej istej tabuľke. Ďalšie obmedzenia sa vzťahujú na model ako celok, ak je niektorá z tabuliek v rámci modelu v režime DirectQuery. Napríklad funkcie Rýchle Prehľady a Q&A napríklad nie sú v modeli k dispozícii, ak niektorá z tabuliek v ňom má režim úložiska typu DirectQuery.

Ďalšie informácie o zložených modeloch a režime DirectQuery nájdete v nasledujúcich článkoch: