Il modello dati di Dataverse
In Microsoft Dataverse ogni table (ex “entity”) è composta da columns (ex “field”) tipizzate. La scelta del tipo di colonna non è cosmetica: determina come il dato viene memorizzato, indicizzato e recuperato, con impatti diretti su prestazioni e comportamento in fase di sviluppo con plugin, Power Fx o API. Come developer PL-400 devi saper motivare perché un tipo è preferibile in un dato scenario, non solo saperlo creare.
Tipi di colonna e loro proprietà
Choice
Una choice (option set) memorizza un intero mappato a un’etichetta localizzabile. Puoi definirla locale (usata da una sola tabella) o globale (una global choice riutilizzabile in più tabelle): scegli quella globale quando lo stesso set di valori va condiviso, per evitare duplicazioni e disallineamenti. Esiste anche la variante choices (multi-select). Le choice sono performanti perché filtrano su interi; evita però di trasformare in choice ciò che è di fatto un dato di lookup a un’altra tabella.
Lookup
Una lookup implementa una relazione N:1 verso un’altra table e memorizza il GUID del record correlato. Le lookup polimorfiche (Customer, Owner, Regarding) puntano a più tipi di tabella. Attenzione alle prestazioni: molte lookup su una tabella “calda” aumentano i join in retrieve; recupera solo le lookup necessarie con $select.
Formula e Rollup
- Formula column (Power Fx): calcolata in tempo reale, sincrona, valutata alla lettura/salvataggio. Ideale per concatenazioni, condizioni e calcoli sul record stesso o sul suo parent. Non aggrega record figli.
- Rollup column: aggrega record correlati (SUM, COUNT, AVG, MIN, MAX) su una relazione 1:N o su una gerarchia. È calcolata da un system job asincrono (ricalcolo pianificato, per default ogni ora), quindi il valore non è immediato: puoi forzarlo con il pulsante di refresh o il messaggio
CalculateRollupField. Non può referenziare altre rollup né formula complesse e la gerarchia è limitata in profondità.
File e Image
Le colonne file e image memorizzano il blob nello storage di tipo File, non nel database relazionale. Riducono il consumo di Database capacity ma il contenuto non va recuperato di default: caricalo con chiamate dedicate solo quando serve, per non appesantire le query.
Alternate keys
Una alternate key definisce un identificatore alternativo al GUID basato su una o più colonne che, insieme, garantiscono l’unicità di un record. Serve principalmente in due scenari:
- Operazioni Upsert: con
Upsertfornisci la chiave di business (es.SKU,EmployeeCode) e Dataverse decide da solo se inserire o aggiornare, senza che tu conosca il GUID. - Integrazioni: correli record provenienti da sistemi esterni usando la loro chiave esterna, evitando lookup preliminari per risolvere il GUID.
La creazione della chiave avviene tramite un system job asincrono che costruisce l’indice: finché l’indice non è pronto, la chiave non è attiva. Solo alcuni tipi di colonna sono ammessi (whole number, decimal, single line of text, datetime, lookup, choice); non sono supportati multi-line text, currency e floating point.
// Upsert via chiave alternativa (SDK)
var acc = new Entity("account", "accountnumber", "ACC-001");
acc["name"] = "Contoso";
service.Execute(new UpsertRequest { Target = acc });
Trappole tipiche d’esame
- Scenario: serve il valore aggiornato in tempo reale del totale di ordini figli su un account. → Risposta: una rollup NON va bene (è asincrona, ricalcolata a intervalli); se ti serve immediatezza usa un calcolo custom in plugin/real-time, non aspettarti valori istantanei dalla rollup.
- Scenario: calcolo che dipende solo dai campi dello stesso record o del parent, richiesto subito. → Risposta: usa una formula column (sincrona), non una rollup.
- Scenario: un sistema esterno invia record con un codice prodotto e devi evitare duplicati senza conoscere il GUID. → Risposta: crea una alternate key su quel codice e usa Upsert.
- Scenario: vuoi una alternate key su una colonna multi-line text o currency. → Risposta: non è possibile; solo tipi supportati (text a riga singola, interi, decimal, datetime, lookup, choice), max 5 alternate key per tabella.
- Scenario: lo stesso set di valori serve in più tabelle. → Risposta: definisci una global choice riutilizzabile, non tante choice locali duplicate.