Perché lo star schema è il modello “nativo” di Power BI
Il motore analitico di Power BI (VertiPaq, columnar e in-memory) è ottimizzato per un preciso pattern di modellazione: lo star schema. Non è una preferenza stilistica, è il modo in cui il motore raggiunge le performance migliori e in cui il DAX produce misure prevedibili. Progettare un buon modello semantico significa quindi tradurre i dati in due categorie di tabelle: fact e dimension.
Fact table: gli eventi misurabili
Una fact table registra gli eventi di business — una vendita, un ordine, una transazione, una telefonata. Ha tipicamente molte righe (milioni), poche colonne, ed è composta da:
- misure (measures) numeriche additive:
Quantity,SalesAmount,Cost; - chiavi esterne verso le dimensioni:
ProductKey,CustomerKey,DateKey.
Su questa tabella scriverai le aggregazioni DAX (SUM, SUMX, …). Regola pratica: se una colonna la sommi o la conti, appartiene alla fact; se invece ci filtri o raggruppi, appartiene a una dimensione.
Dimension table: gli attributi descrittivi
Una dimension table contiene gli attributi descrittivi con cui si affetta l’analisi: la tabella Product con categoria e colore, Customer con città e segmento, Date con anno, mese e trimestre. Ha poche righe e molte colonne testuali. Le dimensioni forniscono le etichette di righe, colonne, slicer e assi dei visual. Le relazioni fact→dimension sono uno-a-molti, con direzione di filtro singola dalla dimensione verso la fact (il pattern raccomandato per evitare ambiguità).
Star schema vs snowflake vs tabella flat
- Tabella flat (tutto denormalizzato in un’unica tabella): sembra semplice, ma esplode la cardinalità delle colonne, gonfia il modello in memoria, duplica i valori descrittivi e rende i calcoli distinti (es. “numero di prodotti unici”) più fragili. VertiPaq comprime peggio colonne ad alta cardinalità.
- Snowflake (dimensioni normalizzate su più tabelle collegate, es.
Product → Subcategory → Category): fedele al database sorgente, ma introduce relazioni a catena che allungano i percorsi di filtro, peggiorano le performance e complicano il DAX. - Star schema: una fact centrale circondata da dimensioni denormalizzate a un solo livello. Offre il miglior compromesso: compressione efficiente, percorsi di filtro corti, misure leggibili.
Quando collassare uno snowflake
Nella maggior parte dei casi conviene collassare lo snowflake in un’unica dimensione: porta Category e Subcategory dentro la tabella Product con una merge in Power Query, ottenendo una singola dimensione denormalizzata. Mantieni lo snowflake solo in casi limitati: dimensione condivisa tra più fact a granularità diversa, o tabella intermedia enorme che diventerebbe ridondante se duplicata. In dubbio, per l’esame: collassa.
Role-playing dimensions
Una role-playing dimension è un’unica dimensione usata in più ruoli dalla stessa fact. Il caso classico è Date, richiamata da OrderDateKey e ShipDateKey. In un modello tabellare puoi avere una sola relazione attiva per coppia di tabelle: la seconda diventa inattiva (linea tratteggiata).
Due strategie:
-
Relazione inattiva +
USERELATIONSHIP: mantieni una sola tabellaDatee attivi l’altra relazione dentro la misura:Sales by Ship Date = CALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[ShipDateKey], 'Date'[DateKey] ) ) -
Dimensione duplicata (
Order DateeShip Datecome tabelle separate): utile quando vuoi usare entrambe le date contemporaneamente negli stessi visual, senza scrivere una misura per ogni caso.
Scelta d’esame: se serve confrontare le due date nello stesso visual/filtro, duplica la dimensione; se basta cambiare prospettiva a livello di misura, usa USERELATIONSHIP.
Trappole tipiche d’esame
- Importi il modello relazionale OLTP as-is (tabelle normalizzate, snowflake profondi) → sbagliato: rimodella a stella in Power Query, collassando le dimensioni e separando fatti da attributi. È l’errore più penalizzato.
- Scenario:
Product,Subcategory,Categoryin tre tabelle collegate e performance lente → risposta: denormalizza in un’unica dimensioneProduct(collapse snowflake). - Scenario: la fact ha
OrderDateeShipDateverso la stessaDate→ una relazione è inattiva; per misurare sulla data di spedizione usaUSERELATIONSHIP, oppure duplica la dimensione se servono entrambe nel visual. - Scenario: colonna che devi sommare finita in una dimensione (o attributo testuale nella fact) → riallocala: misure nella fact, attributi descrittivi nelle dimensioni.
- Scenario: qualcuno propone una singola tabella flat “per semplicità” → segnala l’impatto negativo su compressione, dimensione del modello e cardinalità; preferisci lo star schema.