Leitfaden zu m:n-BeziehungenMany-to-many relationship guidance

Dieser Artikel ist an Modellierer von Daten gerichtet, die mit Power BI Desktop arbeiten.This article targets you as a data modeler working with Power BI Desktop. In ihm werden drei verschiedene m:n-Modellierungsszenarios beschrieben.It describes three different many-to-many modeling scenarios. Außerdem erhalten Sie eine Anleitung, wie Sie Ihre Modelle entsprechend entwerfen können.It also provides you with guidance on how to successfully design for them in your models.

Hinweis

Dieser Artikel enthält jedoch keine Einführung zu Modellbeziehungen.An introduction to model relationships is not covered in this article. Wenn Sie sich bisher noch wenig mit Beziehungen, ihren Eigenschaften und ihrer Konfiguration beschäftigt haben, sollten Sie sich zuerst den Artikel Modellieren von Beziehungen in Power BI Desktop durchlesen.If you're not completely familiar with relationships, their properties or how to configure them, we recommend that you first read the Model relationships in Power BI Desktop article.

Außerdem sollten Sie mit dem Sternschemadesign gut vertraut sein.It's also important that you have an understanding of star schema design. Weitere Informationen finden Sie im Artikel Informationen zum Sternschema und der Wichtigkeit für Power BI.For more information, see Understand star schema and the importance for Power BI.

Genau genommen gibt es drei Arten von m:n-Beziehungen.There are, in fact, three many-to-many scenarios. Sie können in folgenden Szenarios auftreten:They can occur when you're required to:

Herstellen von m:n-Beziehungen zwischen DimensionenRelate many-to-many dimensions

Sehen Sie sich den ersten m:n-Beziehungstyp anhand des folgenden Beispiels an.Let's consider the first many-to-many scenario type with an example. In einem klassischen Szenario werden zwei Entitäten aufeinander bezogen: Bankkunden und Bankkonten.The classic scenario relates two entities: bank customers and bank accounts. Behalten Sie im Hinterkopf, dass Kunden mehrere Konten haben können, und dass Konten mehreren Kunden zugeordnet sein können.Consider that customers can have multiple accounts, and accounts can have multiple customers. Wenn einem Konto mehrere Kunden zugeordnet sind, werden diese üblicherweise als Inhaber eines Gemeinschaftskontos bezeichnet.When an account has multiple customers, they're commonly called joint account holders.

Es ist sehr einfach, diese Entitäten zu modellieren.Modeling these entities is straight forward. In einer Dimensionstabelle werden die Konten gespeichert, und in einer anderen Dimensionstabelle werden die Kunden gespeichert.One dimension-type table stores accounts, and another dimension-type table stores customers. Wie es für Dimensionstabellen charakteristisch ist, gibt es in jeder Tabelle eine ID-Spalte.As is characteristic of dimension-type tables, there's an ID column in each table. Es ist eine dritte Tabelle erforderlich, um die Beziehung zwischen den beiden Tabellen zu modellieren.To model the relationship between the two tables, a third table is required. Diese Tabelle wird üblicherweise als Brückentabelle bezeichnet.This table is commonly referred to as a bridging table. In diesem Beispiel ist es ihre Aufgabe, eine Zeile für jede Kunde-Konto-Zuordnung zu speichern.In this example, it's purpose is to store one row for each customer-account association. Ein interessanter Hinweis: Wenn diese Tabelle nur ID-Spalten enthält, wird sie als faktenlose Faktentabelle bezeichnet.Interestingly, when this table only contains ID columns, it's called a factless fact table.

Im Folgenden sehen Sie ein vereinfachtes Modellschaubild der drei Tabellen:Here's a simplistic model diagram of the three tables.

Diagramm mit einem Modell, das drei Tabellen enthält

Die erste Tabelle heißt Account (Konto) und enthält zwei Spalten: AccountID (Konto-ID) und Account.The first table is named Account, and it contains two columns: AccountID and Account. Die zweite Tabelle heißt AccountCustomer (Konto – Kunde) und enthält zwei Spalten: AccountID und CustomerID (Kunden-ID).The second table is named AccountCustomer, and it contains two columns: AccountID and CustomerID. Die dritte Tabelle heißt Customer (Kunde) und enthält zwei Spalten: CustomerID und Customer.The third table is named Customer, and it contains two columns: CustomerID and Customer. Zwischen keiner der Tabellen besteht eine Beziehung.Relationships don't exist between any of the tables.

Zwei 1:n-Beziehungen werden hinzugefügt, um die Tabellen aufeinander zu beziehen.Two one-to-many relationships are added to relate the tables. Unten sehen Sie ein aktualisiertes Modellschaubild der aufeinander bezogenen Tabellen.Here's an updated model diagram of the related tables. Es wurde eine Faktentabelle namens Transaction hinzugefügt.A fact-type table named Transaction has been added. Darin werden Kontotransaktionen gespeichert.It records account transactions. Die Brückentabelle sowie alle ID-Spalten wurden ausgeblendet.The bridging table and all ID columns have been hidden.

Diagramm mit dem Modell, das nun vier Spalten umfasst

Damit die Funktionsweise der Weitergabe der Beziehungsfilter besser beschrieben werden kann, wurde das Modellschaubild so angepasst, dass die Tabellenzeilen angezeigt werden.To help describe how the relationship filter propagation works, the model diagram has been modified to reveal the table rows.

Hinweis

Im Modellschaubild in Power BI Desktop können Tabellenzeilen nicht angezeigt werden.It's not possible to display table rows in the Power BI Desktop model diagram. In diesem Artikel wurde das nur getan, um die die Beispiele besser verständlich zu machen.It's done in this article to support the discussion with clear examples.

Diagramm des Modells, in dem nun die Tabellenzeilen angezeigt werden

In der folgenden Aufzählung werden die einzelnen Zeilen der vier Tabellen näher erläutert:The row details for the four tables are described in the following bulleted list:

  • Die Tabelle Account hat zwei Zeilen:The Account table has two rows:
    • AccountID 1 steht für Account-01AccountID 1 is for Account-01
    • AccountID 2 steht für Account-02AccountID 2 is for Account-02
  • Die Tabelle Customer hat zwei Zeilen:The Customer table has two rows:
    • CustomerID 91 steht für Customer-91CustomerID 91 is for Customer-91
    • CustomerID 92 steht für Customer-92CustomerID 92 is for Customer-92
  • Die Tabelle AccountCustomer hat drei Zeilen:The AccountCustomer table has three rows:
    • AccountID 1 ist CustomerID 91 zugeordnetAccountID 1 is associated with CustomerID 91
    • AccountID 1 ist CustomerID 92 zugeordnetAccountID 1 is associated with CustomerID 92
    • AccountID 2 ist CustomerID 92 zugeordnetAccountID 2 is associated with CustomerID 92
  • Die Tabelle Transaction hat drei Zeilen:The Transaction table has three rows:
    • Date 1. Januar 2019, AccountID 1, Amount (Betrag) 100Date January 1 2019, AccountID 1, Amount 100
    • Date 2. Februar 2019, AccountID 2, Amount 200Date February 2 2019, AccountID 2, Amount 200
    • Date 3. März 2019, AccountID 1, Amount -25Date March 3 2019, AccountID 1, Amount -25

Sehen Sie sich nun an, was geschieht, wenn das Modell abgefragt wird.Let's see what happens when the model is queried.

Unten sehen Sie zwei Visuals, die die Spalte Amount aus der Tabelle Transaction zusammenfassen.Below are two visuals that summarize the Amount column from the Transaction table. Im ersten Visual wird nach Konto angeordnet. Die Summe der Spalten Amount ergibt somit das Kontoguthaben.The first visual groups by account, and so the sum of the Amount columns represents the account balance. Das zweite Visual ist nach Kunde angeordnet. Die Summe der Spalten Amount ergibt somit das Guthaben der einzelnen Kunden.The second visual groups by customer, and so the sum of the Amount columns represents the customer balance.

Diagramm mit zwei Berichtsvisuals nebeneinander

Das erste Visual heißt Account Balance (Kontoguthaben) und hat zwei Spalten: Account und Amount.The first visual is titled Account Balance, and it has two columns: Account and Amount. Das folgende Ergebnis wird dargestellt:It displays the following result:

  • Der Guthabenbetrag auf „Account-01“ ist 75Account-01 balance amount is 75
  • Der Guthabenbetrag auf „Account-02“ ist 200Account-02 balance amount is 200
  • Der gesamte Guthabenbetrag ist 275The total is 275

Das zweite Visual heißt Customer Balance (Kundensaldo) und hat zwei Spalten: Customer und Amount.The second visual is titled Customer Balance, and it has two columns: Customer and Amount. Das folgende Ergebnis wird dargestellt:It displays the following result:

  • „Customer-91“ hat ein Guthaben von 275Customer-91 balance amount is 275
  • „Customer-92“ hat ein Guthaben von 275Customer-92 balance amount is 275
  • Der Gesamtwert beträgt 275The total is 275

Ein Blick auf die Tabellenzeilen und das Visual Account Balance zeigt, dass das Ergebnis für jedes Konto sowie der Gesamtbetrag korrekt sind.A quick glance at the table rows and the Account Balance visual reveals that the result is correct, for each account and the total amount. Das liegt daran, dass jede Kontozuordnung zu einer Weitergabe der Filter auf die Tabelle Transaction für das jeweilige Konto führt.It's because each account grouping results in a filter propagation to the Transaction table for that account.

Beim Visual Customer Balance ist jedoch anscheinend ein Fehler aufgetreten.However, something doesn't appear correct with the Customer Balance visual. Für jeden Kunden im Visual Customer Balance wird als Guthaben der Gesamtbetrag angezeigt.Each customer in the Customer Balance visual has the same balance as the total balance. Dieses Ergebnis wäre nur korrekt, wenn beide Kunden gemeinschaftliche Inhaber aller Konten wären.This result could only be correct if every customer was a joint account holder of every account. In diesem Beispiel ist das jedoch nicht der Fall.That's not the case in this example. Das Problem hat mit der Weitergabe der Filter zu tun.The issue is related to filter propagation. Sie erfolgt nicht durchgängig bis zur Tabelle Transaction.It's not flowing all the way to the Transaction table.

Sehen Sie sich die Richtungen der Beziehungsfilter ausgehend von der Tabelle Customer bis hin zur Tabelle Transaction genauer an.Follow the relationship filter directions from the Customer table to the Transaction table. So müsste Ihnen deutlich auffallen, dass die Beziehung zwischen der Tabelle Account und der Tabelle AccountCustomer in die falsche Richtung weitergegeben wird.It should be apparent that the relationship between the Account and AccountCustomer table is propagating in the wrong direction. Die Filterrichtung für diese Beziehung muss auf Beide festgelegt werden.The filter direction for this relationship must be set to Both.

