Relações com uma cardinalidade muitos para muitos no Power BI DesktopRelationships with a many-many cardinality in Power BI Desktop

Com o recurso 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 the relationships with a many-many cardinality feature 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. O recurso relações com uma cardinalidade muitos para muitos faz parte das funcionalidades mais amplas de modelos compostos do Power BI Desktop.The relationships with a many-many cardinality feature is part of the larger composite models capabilities in Power BI Desktop.

Uma relação muitos para muitos no painel “Editar relação”

A funcionalidade relações com uma cardinalidade muitos para muitos do Power BI Desktop é um de três recursos relacionados:The relationships with a many-many cardinality capability in Power BI Desktop is one of three related features:

  • Modelos compostos: permite que um relatório tenha duas ou mais conexões de dados, incluindo conexões DirectQuery ou Importação, em qualquer combinação.Composite models: Allows a report to have two or more data connections, including DirectQuery connections or Import, in any combination. Para ver mais informações, confira Modelos compostos no Power BI Desktop.For more information, see 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. Antes, mesmo visuais simples como as segmentações iniciavam consultas enviadas para fontes de back-end.Previously, even simple visuals such as slicers began queries that were sent to back-end sources. Para mais informações, confira Modo de armazenamento no Power BI Desktop (versão prévia).For more information, see Storage mode in Power BI Desktop (preview).

O que as relações com uma cardinalidade muitos para muitos resolvemWhat relationships with a many-many cardinality solves

Antes de o recurso relações com uma cardinalidade muitos para muitos ficar disponível, a relação entre duas tabelas era definida no Power BI.Before the relationships with a many-many cardinality feature 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 com o rótulo País, mas os valores de País não eram exclusivos em nenhuma das tabelas.For example, two tables might have had a column labeled Country, but the values of Country weren't unique in either table. Para unir essas tabelas, era necessário criar uma solução alternativa.To join such tables, it was necessary to create a workaround. Essa solução poderia ser introduzir tabelas adicional no modelo com os valores exclusivos necessários.One such workaround might be to introduce into the model additional tables with the necessary unique values. Com o recurso relações com uma cardinalidade muitos para muitos, você pode unir essas tabelas diretamente usando uma relação com uma cardinalidade igual a muitos para muitos.With the relationships with a many-many cardinality feature, you can join such tables directly by using 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 Produto—usando as colunas ProductSales[ProductCode] e Product[ProductCode] —seria 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 há muitas vendas para cada produto e a coluna na tabela Produto (ProductCode) é exclusiva.We define the relationship in this way because there are many sales for each product, 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 para ajudar a garantir 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 to help ensure that the cardinality that you select matches the actual data.

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

Modo de Exibição de Relação

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 de Produto visual com duas linhas

Imagine também que a tabela Vendas tem apenas quatro linhas, incluindo a linha para um produto C. Devido a um erro de integridade referencial, a linha de produto C não existe na tabela Produto.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 da tabela Vendas com quatro linhas

O ProductName e o Preço (da tabela Produto), juntamente com a Qtd total para cada produto (da tabela ProductSales) seria exibido como mostrado a seguir: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, preço e quantidade do produto

Como podemos ver na imagem anterior, há uma linha ProductName em branco que está associada às vendas do produto C. Essa linha em branco é contabilizada da seguinte forma:As you can see in the preceding image, there's blank ProductName row that's 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 visto para o produto C neste 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.

No entanto, pode ocorrer que as tabelas sejam unidas por duas colunas, mas nenhuma coluna seja exclusiva.It sometimes happens that the tables are joined by two columns, yet neither column is unique. Por exemplo, considere as duas seguintes tabelas:For example, consider the following 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 de vendas exibindo as vendas por estado

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

    Tabela de vendas exibindo a cidade, estado e população

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

A solução alternativa anteriorThe previous workaround

Em versões do Power BI Desktop anteriores à versão de julho de 2018, não era possível para os usuários criar uma relação direta entre essas tabelas.In earlier Power BI Desktop versions than the July 2018 release, users couldn't create a direct relationship between these tables. Uma solução alternativa comum para esse problema era fazer o seguinte:A common workaround was to do the following:

  • Crie uma terceira tabela que continha apenas as IDs de Estado exclusivas.Create a third table that contains only the unique State IDs. A tabela poderia ser qualquer uma ou todas das seguintes:The table could be any or all of the following:

    • 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.
  • Relacione as duas tabelas originais à nova tabela, usando relações Muitos para um comuns.Relate the two original tables to that new table by using common Many-1 relationships.

Você pode deixar a tabela da solução alternativa visível ou ocultá-la para que ela não apareça na lista Campos.You could either leave the workaround table visible or hide it so that it doesn't appear in the Fields list. Se você omitir a tabela, as relações Muitos para 1 normalmente serão definidas para filtrar em ambos os sentidos e você poderá usar o campo Estado de qualquer 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. As filtragens cruzadas subsequentes seriam propagadas para a outra tabela.The subsequent cross filtering would propagate to the other table. Essa abordagem é mostrada na imagem a seguir:That approach is shown in the following image:

Modo de Exibição de Relação

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:

Visual da tabela

Observação

Como o estado da tabela CityData é usado nesta solução alternativa, somente os estados nessa tabela são listados e, portanto, TX é excluído.Because the state from the CityData table is used in this workaround, only the states in that table are listed and, therefore, TX is excluded. Além disso, diferentemente de relações muitos para um, embora a linha do total inclua todas as Vendas (incluindo as de 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 do not include a blank row covering such mismatched rows. Da mesma forma, não haveria linhas em branco abrangendo Vendas para as quais houvesse um valor nulo para o Estado.Similarly, there would be no blank row covering Sales for which there's a null value for the State.

Se você também adicionar Cidade ao visual, embora a população por Cidade seja conhecida, as Vendas mostradas para a Cidade simplesmente repetirão as Vendas para o Estado correspondente.If you also add City to that visual, although the population per City is known, the Sales shown for City simply repeats the Sales for the corresponding State. Esse é normalmente o caso quando o agrupamento em uma coluna não está relacionado a nenhuma medida de agregação, conforme mostrado na imagem a seguir:This is normally the case when the grouping in a column is unrelated to some aggregate measure, as shown in the following image:

Visual da tabela

Se definirmos a nova tabela Vendas como a combinação de todos os Estados nesta solução alternativa e torná-la visível na lista Campos, o mesmo visual exibirá tanto o Estado (na nova tabela) quanto a População total e o total Vendas, conforme mostrado na imagem a seguir:If we define the new Sales table as the combination of all States in this workaround and we make it visible in the Fields list, the same visual would display both State (on the new table) and the total Population and total Sales, as shown in the following image:

Visual da tabela

Como podemos ver, os dados de TX—com Vendas, mas com os dados de População desconhecidos —e Nova York—com os dados de População conhecidos, mas não dados Vendas—seriam 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. Com a criação das relações com uma cardinalidade muitos para muitos, os problemas resultantes são resolvidos conforme descrito na próxima seção.With the creation of the relationships with a many-many cardinality, the resulting issues are addressed as described in the next section.

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

A partir da versão de julho de 2018 do Power BI Desktop, é possível relacionar tabelas diretamente, como aquelas que descrevemos anteriormente, sem precisar recorrer a soluções alternativas semelhantes.As of 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 para 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 tabela, ou aplicar filtragem bidirecional, em que ambas as tabelas se filtram entre si.For such relationships, you can still control which table filters the other table, or apply bi-directional filtering where each table filters the other.

No Power BI Desktop, a cardinalidade usa como padrão Muitos para muitos quando é determinado que nenhuma destas tabelas contém valores exclusivos para as colunas na relação.In Power BI Desktop, the cardinality defaults to Many to Many when it determines that neither table contains unique values for the columns in the relationship. Nesses casos, um aviso é exibido, para confirmar se essa configuração de relação é o comportamento desejado, e não um efeito não intencional de um problema de dados.In such cases, a warning is displayed to confirm that relationship-setting is your intended behavior and not the unintended effect of a data issue.

Por exemplo, ao criar uma relação diretamente entre CityData e Vendas—, em que os filtros fluem de CityData para Vendas—, o Power BI Desktop exibe a janela Editar relação como mostrado na imagem a seguir: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 window as shown in the following image:

A janela “Editar relação”

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 seu comportamento subsequente quando os visuais são criados, é semelhante a quando aplicamos a solução alternativa.The tables' appearance in the Fields list, and their subsequent behavior when the visuals are created, is similar to when we applied the workaround. Na solução alternativa, a tabela extra que exibe os dados de Estado distintos não estão visível.In the workaround, the extra table that displays the distinct State data isn't made visible. Por exemplo, conforme descrito na seção anterior, um visual mostrando os dados de Estado, População e Vendas seriam exibidos da seguinte maneira:For example, as described in the preceding section, a visual showing State, Population, and Sales data would be displayed as follows:

Visual da tabela

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. Nem esses valores consideram as linhas em que a coluna usada na relação na outra tabela é nula.Nor do the values 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.It isn't possible to 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 no script a seguir não removeria os filtros nas colunas na tabela CityData relacionada:In the preceding example, a measure that's defined as shown in the following script would not remove filters on columns in the related CityData table:

    Exemplo de script

    Um visual que mostra os dados de Estado, Vendas e Total de vendas resultaria no seguinte:A visual showing State, Sales, and Sales total data would result in the following:

    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 that 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 (multi-dimensional) 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 também à outra fonte do DirectQuery, nem combiná-la com os dados importados.When you connect to these multi-dimensional 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 dessas limitações agora são por tabela, dependendo do modo de armazenamento dela.Many of these 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 quaisquer das tabelas no modelo forem DirectQuery.Other limitations apply to the model as a whole if any of the tables within the model are DirectQuery. Por exemplo, os recursos QuickInsights e P e R não estarão disponíveis em um modelo se qualquer uma das tabelas nele tiver um modo de armazenamento do DirectQuery.For example, the QuickInsights and Q&A features are unavailable on a model if any of the tables 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: