Relazioni ed enum
Collegare le tabelle fra loro — cardinalità, navigator, relazioni fisiche e virtuali — e chiudere l'insieme di valori di un campo con un enum.
Una tabella da sola conserva un elenco. Un'applicazione ha bisogno di più: che i contatti sappiano a quale account appartengono, che le opportunità sappiano di chi sono, che un campo stato accetti solo gli stati che esistono.
Sono i due pezzi di questa pagina: le relazioni, che collegano le entità fra loro, e gli enum, che chiudono l'insieme dei valori possibili di un campo.
Le relazioni
Nel diagramma del modello, ogni relazione è una linea fra due entità, con
un'etichetta che dice il nome del percorso e la cardinalità — in Gestione Clienti,
conta · 1:N fra Contas e Contactos, e un'altra uguale fra Contas
e Oportunidades.

Una relazione ha sempre due lati:
- Il lato figlio (child), che conserva il riferimento — la colonna
conta_iddella tabellacontactos. - Il lato padre (parent), che è referenziato — la colonna
iddella tabellacontas.
Creare una relazione
Le relazioni si disegnano nel diagramma, collegando un campo a un altro:
- Passa il mouse sul campo del lato figlio — la riga risponde con il suggerimento Trascina su un campo di un'altra tabella per collegare.
- Trascina da quel campo fino al campo del lato padre (tipicamente la chiave primaria dell'altra entità) e lascia.
- Si apre la finestra Nuova relazione, già con le due entità e le due colonne compilate — sono arrivate dal trascinamento e lì non si modificano.
- Compila il resto (qui sotto) e conferma con Crea relazione.
La cardinalità
Il primo campo della finestra è la Cardinalità — quanti per ogni lato:
| Opzione | Quando si usa |
|---|---|
| Uno a molti (1:N) | Un account ha diversi contatti. È il caso più comune. |
| Molti a uno (N:1) | Lo stesso, visto dall'altro lato. |
| Uno a uno (1:1) | Un record per un record — un account e la sua scheda fiscale. |
| Molti a molti (N:N) | Molti a molti — etichette sugli account, formatori nei corsi. Richiede una tabella di giunzione. |
A seconda della scelta, la finestra mostra Child (ha la FK) e Parent (referenziata) — oppure, nel caso N:N, Entità A ed Entità B.
I navigator
I due campi successivi sono i navigator — il cuore della relazione, e ciò che la rende utile fuori dal diagramma.
Un navigator è un campo virtuale che non esiste nel database: serve a saltare da un record ai record collegati e a portare le colonne dell'altro lato nelle API. Sono loro a far sì che una query sui contatti restituisca, insieme a ogni contatto, il nome dell'account a cui appartiene — senza una seconda query e senza codice.
- Navigator su Contactos → Contas — il percorso dal figlio al padre. Un
nome al singolare:
conta. - Navigator su Contas → [Contactos] — il percorso dal padre ai figli. Un
nome al plurale:
contactos. Le parentesi quadre nell'etichetta dicono che questo lato restituisce un elenco.
Lasciare uno dei campi vuoto è una decisione legittima: quel lato semplicemente non viene esposto. Se nessuno ha bisogno di andare da un account ai suoi contatti, non crei il percorso.
Nella card dell'entità, i navigator appaiono nella sezione Navigazione, con il nome a sinistra e la destinazione a destra — fra parentesi quadre quando è un elenco.

Dica
Tratta i nomi dei navigator come parte della lingua dell'app: conta,
contactos, linhas, responsavel. Sono quelli che leggerai nelle API, nei
datastore delle schermate e nel codice degli eventi — e un fk_ct_2 scelto male
oggi è confusione per sempre.
Fisica o virtuale
Il campo Tipo di relazione decide se la relazione viene scritta anche nel database:
| Opzione | Che cosa fa |
|---|---|
| Virtuale — solo nel modello della piattaforma | La relazione esiste per la piattaforma: navigator, API, schermate. Il database non viene toccato. |
| Fisica — crea la FK nel database | Oltre al modello, viene creata la chiave esterna nel motore: è il motore stesso a rifiutare un conta_id che non esiste. |
La relazione fisica è più sicura — l'integrità smette di dipendere da chi scrive. La virtuale è ciò che resta quando non si può (o non si vuole) toccare lo schema del database: database di terze parti, tabelle condivise con altri sistemi, dati storici che non passerebbero la verifica.
Quando si elimina il padre
Quando si elimina il padre (ON DELETE) dice che cosa succede ai figli quando il record padre viene eliminato:
| Opzione | Che cosa succede |
|---|---|
| Niente (blocca se ci sono figli) | L'eliminazione fallisce finché ci sono figli. |
| Restrict — blocca immediatamente | Lo stesso, verificato subito. |
| Cascade — elimina i figli | Eliminare l'account elimina i suoi contatti e le sue opportunità. |
| Set NULL — stacca i figli | I figli restano senza padre (la colonna diventa vuota). Richiede che la colonna accetti il vuoto. |
In una relazione fisica, questa regola è applicata dal motore. In una relazione virtuale, resta salvata nel modello e diventa valida se un giorno la relazione verrà materializzata.
Atenção
Cascade è comodo ed è irreversibile: eliminare un account si porta via contatti, opportunità e tutto ciò che è appeso. Nei dati di business, l'abitudine è preferire Niente e trattare l'eliminazione come un processo — si elimina solo ciò che non ha più nulla che dipenda da esso.
Molti-a-molti
Con Molti a molti (N:N) la finestra chiede altre tre cose, perché una relazione di questo tipo ha bisogno di una tabella in mezzo (la Tabella di giunzione), con un riferimento per ogni lato:
| Campo | Che cos'è |
|---|---|
| Tabella di giunzione | La tabella che collega le due — per esempio conta_etiqueta. |
| Colonna → A (child) | La colonna della giunzione che punta alla prima entità. |
| Colonna → B (parent) | La colonna della giunzione che punta alla seconda. |
La tabella di giunzione deve esistere prima: creala come qualsiasi altra (vedi Tabelle e campi).
Relazioni che arrivano già fatte
Importando una tabella nel modello, le chiavi esterne che esistono già nel database entrano da sole come relazioni, con i navigator proposti a partire dai nomi delle tabelle. È così che Gestione Clienti è nata con le sue due relazioni — basta solo verificare se i nomi dei navigator sono quelli che vuoi leggere nel resto dell'app.
Rimuovere una relazione
Clicca sulla linea della relazione nel diagramma e conferma. La domanda è esplicita: Rimuovere questa relazione dal modello? — e anche la risposta: la relazione esce dal modello della piattaforma e una FK fisica già creata nel database NON viene rimossa. Se volevi davvero disfare la chiave esterna nel motore, quello si fa nel database.
A che cosa servono, poi
Fatta la relazione, appare ovunque:
- Nelle API, come campi annidati: una query sui contatti può
restituire
conta { nome, cidade }. - Nei datastore delle schermate, per montare un master-dettaglio — la tabella dei
contatti filtrata per l'
iddell'account caricato (vedi Datastore e dati). - Nell'integrità dei dati, quando la relazione è fisica.
Gli enum
Un enum è un insieme chiuso di valori per un campo: lo stato di un
account è Attivo, Sospeso o Perso, e nient'altro. Invece di lasciare che il
campo accetti testo libero — e finire con "attiva", "Attiva", "ATTIVA" e
"attivo" nella stessa colonna — si dichiara l'insieme una volta sola.
Creare un enum
L'enum nasce nella colonna, nel momento in cui le dai il tipo:
- Nella finestra Nuova tabella (o in Modifica struttura), seleziona la colonna.
- In Tipo, scegli
enum. - Appare il riquadro Elementi dell'enum. Clicca su Aggiungi elemento per ogni valore.
- Compila le tre colonne di ogni elemento:
| Colonna | Che cos'è |
|---|---|
| Valore | Il valore salvato. Lettere, cifre e _, con iniziale una lettera — per convenzione in maiuscolo: ATIVO, EM_ANALISE. |
| Etichetta | Il testo che le persone vedono: Attivo, In analisi. |
| Colore | Un colore opzionale, usato dai widget che colorano gli stati (il Kanban, le regole di formattazione). |

Ogni colonna enumerata ha il suo enum, e il suo nome deriva dalla tabella e
dalla colonna — la colonna tipo della tabella actividades dà l'enum
ActividadesTipo.
Nota
Nel database, una colonna enum è salvata in un campo strutturato — è il riquadro stesso ad avvisare: Nel DB resta un campo JSON (1 o N valori). È questo che permette allo stesso campo di servire per una scelta singola oggi e per una scelta multipla domani, senza cambiare lo schema.
Modificare un enum
Riapri Modifica struttura sulla tabella, seleziona la colonna e tocca gli Elementi dell'enum: aggiungere, cambiare l'etichetta, cambiare il colore, rimuovere con la ×. Conferma con Applica modifiche.
Cambiare l'etichetta o il colore è sicuro — sono solo presentazione. Cambiare o rimuovere un valore non lo è: i record che avevano già il valore vecchio restano con un valore che l'enum non conosce più.

Dove appaiono gli enum
Un campo enumerato smette di essere testo libero in tutta la piattaforma:
| Dove | Che cosa cambia |
|---|---|
| Nel diagramma | Il campo appare in corsivo, con il nome dell'enum al posto del tipo. |
| Nelle API | Il campo assume un tipo a valori fissi, e l'API rifiuta qualsiasi valore fuori dall'elenco. |
| Nel widget Dropdown | In Origine delle opzioni, si sceglie Enum del modello e poi il Campo enum — le opzioni e le etichette vengono dal modello, e non ci sono elenchi da mantenere in due posti. |
| Nel Kanban | In Origine delle colonne, l'opzione Enum crea una colonna per ogni valore dell'enum, già con i colori. |
| Nelle regole di formattazione | Le condizioni confrontano con i valori dell'enum. |
Dica
Ogni volta che un campo ha un insieme noto di valori — stato, tipo, priorità, canale — fanne un enum invece di una casella di testo. Guadagni le etichette traducibili, i colori, i filtri giusti e un Kanban gratis.
Perché no…?
- Perché non riesco a trascinare da un campo all'altro? Il trascinamento comincia sulla riga del campo del lato figlio e finisce sulla riga del campo del lato padre. Se stai trascinando la card intera, la stai spostando nel diagramma — afferra la riga del campo.
- Perché l'API non restituisce i dati della tabella collegata? Manca il navigator di quel lato. Un navigator vuoto è un lato che non è stato esposto di proposito — ricrea la relazione con il nome compilato.
- Perché è fallita la creazione della relazione fisica? Una chiave esterna viene accettata solo se i dati già esistenti la rispettano. Se ci sono figli che puntano a padri che non esistono, il motore rifiuta — pulisci prima gli orfani, oppure crea la relazione come virtuale.
- Perché continuo a vedere la relazione dopo averla rimossa? L'hai rimossa dal modello; la chiave esterna nel database è ancora lì ed è lei che la reimportazione riporta.
- Perché il mio campo enum mostra il valore invece dell'etichetta? Il widget non è collegato all'enum del modello — invece di un elenco fisso, scegli Enum del modello e indica il Campo enum.