Diagramm, das zeigt, dass das Modell aktualisiert wurde

Diagramm mit zwei gleichen Berichtsvisuals nebeneinander.

Erwartungsgemäß hat sich am Visual Account Balance nichts geändert.As expected, there has been no change to the Account Balance visual.

Das Visual Customer Balance zeigt nun jedoch ein anderes Ergebnis:The Customer Balance visuals, however, now displays the following result:

  • „Customer-91“ hat ein Guthaben von 75Customer-91 balance amount is 75
  • „Customer-92“ hat ein Guthaben von 275Customer-92 balance amount is 275
  • Der Gesamtwert beträgt 275The total is 275

Das Visual Customer Balance zeigt nun ein korrektes Ergebnis an.The Customer Balance visual now displays a correct result. Sehen Sie sich die Filterrichtungen noch einmal genau an, und versuchen Sie nachzuvollziehen, wie die Guthaben der einzelnen Kunden berechnet wurden.Follow the filter directions for yourself, and see how the customer balances were calculated. Machen Sie sich dabei auch bewusst, dass sich der sichtbare Gesamtwert auf alle Kunden bezieht.Also, understand that the visual total means all customers.

Wenn Sie sich mit Modellbeziehungen noch nicht so gut auskennen, nehmen Sie möglicherweise an, dass das Ergebnis nicht korrekt ist.Someone unfamiliar with the model relationships could conclude that the result is incorrect. Vielleicht fragen Sie sich: Warum beträgt das Gesamtguthaben für Customer-91 und Customer-92 nicht 350 (75 + 275)?They might ask: Why isn't the total balance for Customer-91 and Customer-92 equal to 350 (75 + 275)?

Damit diese Frage beantwortet werden kann, müssen Sie verstanden haben, wie m:n-Beziehungen funktionieren.The answer to their question lies in understanding the many-to-many relationship. Für die Guthaben einzelner Kunden können die Guthabenbeträge mehrerer Konten addiert werden, und die einzelnen Guthaben der Kunden selbst sind deshalb nicht additiv.Each customer balance can represent the addition of multiple account balances, and so the customer balances are non-additive.

Anleitung für das Herstellen von Beziehungen zwischen m:n-DimensionenRelate many-to-many dimensions guidance

Wenn zwischen Dimensionstabellen eine m:n-Beziehung besteht, können Sie der folgenden Anleitung folgen:When you have a many-to-many relationship between dimension-type tables, we provide the following guidance:

  • Fügen Sie jede durch eine m:n-Beziehung verbundene Entität als Modelltabelle hinzu, und achten Sie darauf, dass sie eine Spalte für eindeutige Bezeichner (ID) hat.Add each many-to-many related entity as a model table, ensuring it has a unique identifier (ID) column
  • Fügen Sie eine Brückentabelle hinzu, um die verbundenen Entitäten zu speichern.Add a bridging table to store associated entities
  • Erstellen Sie zwischen den drei Tabellen 1:n-Beziehungen.Create one-to-many relationships between the three tables
  • Konfigurieren Sie eine bidirektionale Beziehung, damit Filter auf Faktentabellen weitergegeben werden können.Configure one bi-directional relationship to allow filter propagation to continue to the fact-type tables
  • Wenn ID-Werte zwingend angegeben werden sollen, legen Sie die Eigenschaft Is Nullable der ID-Spalten auf FALSE fest. Die Datenaktualisierung kann dann nicht durchgeführt werden, wenn Bezüge auf fehlende Werte festgestellt werden.When it isn't appropriate to have missing ID values, set the Is Nullable property of ID columns to FALSE—data refresh will then fail if missing values are sourced
  • Blenden Sie die Brückentabelle aus, wenn sie keine Spalten oder Measures enthält, die für die Berichterstellung erforderlich sind.Hide the bridging table (unless it contains additional columns or measures required for reporting)
  • Blenden Sie alle ID-Spalten aus, die sich nicht für die Berichterstellung eignen, z. B. IDs, die Ersatzschlüssel sind.Hide any ID columns that aren't suitable for reporting (for example, when IDs are surrogate keys)
  • Wenn eine ID-Spalte nicht ausgeblendet werden sollte, achten Sie darauf, dass sie sich auf der „1“-Seite der Beziehung befindet. Die „n“-seitige Spalte sollten Sie immer ausblenden.If it makes sense to leave an ID column visible, ensure that it's on the "one" slide of the relationship—always hide the "many" side column. So funktionieren Filter am besten.It results in the best filter performance.
  • Um Verwirrung und Missverständnissen vorzubeugen, können Sie Erklärungen für die Benutzer Ihres Berichts hinzufügen, z. B. Erläuterungen in Textfeldern oder QuickInfos für Visualheader.To avoid confusion or misinterpretation, communicate explanations to your report users—you can add descriptions with text boxes or visual header tooltips

Es empfiehlt sich nicht, m:n-Beziehungen zwischen Dimensionstabellen direkt herzustellen.We don't recommend you relate many-to-many dimension-type tables directly. Für diese Art von Design muss eine Beziehung mit einer m:n-Kardinalität konfiguriert werden.This design approach requires configuring a relationship with a many-to-many cardinality. Konzeptionell ist das möglich. Es führt jedoch dazu, dass die in Beziehung gesetzten Spalten doppelte Werte enthalten.Conceptually it can be achieved, yet it implies that the related columns will contain duplicate values. Es ist ein durchaus gängiger Designansatz. Die hier vorliegenden Dimensionstabellen beinhalten jedoch eine ID-Spalte.It's a well-accepted design practice, however, that dimension-type tables have an ID column. Dimensionstabellen sollten die ID-Spalte immer als „1“-Seite einer Beziehung verwenden.Dimension-type tables should always use the ID column as the "one" side of a relationship.

Herstellen von m:n-Beziehungen zwischen FaktenRelate many-to-many facts

Beim zweiten Typ eines m:n-Szenarios sollen zwei Faktentabellen aufeinander bezogen werden.The second many-to-many scenario type involves relating two fact-type tables. Zwei Faktentabellen können direkt aufeinander bezogen werden.Two fact-type tables can be related directly. Dieser Designansatz kann hilfreich sein für schnelle und einfache Datenanalysen.This design technique can be useful for quick and simple data exploration. Es soll aber ausdrücklich darauf hingewiesen werden, dass wir diesen Ansatz nicht empfehlen.However, and to be clear, we generally don't recommend this design approach. Weiter unten in diesem Abschnitt erfahren Sie, warum.We'll explain why later in this section.

Im Folgenden wird ein Beispiel mit zwei Faktentabellen verwendet: Order (Auftrag) und Fulfillment (Auftragserfüllung).Let's consider an example that involves two fact-type tables: Order and Fulfillment. Die Tabelle Order enthält eine Zeile pro Auftragsposition, und die Tabelle Fulfillment kann null oder mehr Zeilen pro Auftragsposition enthalten.The Order table contains one row per order line, and the Fulfillment table can contains zero or more rows per order line. Zeilen in der Tabelle Order stehen für Kundenaufträge.Rows in the Order table represent sales orders. Zeilen in der Tabelle Fulfillment stehen für Teile des Auftrags, die bereits versandt wurden.Rows in the Fulfillment table represent order items that have been shipped. Mit einer m:n-Beziehung werden die beiden OrderID-Spalten aufeinander bezogen. Filter werden dabei nur von der Tabelle Order weitergegeben. Die Tabelle Order filtert dabei die Tabelle Fulfillment.A many-to-many relationship relates the two OrderID columns, with filter propagation only from the Order table (Order filters Fulfillment).

Diagramm eines Modells mit den beiden Tabellen „Order“ und „Fulfillment“.

Die Beziehungskardinalität wird auf „m:n“ festgelegt, damit das Speichern doppelter OrderID-Werte in beiden Tabellen unterstützt wird.The relationship cardinality is set to many-to-many to support storing duplicate OrderID values in both tables. In der Tabelle Order dürfen doppelte OrderID-Werte enthalten sein, da ein Auftrag aus mehreren Auftragspositionen bestehen kann.In the Order table, duplicate OrderID values can exist because an order can have multiple lines. In der Tabelle Fulfillment sind doppelte OrderID-Werte zulässig, da Aufträge aus mehreren Auftragspositionen bestehen können, und die einzelnen Auftragspositionen durch mehrere einzelne Lieferungen erfüllt werden können.In the Fulfillment table, duplicate OrderID values can exist because orders may have multiple lines, and order lines can be fulfilled by many shipments.

Sehen Sie sich nun die Tabellenzeilen genauer an.Let's now take a look at the table rows. Wie Sie in der Tabelle Fulfillment sehen, können Auftragspositionen durch mehrere einzelne Lieferungen erfüllt werden.In the Fulfillment table, notice that order lines can be fulfilled by multiple shipments. Wenn eine Auftragsposition nicht angezeigt wird, bedeutet das, sie wurde noch nicht erfüllt.(The absence of an order line means the order is yet to be fulfilled.)

Diagramm des Modells, in dem nun die Tabellenzeilen angezeigt werden

