Diretrizes de relação bidirecional

Este artigo destina-se aos modeladores de dados que trabalham com o Power BI Desktop. Ele fornece orientação sobre quando criar relações de modelos bidirecionais. Uma relação bidirecional filtra em ambas as direções.

Observação

Este artigo não inclui nenhuma introdução às relações de modelo. Se você não estiver totalmente familiarizado com essas relações, as respectivas propriedades e como configurá-las, recomendamos que leia primeiro o artigo Relações de modelo no Power BI Desktop.

Também é importante que você compreenda o design em esquema em estrela. Para obter mais informações, confira Entender o esquema em estrela e a importância dele para o Power BI.

Geralmente, recomendamos minimizar o uso de relações bidirecionais. Elas podem causar um impacto negativo no desempenho de consulta do modelo e, possivelmente, causar experiências confusas para os usuários de relatórios.

Existem três cenários em que a filtragem bidirecional pode solucionar requisitos específicos:

Relações de modelos especiais

As relações bidirecionais têm uma função importante na criação dos dois seguintes tipos de relação de modelo especial:

  • Um-para-um: Todas as relações de um-para-um devem ser bidirecionais, e não é possível configurá-las de outra forma. Geralmente, não recomendamos a criação desses tipos de relações. Confira uma discussão completa e projetos alternativos em Guia de relações um-para-um.
  • Muitos para muitos: Ao relacionar tabelas do tipo bidimensional, é necessário usar uma tabela de ponte. Um filtro bidirecional é necessário para garantir que os filtros se propaguem pela tabela de ponte. Confira mais informações em Diretrizes de relação muitos para muitos (Relacionar dimensões de muitos para muitos).

Itens de segmentação "com dados"

As relações bidirecionais podem fornecer segmentações que limitam os itens para onde existam dados. (Se você estiver familiarizado com tabelas dinâmicas e segmentações de dados do Excel, é o comportamento padrão ao fornecer dados de um modelo semântico do Power BI (anteriormente conhecido como um conjunto de dados) ou um modelo do Analysis Services.) Para ajudar a explicar o que isso significa, primeiro considere o diagrama do modelo a seguir.

Diagram showing a model containing three tables. The design is described in the following paragraph.

A primeira tabela é denominada Customer e contém três colunas: Country-Region, Customer e CustomerCode. A segunda tabela é denominada Product e contém três colunas: Color, Product e SKU. A terceira tabela é denominada Sales e contém três colunas: CustomerCode, OrderDate, Quantity e SKU. As tabelas Customer e Product são do tipo dimensional, e cada uma tem uma relação um para muitos com a tabela Sales. Cada relação é filtrada em uma única direção.

Para ajudar a descrever como funciona a filtragem bidirecional, o diagrama de modelo foi modificado para revelar as linhas da tabela. Todos os exemplos deste artigo se baseiam nesses dados.

Observação

Não é possível exibir linhas de tabela no diagrama de modelo do Power BI Desktop. Isso é feito neste artigo a fim de contribuir com a discussão, fornecendo exemplos claros.

Diagram showing that the model now reveals the table rows. The row details are described in the following paragraph.

Os detalhes de linha das três tabelas são descritos na seguinte lista com marcadores:

  • A tabela Cliente tem duas linhas:
    • CustomerCode CUST-01, Customer Customer-1, Country-Region United States
    • CustomerCode CUST-02, Customer Customer-2, Country-Region Australia
  • A tabela Product tem três linhas:
    • SKU CL-01, Product T-shirt, Color Green
    • SKU CL-02, Product Jeans, Color Blue
    • SKU AC-01, Product Hat, Color Blue
  • A tabela Sales tem três linhas:
    • OrderDate January 1 2019, CustomerCode CUST-01, SKU CL-01, Quantity 10
    • OrderDate February 2 2019, CustomerCode CUST-01, SKU CL-02, Quantity 20
    • OrderDate March 3 2019, CustomerCode CUST-02, SKU CL-01, Quantity 30

Agora, considere a página de relatório a seguir.

Diagram showing the report page containing three visuals. The details are described in the following paragraph.

A página consiste em duas segmentações e um visual de cartão. A primeira segmentação é para Country-Region e tem dois itens: Australia e United States. Atualmente, está segmentado por Australia. A segunda segmentação é para Product e tem três itens: Hat, Jeans e T-shirt. Nenhum item está selecionado (ou seja, nenhum produto está filtrado). O visual de cartão exibe uma quantidade de 30.

Quando os usuários dos relatórios segmentam por Australia, convém limitar a segmentação de Product para exibir itens cujos dados se relacionam às vendas australianas. É isso que significa exibir os itens da segmentação "com dados". Você pode conseguir esse comportamento configurando a relação entre as tabelas Product e Sales para filtrar nas duas direções.

Diagram showing a model that the relationship between the Product and Sales table is now bi-directional.

A segmentação Product agora relaciona um único item: T-shirt. Esse item representa o único produto vendido para clientes australianos.

Diagram showing the report page containing three visuals with Product called out. The details are described in the following paragraph.

Primeiro, sugerimos que você considere cuidadosamente se esse design funciona para os seus usuários de relatórios. Alguns usuários de relatórios consideram essa experiência confusa. Eles não entendem porque os itens são dinamicamente exibidos ou ocultados quando interagem com outras segmentações.

Caso você decida mostrar os itens de segmentação "com dados", não recomendamos a configuração de relações bidirecionais. As relações bidirecionais exigem mais processamento, o que pode afetar de forma negativa o desempenho das consultas, especialmente se houver um aumento no número de relações bidirecionais do modelo.

Aqui está a melhor maneira de obter o mesmo resultado: Em vez de usar filtros bidirecionais, você pode aplicar um filtro no nível do visual para a própria segmentação de Product.

Agora vamos considerar que a relação entre as tabelas Product e Sales não é mais filtrada em duas direções. E que a definição de medida a seguir foi adicionada à tabela Sales.

Total Quantity = SUM(Sales[Quantity])

Para mostrar os itens "com dados" da segmentação de Product, eles simplesmente precisam ser filtrados pela medida Total Quantity usando a condição "não está em branco".

Diagram showing that the Filters pane for the Product slicer now filters by

Análise de dimensão a dimensão

Um cenário diferente envolvendo relações bidirecionais trata uma tabela do tipo fato como se fosse uma tabela de ponte. Dessa forma, dá suporte à análise dos dados da tabela do tipo dimensão dentro do contexto de filtro de uma tabela diferente do tipo dimensão.

Usando o exemplo de modelo deste artigo, considere como é possível responder às seguintes perguntas:

  • Quantas cores foram vendidas para clientes australianos?
  • Quantos países/regiões compraram jeans?

É possível responder às duas perguntas sem resumir os dados em uma tabela do tipo fato de ponte. No entanto, ainda é necessário que os filtros se propaguem de uma tabela do tipo dimensão para a outra. Assim que os filtros se propagarem pela tabela do tipo fato, será possível resumir as colunas da tabela do tipo dimensão usando a função DAX DISTINCTCOUNT – e, possivelmente, as funções DAX MIN e MAX.

Como a tabela do tipo fato se comporta como uma tabela de ponte, você pode seguir as diretrizes da relação muitos para muitos para relacionar as duas tabelas do tipo dimensão. Será necessário configurar pelo menos uma relação para filtrar nas duas direções. Confira mais informações em Diretrizes de relação muitos para muitos (Relacionar dimensões de muitos para muitos).

No entanto, como descrito neste artigo, este design provavelmente resultará em um impacto negativo no desempenho, e o usuário experimentará as consequências relacionadas aos itens da segmentação "com dados". Portanto, recomendamos que você ative a filtragem bidirecional em uma definição de medida usando a função DAX CROSSFILTER. É possível usar a função CROSSFILTER para modificar as direções do filtro ou até mesmo desabilitar a relação durante a avaliação de uma expressão.

Considere que a seguinte definição de medida foi adicionada à tabela Vendas. Neste exemplo, a relação de modelo entre as tabelas Customer e Sales foi configurada para filtrar em uma única direção.

Different Countries Sold =
CALCULATE(
    DISTINCTCOUNT(Customer[Country-Region]),
    CROSSFILTER(
        Customer[CustomerCode],
        Sales[CustomerCode],
        BOTH
    )
)

Durante a avaliação da expressão de medida Different Countries Sold, a relação entre as tabelas Customer e Sales é filtrada nas duas direções.

O visual da tabela a seguir apresenta as estatísticas de cada produto vendido. A coluna Quantity é simplesmente a soma dos valores de quantidade. A coluna Different Countries Sold representa a contagem distinta de valores de país-região de todos os clientes que compraram o produto.

Diagram showing that two products are listed in a table visual. In the

Para obter mais informações relacionadas a este artigo, confira os seguintes recursos: