Dynamics do Zero ao PRO · Lição 34 de 48 · Módulo 5

LIÇÃO 34Modelagem de Dados e Relacionamentos

Dados conectados sem um modelo bem definido geram relatórios com números errados. Nesta lição você vai reorganizar as tabelas do Dataverse em um modelo estrela — a estrutura que o Power BI usa melhor — e criar uma tabela de datas para análises temporais corretas.

🎯

Resultado desta lição

Ao final, você terá um modelo estrela completo: tabela fato incident no centro, dimensões de Cliente, Agente, Data e Origem ao redor, com relacionamentos corretos e uma tabela de calendário para análise de tendências por período.

Modelo estrela — fato no centro, dimensões ao redor

Por que modelo estrela? O Power BI calcula métricas percorrendo os relacionamentos entre tabelas. Quando as dimensões ficam ao redor da fato sem relacionamentos diretos entre si (sem "flocos de neve"), o motor analítico do Power BI funciona com máxima performance e as métricas DAX ficam mais simples de escrever.

Passo a passo

  1. Crie uma tabela de Calendário com DAX

    A tabela de datas é fundamental para análises temporais. Crie-a via DAX:

    → Modeling → New table
    Nome: Calendário
    Fórmula DAX:
    Calendário = ADDCOLUMNS( CALENDAR(DATE(2023,1,1), DATE(2026,12,31)), "Ano", YEAR([Date]), "Mês Num", MONTH([Date]), "Mês Nome", FORMAT([Date], "MMMM", "pt-BR"), "Trimestre", "T" & QUARTER([Date]), "Semana", WEEKNUM([Date]), "Dia Semana", FORMAT([Date], "dddd", "pt-BR"), "AnoMês", FORMAT([Date], "YYYY-MM") )
    Marque como tabela de datas: Selecione a tabela Calendário → Table tools → Mark as date table → Date column: Date. Isso ativa otimizações de inteligência temporal no DAX como SAMEPERIODLASTYEAR e TOTALYTD.
  2. Conecte o Calendário à tabela incident

    → Model view → arraste Calendário[Date] até incident[createdon]
    Cardinality: Many to One (*:1) — muitos casos por data
    Cross filter direction: Single (do Calendário para incident)

    Agora você pode filtrar todos os visuais por mês, trimestre ou ano usando a tabela Calendário — e o filtro se propaga automaticamente para a tabela incident.

  3. Verifique e ajuste os relacionamentos com dimensões

    Os relacionamentos que o Power BI criou automaticamente na lição anterior precisam de verificação:

    incident → contact:
    incident._customerid_value (Many) → contact.contactid (One)
    Cross filter: Single

    incident → systemuser:
    incident._ownerid_value (Many) → systemuser.systemuserid (One)
    Cross filter: Single

    queueitem → incident:
    queueitem.objectid (Many) → incident.incidentid (One)
    Cross filter: Single
    Nunca use Both (bidirecional) sem necessidade: Cross filter direction Both faz o filtro fluir nos dois sentidos — isso pode gerar ambiguidade e cálculos incorretos. Use Single em todos os relacionamentos, exceto quando uma necessidade específica exige bidirecional e você sabe o que está fazendo.
  4. Oculte colunas técnicas das dimensões

    Colunas como GUIDs e campos de sistema confundem quem vai usar o relatório. Oculte-as:

    → Model view → clique com botão direito em cada coluna técnica → Hide in report view

    Na tabela incident, oculte:
    incidentid, _customerid_value, _ownerid_value, statecode, statuscode, prioritycode, caseorigincode

    Deixe visíveis apenas:
    title, ticketnumber, createdon, Prioridade, Status, Origem, Horas até Resolução
    Ocultar ≠ excluir: Colunas ocultas ainda existem no modelo e podem ser usadas em relacionamentos e fórmulas DAX. Elas só não aparecem para o usuário no painel de campos quando está construindo visuais — mantendo a interface limpa sem perder funcionalidade.
  5. Organize as tabelas em pastas de exibição

    → No painel de campos, selecione múltiplas colunas relacionadas
    → Em Properties → Display folder → nomeie a pasta

    Sugestão de pastas para incident:
    📊 Métricas: Horas até Resolução
    📋 Classificação: Prioridade, Status, Origem
    📅 Datas: createdon, modifiedon
    📝 Identificação: title, ticketnumber
  6. Crie as primeiras medidas DAX

    → Selecione a tabela incident → New measure
    Total de Casos:
    Total Casos = COUNTROWS(incident)

    Casos Ativos:
    Casos Ativos = CALCULATE(COUNTROWS(incident), incident[statecode] = 0)

    Casos Resolvidos:
    Casos Resolvidos = CALCULATE(COUNTROWS(incident), incident[statecode] = 1)

    Tempo Médio de Resolução (horas):
    MTTR = AVERAGE(incident[Horas até Resolução])
    Medidas vs. colunas calculadas: Medidas (como as acima) calculam na hora da visualização usando o contexto de filtros ativo. Colunas calculadas (como Prioridade e Status que criamos antes) calculam para cada linha na carga dos dados. Use medidas para métricas e colunas calculadas para transformações por linha.

Checklist

Por que o modelo importa tanto

Um modelo mal estruturado não quebra o relatório — ele gera números silenciosamente errados. Um filtro de mês que não se propaga para a tabela incident porque o relacionamento está invertido. Uma contagem de casos que duplica porque há um relacionamento Many-to-Many não tratado. Esses erros aparecem como "o Power BI está errado" — quando na verdade é o modelo.

Dedique tempo ao modelo antes de construir os visuais. É muito mais barato consertar o modelo do que reconstruir 10 páginas de relatório depois de descobrir que os números estavam errados.

Foto de Pablo Maruk
Pablo Maruk
Analista Funcional de Dynamics · 16 anos de TI · EUA & Europa