In der folgenden Aufzählung werden die Details zu den Zeilen der zwei Tabellen erläutert:The row details for the two tables are described in the following bulleted list:

  • Die Tabelle Order besteht aus fünf Zeilen:The Order table has five rows:
    • OrderDate (Auftragsdatum) 1. Januar 2019, OrderID 1, OrderLine (Auftragsposition) 1, ProductID Prod-A, OrderQuantity (Auftragsmenge) 5, Sales (Verkäufe) 50OrderDate January 1 2019, OrderID 1, OrderLine 1, ProductID Prod-A, OrderQuantity 5, Sales 50
    • OrderDate 1. Januar 2019, OrderID 1, OrderLine 2, ProductID Prod-B, OrderQuantity 10, Sales 80OrderDate January 1 2019, OrderID 1, OrderLine 2, ProductID Prod-B, OrderQuantity 10, Sales 80
    • OrderDate 2. Februar 2019, OrderID 2, OrderLine 1, ProductID Prod-B, OrderQuantity 5, Sales 40OrderDate February 2 2019, OrderID 2, OrderLine 1, ProductID Prod-B, OrderQuantity 5, Sales 40
    • OrderDate 2. Februar 2019, OrderID 2, OrderLine 2, ProductID Prod-C, OrderQuantity 1, Sales 20OrderDate February 2 2019, OrderID 2, OrderLine 2, ProductID Prod-C, OrderQuantity 1, Sales 20
    • OrderDate 3. März 2019, OrderID 3, OrderLine 1, ProductID Prod-C, OrderQuantity 5, Sales 100OrderDate March 3 2019, OrderID 3, OrderLine 1, ProductID Prod-C, OrderQuantity 5, Sales 100
  • Die Tabelle Fulfillment besteht aus vier Zeilen:The Fulfillment table has four rows:
    • FulfillmentDate (Datum der Erfüllung) 1. Januar 2019, FulfillmentID 50, OrderID 1, OrderLine 1, FulfillmentQuantity (Menge der Erfüllung) 2FulfillmentDate January 1 2019, FulfillmentID 50, OrderID 1, OrderLine 1, FulfillmentQuantity 2
    • FulfillmentDate 2. Februar 2019, FulfillmentID 51, OrderID 2, OrderLine 1, FulfillmentQuantity 5FulfillmentDate February 2 2019, FulfillmentID 51, OrderID 2, OrderLine 1, FulfillmentQuantity 5
    • FulfillmentDate 2. Februar 2019, FulfillmentID 52, OrderID 1, OrderLine 1, FulfillmentQuantity 3FulfillmentDate February 2 2019, FulfillmentID 52, OrderID 1, OrderLine 1, FulfillmentQuantity 3
    • FulfillmentDate 1. Januar 2019, FulfillmentID 53, OrderID 1, OrderLine 2, FulfillmentQuantity10FulfillmentDate January 1 2019, FulfillmentID 53, OrderID 1, OrderLine 2, FulfillmentQuantity 10

Sehen Sie sich nun an, was geschieht, wenn das Modell abgefragt wird.Let's see what happens when the model is queried. Unten sehen Sie ein Tabellenvisual, in dem die Mengen der Aufträge und der Erfüllungen nach der Spalte OrderID der Tabelle Order verglichen werden.Here's a table visual comparing order and fulfillment quantities by the Order table OrderID column.

Diagramm eines Tabellenvisuals mit drei Spalten: „OrderID“, „OrderQuantity“ und „FulfillmentQuantity“.

Das Visual stellt ein korrektes Ergebnis dar.The visual presents an accurate result. Der Nutzen des Modells ist allerdings begrenzt. Sie können nämlich nur nach der Spalte OrderID der Tabelle Order filtern oder anordnen.However, the usefulness of the model is limited—you can only filter or group by the Order table OrderID column.

Anleitung, um Fakten in m:n-Beziehung zu bringenRelate many-to-many facts guidance

Prinzipiell wird davon abgeraten, zwei Faktentabellen mithilfe einer m:n-Kardinalität direkt aufeinander zu beziehen.Generally, we don't recommend relating two fact-type tables directly using many-to-many cardinality. Der Hauptgrund dafür ist, dass Ihre Berichtsvisuals nicht flexibel gefiltert oder angeordnet werden können.The main reason is because the model won't provide flexibility in the ways you report visuals filter or group. Im Beispiel können Visuals nur nach der Spalte OrderID der Tabelle Order gefiltert oder angeordnet werden.In the example, it's only possible for visuals to filter or group by the Order table OrderID column. Außerdem kann die Qualität Ihrer Daten beeinträchtigt werden.An additional reason relates to the quality of your data. Wenn es bei Ihren Daten Integritätsprobleme gibt, werden bei der Abfrage manchmal einige Zeilen ausgelassen. Das liegt daran, dass es sich um eine beschränkte Beziehung handelt.If your data has integrity issues, it's possible some rows may be omitted during querying due to the nature of the limited relationship. Weitere Informationen zu Beziehungen finden Sie unter Modellbeziehungen in Power BI Desktop (Beziehungsauswertung).For more information, see Model relationships in Power BI Desktop (Relationship evaluation).

Anstatt Faktentabellen direkt aufeinander zu beziehen, sollten Sie lieber das Sternschema als Designansatz verwenden.Instead of relating fact-type tables directly, we recommend you adopt Star Schema design principles. Dazu fügen Sie Dimensionstabellen hinzu.You do it by adding dimension-type tables. Die Dimensionstabellen werden dann mithilfe von 1:n-Beziehungen mit den Faktentabellen verbunden.The dimension-type tables then relate to the fact-type tables by using one-to-many relationships. Dieser Designansatz ist stabil, da er flexible Berichterstellungsoptionen bietet.This design approach is robust as it delivers flexible reporting options. Sie können nach einer beliebigen Spalte der Dimensionstabellen filtern oder anordnen und Zusammenfassungen aller verbunden Faktentabellen erstellen.It lets you filter or group using any of the dimension-type columns, and summarize any related fact-type table.

Sehen Sie sich im Folgenden eine bessere Lösung an.Let's consider a better solution.

Diagramm eines Modells mit sechs Tabellen: „OrderLine“, „OrderDate“, „Order“, „Fulfillment“, „Product“ und „FulfillmentDate“.

