KEPLIN Docs

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.

Il modello dell'app Gestione Clienti: le entità Contas, Contactos e Oportunidades, con le due relazioni disegnate fra loro.
Il modello dell'app Gestione Clienti: le entità Contas, Contactos e Oportunidades, con le due relazioni disegnate fra loro.

Una relazione ha sempre due lati:

  • Il lato figlio (child), che conserva il riferimento — la colonna conta_id della tabella contactos.
  • Il lato padre (parent), che è referenziato — la colonna id della tabella contas.

Creare una relazione

Le relazioni si disegnano nel diagramma, collegando un campo a un altro:

  1. Passa il mouse sul campo del lato figlio — la riga risponde con il suggerimento Trascina su un campo di un'altra tabella per collegare.
  2. Trascina da quel campo fino al campo del lato padre (tipicamente la chiave primaria dell'altra entità) e lascia.
  3. 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.
  4. 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.

L'entità Contactos con la sezione Navigazione: il navigator conta porta al record dell'account a cui il contatto appartiene.
L'entità Contactos con la sezione Navigazione: il navigator conta porta al record dell'account a cui il contatto appartiene.

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'id dell'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:

  1. Nella finestra Nuova tabella (o in Modifica struttura), seleziona la colonna.
  2. In Tipo, scegli enum.
  3. Appare il riquadro Elementi dell'enum. Clicca su Aggiungi elemento per ogni valore.
  4. 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).

Una colonna di tipo enum apre gli Elementi dell'enum — ogni elemento con valore, etichetta e colore.
Una colonna di tipo enum apre gli Elementi dell'enum — ogni elemento con valore, etichetta e colore.

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ù.

Il tipo `enum` nell'elenco dei tipi di colonna, accanto ai tipi normali.
Il tipo `enum` nell'elenco dei tipi di colonna, accanto ai tipi normali.

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.