• Power BI e DAX
  • Data model Power BI - relazioni solide, DAX e report affidabili

Data model Power BI - relazioni solide, DAX e report affidabili

Bruno De luca 19 luglio 2026
Diagramma del data model Power BI: preparazione dati, modello semantico e report sottili con visualizzazioni.

Indice

Un report può avere grafici impeccabili e restituire comunque numeri sbagliati se le tabelle non comunicano tra loro nel modo corretto. Un data model Power BI ben progettato chiarisce la struttura dei dati, rende le misure DAX più affidabili e migliora anche la velocità dei report. In questa guida mostro come organizzare fatti e dimensioni, creare relazioni solide, scegliere tra Import e DirectQuery e gestire gli errori che più spesso complicano i progetti reali.

Un modello Power BI efficace nasce da relazioni semplici e da una granularità chiara

  • Schema a stella con tabelle dei fatti e dimensioni separate.
  • Relazioni uno-a-molti con filtri, quando possibile, in una sola direzione.
  • Misure DAX preferibili alle colonne calcolate per i risultati aggregati.
  • Tabella calendario dedicata per analisi temporali coerenti.
  • Controlli su prestazioni e sicurezza prima della pubblicazione.

Schema di **data model Power BI** con tabelle collegate: Individuals, Audience, Time, Date, Networks.

Il modello giusto parte da fatti e dimensioni

Quando progetto un modello in Power BI, parto sempre da una domanda semplice: che cosa rappresenta una riga? Questa informazione definisce la granularità, cioè il livello di dettaglio del dato, e condiziona ogni relazione, misura e filtro del report.

Lo schema a stella è spesso il punto di partenza più efficace. Al centro si trova una tabella dei fatti, che registra eventi come vendite, ordini o movimenti di magazzino. Intorno ci sono le dimensioni, che descrivono prodotti, clienti, date, punti vendita o venditori.

Elemento Contenuto Esempio
Tabella dei fatti Eventi, chiavi e valori numerici Vendite con quantità, prezzo e costo
Dimensione Attributi usati per filtrare e raggruppare Prodotto, cliente, data, regione
Misura Calcolo eseguito al momento della query Fatturato, margine, numero di ordini

Immaginiamo una tabella FactSales con una riga per ogni riga d’ordine. Le dimensioni DimDate, DimProduct e DimCustomer filtrano quella tabella attraverso chiavi univoche. Il vantaggio non è solo estetico: i filtri diventano prevedibili e le formule DAX hanno meno possibilità di produrre risultati ambigui.

Un errore frequente consiste nel mescolare descrizioni e transazioni nella stessa tabella senza una ragione precisa. Un altro è sommare dati con granularità diverse, per esempio vendite giornaliere insieme a obiettivi mensili, senza definire come devono essere confrontati. Prima di creare una misura, scrivo sempre una frase come “una riga rappresenta una vendita per prodotto e giorno”. Se non riesco a formularla, il modello non è ancora pronto.

Come costruire il modello senza creare confusione

La modellazione non comincia dalla vista Relazioni. Comincia dalla preparazione dei dati. Power Query serve per importare, pulire e trasformare le sorgenti; il modello semantico serve poi a stabilire come quelle tabelle devono interagire nei report.

  1. Definisci il processo aziendale. Parti da vendite, acquisti, ticket o budget e stabilisci quali eventi vuoi analizzare.
  2. Controlla la granularità. Verifica che ogni riga della tabella dei fatti abbia lo stesso significato.
  3. Prepara le chiavi. La colonna sul lato “uno” deve contenere valori univoci e non vuoti.
  4. Crea le relazioni. Preferisci relazioni uno-a-molti tra dimensioni e fatti, con propagazione del filtro dalla dimensione al fatto.
  5. Nascondi i dettagli tecnici. Le chiavi e le colonne utilizzate solo per le relazioni non dovrebbero confondere chi costruisce il report.

Le relazioni determinano il comportamento dei filtri

Una relazione non è solo un collegamento grafico. È il percorso attraverso cui un filtro passa da una tabella all’altra. Se seleziono “Lombardia” nella dimensione dei clienti, Power BI deve sapere come arrivare alle vendite da aggregare.

La configurazione più leggibile è generalmente uno-a-molti e a direzione singola. Le relazioni bidirezionali possono essere utili in casi specifici, ma introducono percorsi di filtro più difficili da controllare e possono creare ambiguità.

Le relazioni molti-a-molti meritano particolare cautela. Quando due dimensioni devono essere collegate, spesso inserisco una tabella ponte con le chiavi delle due entità. Per esempio, una tabella ponte può associare più venditori a più aree commerciali senza forzare Power BI a interpretare direttamente una relazione ambigua.

La tabella calendario non è un dettaglio

Per analizzare mesi, trimestri, anni e periodi precedenti, uso una dimensione data autonoma collegata alla tabella dei fatti. Deve contenere almeno una riga per ogni giorno del periodo analizzato e colonne come anno, mese, numero del mese e trimestre.

Una data scritta come testo o una gerarchia automatica lasciata al caso può funzionare in un prototipo, ma diventa fragile appena servono confronti come anno su anno o progressivi annuali. Una sola dimensione data condivisa mantiene coerenti calendario, filtri e misure.

DAX funziona bene quando il modello gli lascia spazio

DAX non corregge una struttura confusa. Può modificare il contesto di filtro e applicare logiche molto potenti, ma se le relazioni sono errate una formula complessa spesso nasconde il problema invece di risolverlo.

Per i valori aggregati preferisco creare misure esplicite. Una misura viene calcolata quando il visual ne ha bisogno e risponde ai filtri applicati dall’utente. Un esempio essenziale è:

Fatturato =
SUMX(
    FactSales,
    FactSales[Quantity] * FactSales[UnitPrice]
)

Se il prezzo è già memorizzato come valore di riga, SUM può essere sufficiente. SUMX, invece, valuta un’espressione riga per riga e poi somma i risultati. La scelta dipende dalla struttura della tabella dei fatti, non da una regola assoluta.

Misure e colonne calcolate hanno scopi diversi

Una colonna calcolata viene valutata per ogni riga durante l’aggiornamento del modello e occupa spazio in memoria. Una misura viene calcolata durante l’interazione con il report. Per questo, per percentuali, totali, margini e KPI, scelgo quasi sempre una misura.

Margine % =
DIVIDE(
    [Margine],
    [Fatturato],
    0
)

DIVIDE gestisce in modo più sicuro il caso in cui il denominatore sia zero o vuoto. È una piccola scelta, ma evita messaggi di errore e risultati poco presentabili nei visual.

Il contesto di filtro è il vero centro di DAX

La funzione CALCULATE modifica il contesto in cui viene valutata una misura. Per esempio, posso calcolare il fatturato dell’anno precedente usando una dimensione data ben collegata:

Fatturato anno precedente =
CALCULATE(
    [Fatturato],
    DATEADD(DimDate[Date], -1, YEAR)
)

Questa formula funziona correttamente solo se la colonna data è completa, collegata alla tabella dei fatti e utilizzata nel modo previsto. Nella pratica, molti problemi attribuiti a DAX dipendono invece da date duplicate, relazioni inattive o granularità incompatibili.

Quando una tabella dei fatti contiene più date, per esempio ordine, spedizione e consegna, una sola relazione tra le stesse tabelle può essere attiva. Per usare una relazione alternativa si può ricorrere a USERELATIONSHIP, ma se le date hanno un ruolo importante nel report può essere più chiaro usare dimensioni data separate per ogni ruolo.

Import, DirectQuery e modello composito richiedono scelte diverse

La modalità di connessione influenza prestazioni, aggiornamento e complessità del progetto. Non esiste una scelta migliore in assoluto: dipende dal volume dei dati, dalla frequenza richiesta e dalle capacità della sorgente.

Modalità Punto di forza Limite principale Quando la sceglierei
Import Risposte rapide grazie ai dati caricati nel modello Richiede aggiornamenti programmati e memoria sufficiente Report direzionali e analisi interattive quotidiane
DirectQuery Interroga la sorgente senza importare tutto il contenuto Le prestazioni dipendono dal database e dalle query generate Dati molto grandi o requisiti di freschezza elevati
Composito Combina tabelle importate e tabelle interrogate direttamente Aumenta la complessità delle relazioni e dei test Scenari ibridi con dati storici e dati operativi recenti

Per la maggior parte dei report gestionali partirei da Import, se il volume e la frequenza di aggiornamento lo consentono. Offre spesso l’esperienza più fluida e rende più semplice ottimizzare le misure. DirectQuery ha senso quando la latenza dell’aggiornamento è davvero importante o quando importare i dati non è praticabile.

Un compromesso comune consiste nel mantenere in Import lo storico e interrogare direttamente solo i dati più recenti. Questa soluzione può essere valida, ma va verificata con dati realistici. Un modello composito progettato senza test può risultare più lento e più difficile da amministrare di un modello Import completo.

Prestazioni, sicurezza e manutenzione si progettano insieme

La velocità non dipende soltanto dal numero di righe. Contano anche il numero di colonne, i tipi di dati, la cardinalità e la qualità delle relazioni. Una colonna testuale ad alta cardinalità, come un identificativo univoco ripetuto raramente, può pesare più di quanto immaginiamo.

Nel lavoro quotidiano applico alcune regole semplici:

  • elimino in Power Query le colonne che non servono al report;
  • preferisco tipi numerici e date corretti a testi usati impropriamente;
  • evito di caricare tabelle intermedie che non hanno un ruolo analitico;
  • mantengo una granularità coerente nelle tabelle dei fatti;
  • controllo le query lente con Performance Analyzer e con test su visual rappresentativi;
  • valuto l’aggiornamento incrementale quando lo storico cresce continuamente.

La sicurezza a livello di riga, o RLS, filtra i dati in base all’utente o al ruolo. Per esempio, un responsabile regionale può vedere solo le vendite della propria area. La sicurezza dipende però dalla propagazione dei filtri: una relazione configurata male può mostrare dati incompleti oppure non applicare il filtro dove serve.

Per questo testo sempre RLS con almeno due profili diversi e verifico i risultati direttamente nel servizio Power BI. Non mi affiderei a un controllo visivo del report: un modello apparentemente corretto può ancora esporre dati oltre il perimetro previsto.

Leggi anche: TOPN in DAX per classifiche dinamiche in Power BI

La documentazione riduce gli errori futuri

Un modello condiviso dovrebbe avere nomi coerenti, descrizioni per le misure più importanti e una breve nota sulla granularità di ogni tabella dei fatti. Anche una pagina interna con le definizioni di “fatturato”, “cliente attivo” e “ordine completato” evita discussioni ripetute tra analisti e responsabili aziendali.

La documentazione ufficiale Microsoft Learn tratta separatamente schema a stella, relazioni, DAX e progettazione dei modelli semantici. Io la uso come riferimento tecnico, ma la completo sempre con regole specifiche del progetto, perché nessuna guida generale conosce le definizioni adottate dalla singola azienda.

Gli errori che rendono fragile un modello Power BI

Il primo errore è importare una grande tabella piatta e collegarla direttamente a tutto. Può sembrare il modo più veloce per iniziare, ma appena aumentano i visual compaiono duplicazioni, filtri incoerenti e misure difficili da mantenere.

Il secondo è lasciare a Power BI la creazione automatica di tutte le relazioni. L’individuazione automatica può essere utile come suggerimento, ma non conosce sempre la logica aziendale. Una relazione basata su una colonna dal nome simile non è necessariamente una relazione corretta.

Altri segnali da controllare sono:

  • totali duplicati dopo un merge o una relazione molti-a-molti;
  • filtri che non arrivano alla tabella dei fatti;
  • misure diverse che usano definizioni differenti dello stesso KPI;
  • date incoerenti tra calendario, transazioni e obiettivi;
  • formule DAX enormi usate per compensare una struttura dati sbagliata.

Quando una misura richiede molti FILTER, LOOKUPVALUE e condizioni eccezionali per restituire un numero apparentemente semplice, mi fermo e controllo il modello. Spesso la soluzione più solida non è aggiungere altra DAX, ma correggere una chiave, separare una dimensione o rendere esplicita la granularità.

La verifica finale che trasforma le tabelle in un modello affidabile

Prima di pubblicare un report, controllo il modello con una sequenza breve ma concreta. Verifico la granularità dei fatti, l’unicità delle chiavi, la direzione delle relazioni, il comportamento della tabella calendario e la riconciliazione di almeno un totale con la fonte originale.

  • Una riga della tabella dei fatti ha un significato preciso?
  • Le dimensioni filtrano i fatti senza percorsi ambigui?
  • Le misure principali restituiscono lo stesso totale della fonte?
  • Import o DirectQuery rispondono ai tempi richiesti dagli utenti?
  • RLS, aggiornamento e responsabilità di manutenzione sono stati testati?

La mia regola pratica è questa: prima si rende chiaro il modello, poi si rende sofisticata la DAX. Un modello Power BI semplice da leggere sarà anche più facile da spiegare, correggere e far crescere quando arriveranno nuovi dati, nuovi utenti e nuove domande aziendali.

Domande frequenti

La tabella dei fatti registra eventi come vendite, ordini o movimenti di magazzino, con chiavi e valori numerici. Le dimensioni descrivono quei fatti, per esempio tramite prodotto, cliente, data o regione, e li filtrano attraverso chiavi univoche.

Import è spesso adatto ai report gestionali perché offre risposte rapide, se memoria e aggiornamenti programmati sono sufficienti. DirectQuery è utile con dati molto grandi o requisiti di freschezza elevati, mentre un modello composito combina dati importati e interrogati direttamente, aumentando però la complessità dei test e delle relazioni.

Una dimensione data autonoma deve contenere una riga per ogni giorno e colonne come anno, mese, numero del mese e trimestre. Collegata ai fatti, rende coerenti confronti anno su anno, progressivi annuali e funzioni come DATEADD, evitando i limiti delle date testuali o delle gerarchie automatiche.

È preferibile usare relazioni uno-a-molti con propagazione del filtro in una sola direzione. Quando due dimensioni devono essere collegate, una tabella ponte con le chiavi delle entità può evitare collegamenti diretti ambigui e rendere più prevedibile il comportamento dei filtri.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

relazioni
granularità
rls
dimensioni
directquery
Autor Bruno De luca
Bruno De luca
Mi chiamo Bruno De Luca e da 9 anni mi dedico con passione all'analisi dei dati, alla Business Intelligence e alla Data Science. Quello che mi affascina di questo campo è la capacità di trasformare numeri grezzi in storie comprensibili, aiutando a prendere decisioni più informate e strategiche. Sul sito mondobi.it, il mio obiettivo è condividere conoscenze, semplificare concetti complessi e offrire prospettive aggiornate, basandomi su un approccio rigoroso di verifica delle fonti e organizzazione delle informazioni. Cerco sempre di rendere i contenuti accessibili e utili, per chiunque voglia navigare nel mondo dei dati con maggiore consapevolezza.

Condividi post

Scrivi un commento