Progettare una table in Dataverse
In Microsoft Dataverse una table (ex “entity”) rappresenta un insieme di record con uno schema condiviso. Prima di creare colonne, la scelta architetturalmente più importante è il tipo di ownership, perché determina il modello di sicurezza applicabile.
- User or team owned: ogni record ha un proprietario (utente o team). Abilita la sicurezza granulare basata su business unit, security role con livelli di accesso (User, Business Unit, Parent-Child, Organization) e la condivisione (sharing) record-per-record. È la scelta corretta quando i dati sono “posseduti” da qualcuno e la visibilità deve variare per utente (es. Account, Case, Opportunity).
- Organization owned: i record appartengono all’organizzazione, non a un utente. La sicurezza è solo a livello di privilegio (leggere/scrivere sì/no), senza livelli per record. Adatta a dati di riferimento condivisi da tutti (es. tabelle di lookup di configurazione, listini).
L’ownership si sceglie alla creazione e non è più modificabile: è forse la decisione più vincolante del data modeling.
Primary column e primary key
Ogni table ha una primary column di tipo text (il “primary name”) usata come etichetta nei lookup, nelle griglie e nei risultati di ricerca. Non è la chiave: la vera chiave è la primary key (una GUID generata automaticamente). La primary column dovrebbe contenere un valore descrittivo e leggibile; anch’essa va impostata bene alla creazione perché il tipo non è modificabile in seguito.
Principali tipi di colonna
- Text: single line o multi-line; formati come Email, Phone, URL, Ticker abilitano validazione e rendering dedicati nei form.
- Choice: set di opzioni con label + valore numerico. Da distinguere choice locale vs global choice (vedi sotto).
- Lookup: crea una relazione N:1 verso un’altra table; il valore mostrato è la primary column della table referenziata. È il modo corretto per collegare record, non duplicare testo.
- Currency: memorizza un importo più il collegamento alla transaction currency; Dataverse aggiunge automaticamente la colonna “_Base” con la conversione nella base currency dell’ambiente tramite l’exchange rate.
- File / Image: archiviano binari (documenti, foto). Utili per allegati strutturati; hanno impatto su storage e limiti di dimensione.
- Autonumber: genera identificativi sequenziali con prefisso/pattern (es.
CASE-{SEQNUM:5}), ideale per numeri progressivi human-readable. - Rollup: aggrega dati da record correlati (es. somma dei valori delle Opportunity di un Account). Si ricalcolano in modo asincrono tramite un system job schedulato (di default ogni ora), non in tempo reale.
Choice locale vs global choice
Una choice locale vive solo dentro la colonna in cui è definita; una global choice è un set condiviso, riutilizzabile su più colonne e table.
Scegli global choice quando:
- lo stesso insieme di valori serve in più punti (coerenza e manutenzione centralizzata);
- l’integrazione esterna o Power Automate deve mappare valori stabili e riconoscibili.
Scegli choice locale quando i valori sono specifici di un solo contesto e non hai motivo di condividerli. Attenzione: una choice locale non è “promuovibile” a global dopo la creazione, quindi in caso di dubbio conviene partire global. Sui form entrambe rendono un dropdown identico; la differenza è di governance dello schema, non di UX.
Impatto su form e integrazione
Il tipo di colonna condiziona il controllo mostrato nei model-driven form (lookup dialog, currency con selettore valuta, choice come dropdown) e come i dati vengono esposti via Dataverse Web API e nei connettori di Power Automate. Colonne calcolate come rollup e i calculated column non sono scrivibili dagli utenti, quindi non vanno posizionate come campi editabili.
Trappole tipiche d’esame
- Scenario: dopo aver popolato dati chiedono di cambiare l’ownership di una table da user a organization → risposta: non è possibile, l’ownership è immutabile dopo la creazione; occorre ricreare la table e migrare i dati.
- Scenario: serve modificare il data type di una colonna esistente (es. da text a lookup) → risposta: il tipo di dato non è modificabile; va creata una nuova colonna.
- Scenario: gli stessi valori di stato servono su cinque table → risposta: usa una global choice, non cinque choice locali duplicate.
- Scenario: il totale aggregato di una rollup column non si aggiorna subito → risposta: è normale, il ricalcolo è asincrono via system job; per un valore immediato serve un calculated column o logica real-time.
- Scenario: chiedono un identificativo progressivo leggibile per i record → risposta: colonna Autonumber, non un semplice text con incremento manuale.