Beachten Sie die folgenden Änderungen am Design:Notice the following design changes:

  • Das Modell hat nun vier zusätzliche Tabellen: OrderLine, OrderDate, Product und FulfillmentDate.The model now has four additional tables: OrderLine, OrderDate, Product, and FulfillmentDate
  • Die vier zusätzlichen Tabellen sind alle Dimensionstabellen. Sie sind über 1:n-Beziehungen mit den Faktentabellen verbunden.The four additional tables are all dimension-type tables, and one-to-many relationships relate these tables to the fact-type tables
  • Die Tabelle OrderLine enthält eine Spalte OrderLineID, die den Wert OrderID mit 100 multipliziert darstellt, sowie den Wert OrderLine, einen eindeutigen Bezeichner für jede Auftragsposition.The OrderLine table contains an OrderLineID column, which represents the OrderID value multiplied by 100, plus the OrderLine value—a unique identifier for each order line
  • Die Tabellen Order und Fulfillment enthalten nun die Spalte OrderLineID, und sie enthalten die Spalten OrderID und OrderLine nicht mehr.The Order and Fulfillment tables now contain an OrderLineID column, and they no longer contain the OrderID and OrderLine columns
  • Die Tabelle Fulfillment enthält nun die Spalten OrderDate und ProductID.The Fulfillment table now contains OrderDate and ProductID columns
  • Die Tabelle FulfillmentDate bezieht sich nur auf die Tabelle Fulfillment.The FulfillmentDate table relates only to the Fulfillment table
  • Alle Spalten mit eindeutigen Bezeichnern sind ausgeblendet.All unique identifier columns are hidden

Wenn Sie sich die Zeit nehmen, die Designprinzipien des Sternschemas anzuwenden, entstehen Ihnen dadurch die folgenden Vorteile:Taking the time to apply star schema design principles delivers the following benefits:

  • Ihre Berichtsvisuals können nach jeder eingeblendeten Spalte der Dimensionstabellen gefiltert oder angeordnet werden.Your report visuals can filter or group by any visible column from the dimension-type tables
  • Ihre Berichtsvisuals können Zusammenfassungen jeder eingeblendeten Spalte der Faktentabellen erstellen.Your report visuals can summarize any visible column from the fact-type tables
  • Filter, die auf die Tabellen OrderLine, OrderDate oder Product angewendet sind, werden für beide Faktentabellen übernommen.Filters applied to the OrderLine, OrderDate, or Product tables will propagate to both fact-type tables
  • Alle Beziehungen sind 1:n-Beziehungen und damit reguläre Beziehungen.All relationships are one-to-many, and each relationship is a regular relationship. Probleme mit der Datenintegrität können nicht mehr unentdeckt bleiben.Data integrity issues won't be masked. Weitere Informationen zu Beziehungen finden Sie unter Modellbeziehungen in Power BI Desktop (Beziehungsauswertung).For more information, see Model relationships in Power BI Desktop (Relationship evaluation).

Herstellen von Beziehungen zwischen Fakten mit höherer GranularitätRelate higher grain facts

Dieses m:n-Szenario unterscheidet sich stark von den anderen beiden in diesem Artikel bereits erläuterten Szenarios.This many-to-many scenario is very different from the other two already described in this article.

Im Folgenden wird ein Beispiel mit vier Tabellen verwendet: Date, Sales, Product und Target (Verkaufsziele).Let's consider an example involving four tables: Date, Sales, Product, and Target. Die Tabellen Date und Product sind Dimensionstabellen, und sie werden über 1:n-Beziehungen auf die Faktentabelle Sales bezogen.The Date and Product are dimension-type tables, and one-to-many relationships relate each to the Sales fact-type table. Soweit entspricht das dem Sternschemadesign.So far, it represents a good star schema design. Die Tabelle Target muss jedoch auf die anderen Tabellen bezogen werden.The Target table, however, is yet to be related to the other tables.

Diagramm eines Modells mit vier Tabellen: „Date“, „Sales“, „Product“ und „Target“.

Die Tabelle Target enthält drei Spalten: Category (Kategorie), TargetQuantity (Zielmenge) und TargetYear (Zieljahr).The Target table contains three columns: Category, TargetQuantity, and TargetYear. In der Tabelle sehen Sie die Granularität von Jahr und Produktkategorie.The table rows reveal a granularity of year and product category. Anders formuliert: Verkaufsziele, mit denen die Umsatzentwicklung gemessen werden soll, werden jährlich für jede Produktkategorie festgelegt.In other words, targets—used to measure sales performance—are set each year for each product category.

Diagramm der Tabelle „Target“ mit drei Spalten: „TargetYear“, „Category“ und „TargetQuantity“.

Da die Tabelle Target Daten auf einer höheren Ebene speichert als die Dimensionstabellen, kann keine 1:n-Beziehung erstellt werden.Because the Target table stores data at a higher level than the dimension-type tables, a one-to-many relationship cannot be created. Dies gilt allerdings nur für eine der Beziehungen.Well, it's true for just one of the relationships. Im Folgenden erfahren Sie, wie die Tabelle Target auf die Dimensionstabellen bezogen werden kann.Let's explore how the Target table can be related to the dimension-type tables.

Herstellen von Beziehungen zwischen Zeiträumen mit höherer GranularitätRelate higher grain time periods

Die Beziehung zwischen den Tabellen Date und Target sollte eine 1:n-Beziehung sein.A relationship between the Date and Target tables should be a one-to-many relationship. Das liegt daran, dass die Spaltenwerte für TargetYear Datumsangaben sind.It's because the TargetYear column values are dates. In diesem Beispiel ist jeder Spaltenwert für TargetYear das erste Datum des Jahrs für ein Verkaufsziel.In this example, each TargetYear column value is the first date of the target year.

Tipp

Wenn Fakten mit einer höheren Zeitgranularität als „Tag“ gespeichert werden, müssen Sie den Datentyp für Spalten auf Datum festlegen oder auf Ganze Zahl, wenn Sie Datumsschlüssel verwenden.When storing facts at a higher time granularity than day, set the column data type to Date (or Whole number if you're using date keys). Speichern Sie in der Spalte einen Wert, der für den ersten Tag des Zeitraums steht.In the column, store a value representing the first day of the time period. Ein Jahreszeitraum wird beispielsweise als 1. Januar des entsprechenden Jahres gespeichert, ein Monatszeitraum als erster Tag des jeweiligen Monats.For example, a year period is recorded as January 1 of the year, and a month period is recorded as the first day of that month.

Dabei müssen Sie sorgfältig vorgehen, damit Filter auf Monats- oder Datumsebene sinnvolle Ergebnisse liefern.Care must be taken, however, to ensure that month or date level filters produce a meaningful result. Ohne spezielle Berechnungslogik geben Berichtsvisuals in Berichten möglicherweise den ersten Tag eines jeweiligen Jahres als Datum für Verkaufsziele an.Without any special calculation logic, report visuals may report that target dates are literally the first day of each year. Die Zusammenfassung für alle anderen Tage und Monate (mit Ausnahme des Januars) ergeben als Zielmenge LEER.All other days—and all months except January—will summarize the target quantity as BLANK.

Im folgenden Matrixvisual sehen Sie, was geschieht, wenn sich ein Berichtbenutzer die Monate eines Jahres ansehen möchte.The following matrix visual shows what happens when the report user drills from a year into its months. Im Visual ist eine Zusammenfassung der Spalte TargetQuantity dargestellt.The visual is summarizing the TargetQuantity column. Die Option Elemente ohne Daten anzeigen wurde für die Matrixzeilen aktiviert.(The Show items with no data option has been enabled for the matrix rows.)

Diagramm eines Matrixvisuals, das für das Jahr 2020 ein Verkaufsziel von 270 angibt

Um dieses Fehlverhalten zu umgehen, sollten Sie die Zusammenfassung Ihrer Faktendaten mithilfe von Measures steuern.To avoid this behavior, we recommend you control the summarization of your fact data by using measures. Eine Möglichkeit, die Zusammenfassung zu steuern, ist es, LEER zurückzugeben, wenn Zeiträume niedrigerer Ebenen abgefragt werden.One way to control the summarization is to return BLANK when lower-level time periods are queried. Eine andere Möglichkeit, die mit komplexeren Funktionen und Operatoren der DAX-Bibliothek definiert wird, ist es, Werte in den Zeiträumen niedrigerer Ebenen zuzuteilen.Another way—defined with some sophisticated DAX—is to apportion values across lower-level time periods.

Sehen Sie sich die folgende Measuredefinition an, die die DAX-Funktion ISFILTERED verwendet.Consider the following measure definition that uses the ISFILTERED DAX function. Es wird nur ein Wert zurückgegeben, wenn die Spalten Date oder Month nicht gefiltert sind.It only returns a value when the Date or Month columns aren't filtered.

Target Quantity =
IF(
    NOT ISFILTERED('Date'[Date])
        && NOT ISFILTERED('Date'[Month]),
    SUM(Target[TargetQuantity])
)

Für das folgende Matrixvisual wird nun das Measure TargetQuantity verwendet.The following matrix visual now uses the Target Quantity measure. Hier sehen Sie, dass alle Zielmengen für Monate LEER sind.It shows that all monthly target quantities are BLANK.

Diagramm eines Matrixvisuals, das für das Jahr 2020 ein Verkaufsziel von 270 mit leeren monatlichen Werten angibt.

Herstellen von Beziehungen zwischen Fakten mit höherer Granularität (kein Datum)Relate higher grain (non-date)

Wenn eine Beziehung einer Spalte ohne Datum aus einer Dimensionstabelle zu einer Faktentabelle hergestellt werden soll, und sie eine höhere Granularität als die Dimensionstabelle hat, ist ein anderer Designansatz erforderlich.A different design approach is required when relating a non-date column from a dimension-type table to a fact-type table (and it's at a higher grain than the dimension-type table).

In den Category-Spalten aus den Tabellen Product und Target sind doppelte Werte enthalten.The Category columns (from both the Product and Target tables) contains duplicate values. Es gibt also kein „1“ für eine 1:n-Beziehung.So, there's no "one" for a one-to-many relationship. In diesem Fall müssen Sie eine m:n-Beziehung erstellen.In this case, you'll need to create a many-to-many relationship. Die Beziehung sollte Filter in eine einzige Richtung weitergeben, nämlich von der Dimensionstabelle auf die Faktentabelle.The relationship should propagate filters in a single direction, from the dimension-type table to the fact-type table.

Diagramm eines Modells der Tabellen „Target“ und „Product“

Sehen Sie sich nun die Tabellenzeilen genauer an.Let's now take a look at the table rows.

Diagramm eines Modells mit den beiden Tabellen „Target“ und „Product“.

In der Tabelle Target sind vier Zeilen enthalten: Zwei Zeilen für jedes Zieljahr (2019 und 2020) und zwei Kategorien („Clothing“ (Kleidung) und „Accessories“ (Accessoires)).In the Target table, there are four rows: two rows for each target year (2019 and 2020), and two categories (Clothing and Accessories). In der Tabelle Product sind drei Produkte enthalten.In the Product table, there are three products. Zwei gehören zur Kategorie „Clothing“ und eine zur Kategorie „Accessories“.Two belong to the clothing category, and one belongs to the accessories category. Ein Produkt der Kleidungskategorie hat die Farbe „Green“ (Grün), die anderen beiden Produkte sind „Blue“ (Blau).One of the clothing colors is green, and the remaining two are blue.

Das folgende Tabellenvisual ordnet nach der Spalte Category aus der Tabelle Produkt an und führt zu folgendem Ergebnis.A table visual grouping by the Category column from the Product table produces the following result.

Diagramm eines Tabellenvisuals mit zwei Spalten: „Category“ und „TargetQuantity“.

Das Visual kommt zum richtigen Ergebnis.This visual produces the correct result. Im Folgenden erfahren Sie nun, was geschieht, wenn die Zielmenge nach der Spalte Color (Farbe) der Tabelle Produkt angeordnet wird.Let's now consider what happens when the Color column from the Product table is used to group target quantity.

Diagramm eines Tabellenvisuals mit zwei Spalten: „Color“ und „TargetQuantity“.

Das Visual interpretiert die Daten hier also falsch.The visual produces a misrepresentation of the data. Warum?What is happening here?

Ein auf die Spalte Color der Tabelle Product angewendeter Filter führt zu zwei Zeilen.A filter on the Color column from the Product table results in two rows. Eine der Zeilen steht für die Kategorie „Clothing“, die andere für die Kategorie „Accessories“.One of the rows is for the Clothing category, and the other is for the Accessories category. Diese zwei Kategoriewerte werden als Filter an die Tabelle Target weitergegeben.These two category values are propagated as filters to the Target table. Anders gesagt: Da die Farbe „Blau“ von Produkten aus zwei Kategorien verwendet wird, werden diese Kategorien dazu genutzt, um die Zielwerte zu filtern.In other words, because the color blue is used by products from two categories, those categories are used to filter the targets.

Um dieses Fehlverhalten zu umgehen, sollten Sie wie oben bereits erläutert die Zusammenfassung Ihrer Faktendaten mithilfe von Measures steuern.To avoid this behavior, as described earlier, we recommend you control the summarization of your fact data by using measures.

Sehen Sie sich die folgende Measuredefinition an.Consider the following measure definition. Wie Sie sehen können, werden alle Spalten aus der Tabelle Product, die sich unter der Kategorieebene befinden, auf Filter überprüft.Notice that all Product table columns that are beneath the category level are tested for filters.

Target Quantity =
IF(
    NOT ISFILTERED('Product'[ProductID])
        && NOT ISFILTERED('Product'[Product])
        && NOT ISFILTERED('Product'[Color]),
    SUM(Target[TargetQuantity])
)

Für das folgende Tabellenvisual wird nun das Measure TargetQuantity verwendet.The following table visual now uses the Target Quantity measure. Sie können sehen, dass alle Zielmengen für „Color“ LEER sind.It shows that all color target quantities are BLANK.

Diagramm eines Tabellenvisuals mit zwei Spalten: „Color“ und „TargetQuantity“.

Das endgültige Modelldesign sieht folgendermaßen aus:The final model design looks like the following.

Diagramm eines Modells mit den Tabellen „Date“ und „Target“, die über eine 1:n-Beziehung miteinander verbunden sind

Anleitung für das Herstellen einer Beziehung von Fakten mit höherer GranularitätRelate higher grain facts guidance

Wenn Sie eine Beziehung zwischen einer Dimensionstabelle und einer Faktentabelle herstellen müssen, und in der Faktentabelle Zeilen mit einer höheren Granularität als in der Dimensionstabelle gespeichert werden, können Sie folgender Anleitung folgen:When you need to relate a dimension-type table to a fact-type table, and the fact-type table stores rows at a higher grain than the dimension-type table rows, we provide the following guidance:

  • Für Datumsangaben in einer Faktentabelle mit höherer Granularität:For higher grain fact dates:
    • Speichern Sie in der Faktentabelle das erste Datum des Zeitraums.In the fact-type table, store the first date of the time period
    • Erstellen Sie eine 1:n-Beziehung zwischen der Tabelle „Date“ und der FaktentabelleCreate a one-to-many relationship between the date table and the fact-type table
  • Für andere Fakten mit höherer Granularität:For other higher grain facts:
    • Erstellen Sie eine m:n-Beziehung zwischen der Dimensionstabelle und der Faktentabelle.Create a many-to-many relationship between the dimension-type table and the fact-type table
  • Für beide Arten:For both types:
    • Steuern Sie die Zusammenfassung mit Measurelogik. Wenn für das Filtern oder Anordnen Spalten aus niedrigeren Ebenen von Dimensionstabellen verwendet werden, sollte LEER zurückgegeben werden.Control summarization with measure logic—return BLANK when lower-level dimension-type columns are used to filter or group
    • Blenden Sie Spalten aus Faktentabellen aus, die zusammengefasst werden können. So kann die Faktentabelle nur mithilfe von Measures zusammengefasst werden.Hide summarizable fact-type table columns—this way, only measures can be used to summarize the fact-type table

Nächste SchritteNext steps

Weitere Informationen zu diesem Artikel finden Sie in den folgenden Ressourcen:For more information related to this article, check out the following resources: