Aplicar relações muitos para muitos no Power BI DesktopApply many-many relationships in Power BI Desktop

Com as relações com uma cardinalidade muitos para muitos no Power BI Desktop, você pode unir tabelas que usam uma cardinalidade igual a muitos para muitos.With relationships with a many-many cardinality in Power BI Desktop, you can join tables that use a cardinality of many-to-many. Você pode criar modelos de dados mais fáceis e intuitivos que contêm duas ou mais fontes de dados.You can more easily and intuitively create data models that contain two or more data sources. As relações com uma cardinalidade muitos para muitos faz parte das funcionalidades mais amplas de modelos compostos do Power BI Desktop.Relationships with a many-many cardinality are part of the larger composite models capabilities in Power BI Desktop.

Uma relação muitos para muitos no painel "Editar relação", Power BI Desktop

Uma relação com uma cardinalidade muitos para muitos no Power BI Desktop é composta por um de três recursos relacionados:A relationship with a many-many cardinality in Power BI Desktop is composed of one of three related features:

  • Modelos compostos: Um modelo composto permite que um relatório tenha duas ou mais conexões de dados, incluindo conexões do DirectQuery ou importação, em qualquer combinação.Composite models: A composite model allows a report to have two or more data connections, including DirectQuery connections or Import, in any combo. Para obter mais informações, confira Usar modelos compostos no Power BI Desktop.For more information, see Use composite models in Power BI Desktop.

  • Relações com uma cardinalidade muitos para muitos: Com os modelos compostos, você pode estabelecer relações com uma cardinalidade muitos para muitos entre tabelas.Relationships with a many-many cardinality: With composite models, you can establish relationships with a many-many cardinality between tables. Esta abordagem remove os requisitos de valores exclusivos nas tabelas.This approach removes requirements for unique values in tables. Ela também remove as soluções alternativas anteriores, como introduzir novas tabelas somente para estabelecer relações.It also removes previous workarounds, such as introducing new tables only to establish relationships. O recurso é descrito em detalhes neste artigo.The feature is described further in this article.

  • Modo de armazenamento: agora você pode especificar quais visuais exigem uma consulta para fontes de dados de back-end.Storage mode: You can now specify which visuals require a query to back-end data sources. Visuais que não exigem uma consulta serão importados, mesmo se forem baseados no DirectQuery.Visuals that don't require a query are imported even if they're based on DirectQuery. Esse recurso ajuda a melhorar o desempenho e reduzir a carga de back-end.This feature helps improve performance and reduce back-end load. Anteriormente, mesmo visuais simples, como segmentações, iniciavam consultas que eram enviadas para as fontes de back-end.Previously, even simple visuals, such as slicers, began queries that were sent to back-end sources. Para mais informações, veja o modo de Armazenamento no Power BI Desktop.For more information, see Storage mode in Power BI Desktop.

Problemas resolvidos por uma relação com uma cardinalidade muitos para muitosWhat a relationship with a many-many cardinality solves

Antes de as relações com uma cardinalidade muitos para muitos serem disponibilizadas, a relação entre duas tabelas era definida no Power BI.Before relationships with a many-many cardinality became available, the relationship between two tables was defined in Power BI. Pelo menos uma das colunas da tabela envolvidas na relação precisava conter valores exclusivos.At least one of the table columns involved in the relationship had to contain unique values. Muitas vezes, no entanto, não há colunas contendo valores exclusivos.Often, though, no columns contained unique values.

Por exemplo, duas tabelas podem ter uma coluna rotulada Country.For example, two tables might have had a column labeled Country. No entanto, os valores de Country não eram exclusivos em nenhuma das tabelas.The values of Country weren't unique in either table, though. Para unir essas tabelas, você precisava criar uma solução alternativa.To join such tables, you had to create a workaround. Uma solução alternativa pode ser introduzir tabelas extras com os valores exclusivos necessários.One workaround might be to introduce extra tables with the needed unique values. Com as relações com uma cardinalidade muitos para muitos, você poderá unir essas tabelas diretamente se usar uma relação com uma cardinalidade igual a muitos para muitos.With relationships with a many-many cardinality, you can join such tables directly, if you use a relationship with a cardinality of many-to-many.

Usar relações com uma cardinalidade muitos para muitosUse relationships with a many-many cardinality

Ao definir uma relação entre duas tabelas no Power BI, é preciso definir a cardinalidade da relação.When you define a relationship between two tables in Power BI, you must define the cardinality of the relationship. Por exemplo, a relação entre ProductSales e Product,—usando as colunas ProductSales[ProductCode] e Product[ProductCode],—será definida como Muitos para um.For example, the relationship between ProductSales and Product—using columns ProductSales[ProductCode] and Product[ProductCode]—would be defined as Many-1. Definimos a relação dessa forma, porque cada produto tem muitas vendas e a coluna na tabela Product (ProductCode) é exclusiva.We define the relationship in this way, because each product has many sales, and the column in the Product table (ProductCode) is unique. Ao definir uma cardinalidade da relação como Muitos para um, Um para muitos ou Um para um, o Power BI a valida, de modo que a cardinalidade selecionada corresponda aos dados reais.When you define a relationship cardinality as Many-1, 1-Many, or 1-1, Power BI validates it, so the cardinality that you select matches the actual data.

Por exemplo, confira o modelo simples nesta imagem:For example, take a look at the simple model in this image:

Tabelas ProductSales e Product, exibição de Relação, Power BI Desktop

Agora, imagine que a tabela Produto exibe apenas duas linhas, conforme mostrado:Now, imagine that the Product table displays just two rows, as shown:

Visual da tabela Produto com duas linhas, Power BI Desktop

Imagine também que a tabela Sales só tem quatro linhas, incluindo a linha para um produto C. Devido a um erro de integridade referencial, a linha do produto C não existe na tabela Product.Also imagine that the Sales table has just four rows, including a row for a product C. Because of a referential integrity error, the product C row doesn't exist in the Product table.

Visual de tabela Sales com quatro linhas, Power BI Desktop

O ProductName e o Price (da tabela Product), juntamente com a Qtd total de cada produto (da tabela ProductSales), serão exibidos conforme mostrado:The ProductName and Price (from the Product table), along with the total Qty for each product (from the ProductSales table), would be displayed as shown:

Visual exibindo o nome, o preço e a quantidade do produto, Power BI Desktop

Como você pode ver na imagem anterior, há uma linha ProductName em branco que está associada às vendas do produto C. Essa linha em branco indica o seguinte:As you can see in the preceding image, a blank ProductName row is associated with sales for product C. This blank row accounts for the following:

  • Qualquer linha na tabela ProductSales sem nenhuma linha correspondente na tabela Produto.Any rows in the ProductSales table for which no corresponding row exists in the Product table. Há um problema de integridade referencial, como vemos no produto C deste exemplo.There's a referential integrity issue, as we see for product C in this example.

  • Qualquer linha na tabela ProductSales para a qual a coluna de chave estrangeira é nula.Any rows in the ProductSales table for which the foreign key column is null.

Por esses motivos, em ambos os casos, a linha em branco refere-se a vendas em que ProductName e Price são desconhecidos.For these reasons, the blank row in both cases accounts for sales where the ProductName and Price are unknown.

Às vezes, as tabelas são unidas por duas colunas, mas nenhuma delas é exclusiva.Sometimes the tables are joined by two columns, yet neither column is unique. Por exemplo, considere estas duas tabelas:For example, consider these two tables:

  • A tabela Vendas exibe dados de vendas por Estado, com cada linha contendo o valor das vendas para o tipo de venda nesse estado.The Sales table displays sales data by State, and each row contains the sales amount for the type of sale in that state. Os estados são CA, WA e TX.The states include CA, WA, and TX.

    Tabela Sales exibindo as vendas por estado, Power BI Desktop

  • A tabela CityData exibe os dados nas cidades, incluindo a população e o estado (como CA, WA e Nova York).The CityData table displays data on cities, including the population and state (such as CA, WA, and New York).

    Tabela Sales exibindo a cidade, o estado e a população, Power BI Desktop

Agora, há uma coluna para Estado em ambas as tabelas.A column for State is now in both tables. É razoável querer relatar o total de vendas por estado e a população total de cada estado.It's reasonable to want to report on both total sales by state and total population of each state. No entanto, há um problema: a coluna State não é exclusiva em nenhuma das tabelas.However, a problem exists: the State column isn't unique in either table.

A solução alternativa anteriorThe previous workaround

Antes da versão de julho de 2018 do Power BI Desktop, não era possível criar uma relação direta entre essas tabelas.Before the July 2018 release of Power BI Desktop, you couldn't create a direct relationship between these tables. Uma solução alternativa comum era:A common workaround was to:

  • Criar uma terceira tabela que continha apenas as IDs de State exclusivas.Create a third table that contains only the unique State IDs. A tabela pode ser qualquer uma destas ou todas estas:The table could be any or all of:

    • Uma tabela calculada (definida usando o [DAX] Data Analysis Expressions).A calculated table (defined by using Data Analysis Expressions [DAX]).
    • Uma tabela baseada em uma consulta que é definida no Editor de Consultas, que pode exibir as IDs exclusivas extraídas de uma das tabelas.A table based on a query that's defined in Query Editor, which could display the unique IDs drawn from one of the tables.
    • O conjunto completo combinado.The combined full set.
  • Em seguida, relacione as duas tabelas originais à nova tabela usando relações comuns Muitos para um.Then relate the two original tables to that new table by using common Many-1 relationships.

Você pode deixar a tabela de solução alternativa visível.You could leave the workaround table visible. Ou pode ocultar a tabela de solução alternativa, de modo que ela não seja exibida na lista Campos.Or you may hide the workaround table, so it doesn't appear in the Fields list. Se você ocultar a tabela, as relações Muitos para um normalmente serão definidas para filtro em ambas as direções e você poderá usar o campo Estado de uma das tabelas.If you hide the table, the Many-1 relationships would commonly be set to filter in both directions, and you could use the State field from either table. A filtragem cruzada posterior será propagada para a outra tabela.The later cross filtering would propagate to the other table. Essa abordagem é mostrada na imagem a seguir:That approach is shown in the following image:

Tabela Estado oculta, exibição de Relação, Power BI Desktop

Um visual que exibe o Estado (da tabela CityData), juntamente com a População total e o total de Vendas apareceria desta forma:A visual that displays State (from the CityData table), along with total Population and total Sales, would then appear as follows:

Tabelas State, Population e Sales, Power BI Desktop

Observação

Como o estado da tabela CityData é usado nesta solução alternativa, somente os estados dessa tabela são listados e, portanto, o TX é excluído.Because the state from the CityData table is used in this workaround, only the states in that table are listed, so TX is excluded. Além disso, ao contrário das relações Muitos para um, embora a linha do total inclua todas as Vendas (incluindo as do TX), os detalhes não incluem uma linha em branco que abrange essas linhas não correspondentes.Also, unlike Many-1 relationships, while the total row includes all Sales (including those of TX), the details don't include a blank row covering such mismatched rows. Da mesma forma, nenhuma linha em branco abrange Sales, para a qual há um valor nulo em State.Similarly, no blank row would cover Sales for which there's a null value for the State.

Suponha que você também adicione City a esse visual.Suppose you also add City to that visual. Embora a população por City seja conhecida, as Sales mostradas para a City simplesmente repetirão as Sales do State correspondente.Although the population per City is known, the Sales shown for City simply repeats the Sales for the corresponding State. Esse cenário normalmente ocorre quando o agrupamento de colunas não está relacionado a uma medida agregada, conforme mostrado aqui:This scenario normally occurs when the column grouping is unrelated to some aggregate measure, as shown here:

População de estado e cidade e vendas, Power BI Desktop

Digamos que você defina a nova tabela Sales como a combinação de todos os States aqui e a tornemos visível na lista Fields.Let's say you define the new Sales table as the combination of all States here, and we make it visible in the Fields list. O mesmo visual exibirá State (na nova tabela), a Population total e o total de Sales:The same visual would display State (on the new table), the total Population, and total Sales:

Visual de estado, população e vendas, Power BI Desktop

Como você pode ver, o TX,—com os dados de Sales, mas com os dados de Population desconhecidos,—e Nova York,—com os dados de Population conhecidos, mas sem dados de Sales,—serão incluídos.As you can see, TX—with Sales data but unknown Population data—and New York—with known Population data but no Sales data—would be included. Essa solução alternativa não é ideal, e tem vários problemas.This workaround isn't optimal, and it has many issues. Para relações com uma cardinalidade muitos para muitos, os problemas resultantes são resolvidos conforme descrito na próxima seção.For relationships with a many-many cardinality, the resulting issues are addressed, as described in the next section.

Usar uma relação com uma cardinalidade muitos para muitos em vez da solução alternativaUse a relationship with a many-many cardinality instead of the workaround

Com a versão de julho de 2018 do Power BI Desktop, você pode relacionar tabelas diretamente, como aquelas que descrevemos anteriormente, sem precisar recorrer a soluções alternativas semelhantes.With the July 2018 version of Power BI Desktop, you can directly relate tables, such as the ones we described earlier, without having to resort to similar workarounds. Agora é possível definir a cardinalidade da relação como muitos para muitos.It's now possible to set the relationship cardinality to many-to-many. Essa configuração indica que nenhuma tabela contém valores exclusivos.This setting indicates that neither table contains unique values. Para essas relações, você ainda pode controlar qual tabela filtra a outra.For such relationships, you may still control which table filters the other table. Ou você pode aplicar a filtragem bidirecional, em que cada tabela filtra a outra.Or you can apply bidirectional filtering, where each table filters the other.

No Power BI Desktop, a cardinalidade usa como padrão muitos para muitos quando determina que nenhuma das tabelas contém valores exclusivos para as colunas da relação.In Power BI Desktop, the cardinality defaults to many-to-many when it determines neither table contains unique values for the relationship columns. Nesses casos, uma mensagem de aviso confirma se você deseja definir uma relação, e a alteração não é o efeito indesejado de um problema de dados.In such cases, a warning message confirms you want to set a relationship, and the change isn't the unintended effect of a data issue.

Por exemplo, quando você cria uma relação diretamente entre CityData e Sales,—em que os filtros devem fluir de CityData para Sales,—o Power BI Desktop exibe a caixa de diálogo Editar relação:For example, when you create a relationship directly between CityData and Sales—where filters should flow from CityData to Sales—Power BI Desktop displays the Edit relationship dialog box:

Caixa de diálogo Editar relação, Power BI Desktop

O modo de exibição Relação resultante conteria a relação direta, muitos para muitos, entre as duas tabelas.The resulting Relationship view would then display the direct, many-to-many relationship between the two tables. A aparência das tabelas na lista Campos e o comportamento posterior delas quando os visuais são criados são semelhantes a quando aplicamos a solução alternativa.The tables' appearance in the Fields list, and their later behavior when the visuals are created, are similar to when we applied the workaround. Na solução alternativa, a tabela extra que exibe os dados distintos de Estado não se torna visível.In the workaround, the extra table that displays the distinct State data isn't made visible. Conforme descrito anteriormente, um visual que mostra dados de State, Population e Sales será exibido:As described earlier, a visual that shows State, Population, and Sales data would be displayed:

Tabelas State, Population e Sales, Power BI Desktop

As principais diferenças entre as relações com uma cardinalidade muitos para muitos e as relações muitos para um mais comuns são as seguintes:The major differences between relationships with a many-many cardinality and the more typical Many-1 relationships are as follows:

  • Os valores mostrados não incluem uma linha em branco que conta para as linhas incompatíveis na outra tabela.The values shown don't include a blank row that accounts for mismatched rows in the other table. Além disso, os valores não consideram as linhas em que a coluna usada na relação na outra tabela é nula.Also, the values don't account for rows where the column used in the relationship in the other table is null.

  • Não é possível usar a função RELATED(), pois mais de uma linha pode estar relacionada.You can't use the RELATED() function, because more than one row could be related.

  • Usar a função ALL() em uma tabela não removerá os filtros aplicados a outras tabelas relacionadas a ela por uma relação muitos para muitos.Using the ALL() function on a table doesn't remove filters that are applied to other, related tables by a many-to-many relationship. No exemplo anterior, uma medida definida, conforme mostrado aqui, não removerá os filtros nas colunas da tabela CityData relacionada:In the preceding example, a measure that's defined as shown here wouldn't remove filters on columns in the related CityData table:

    Exemplo de script

    Um visual que mostra os dados de State, Sales e Sales total resultará neste gráfico:A visual showing State, Sales, and Sales total data would result in this graphic:

    Visual da tabela

Com as diferenças anteriores em mente, verifique se os cálculos que usam ALL(<Table>), como % do total geral, estão retornando os resultados pretendidos.With the preceding differences in mind, make sure the calculations that use ALL(<Table>), such as % of grand total, are returning the intended results.

Limitações e consideraçõesLimitations and considerations

Há algumas limitações nesta versão das relações com uma cardinalidade muitos para muitos e dos modelos compostos.There are a few limitations for this release of relationships with a many-many cardinality and composite models.

As seguintes fontes (multidimensionais) do Live Connect não podem ser usadas com os modelos compostos:The following Live Connect (multidimensional) sources can't be used with composite models:

  • SAP HANASAP HANA
  • SAP Business WarehouseSAP Business Warehouse
  • SQL Server Analysis ServicesSQL Server Analysis Services
  • Conjuntos de dados do Power BIPower BI datasets
  • Azure Analysis ServicesAzure Analysis Services

Ao se conectar a essas fontes multidimensionais usando o DirectQuery, não é possível se conectar à outra fonte do DirectQuery nem a combinar com os dados importados.When you connect to these multidimensional sources by using DirectQuery, you can't connect to another DirectQuery source or combine it with imported data.

As limitações existentes do uso do DirectQuery ainda se aplicam quando você usa relações com uma cardinalidade muitos para muitos.The existing limitations of using DirectQuery still apply when you use relationships with a many-many cardinality. Muitas limitações agora são por tabela, dependendo do modo de armazenamento da tabela.Many limitations are now per table, depending upon the storage mode of the table. Por exemplo, uma coluna calculada em uma tabela importada pode se referir a outras tabelas, mas uma coluna calculada em uma tabela do DirectQuery ainda se refere apenas às colunas na mesma tabela.For example, a calculated column on an imported table can refer to other tables, but a calculated column on a DirectQuery table can still refer only to columns on the same table. Outras limitações serão aplicáveis ao modelo como um todo se uma das tabelas do modelo forem DirectQuery.Other limitations apply to the whole model if any tables within the model are DirectQuery. Por exemplo, os recursos Insights Rápidos e P e R não estarão disponíveis em um modelo se uma das tabelas dele tiver um modo de armazenamento do DirectQuery.For example, the QuickInsights and Q&A features are unavailable on a model if any table within it has a storage mode of DirectQuery.

Próximas etapasNext steps

Para obter mais informações sobre modelos compostos e DirectQuery, confira os seguintes artigos:For more information about composite models and DirectQuery, see the following articles: