← Torna alla serieSviluppo web da zero Β· 17 / 24

Concetti base dei database relazionali


Il mondo relazionale ha una grammatica precisa, fatta di poche parole: tabelle, righe, colonne, chiavi. Impararle adesso, con calma, significa capire al volo qualsiasi database incontrerai in carriera, perché sotto sotto, sono tutti fatti così.


E naturalmente le impariamo sul registro della Guardia.


πŸ“‹ Tabelle, righe e colonne


Una tabella raccoglie dati dello stesso tipo. Ogni riga Γ¨ un elemento (un guardiano); ogni colonna Γ¨ una sua proprietΓ  (il nome, il ruolo). Ecco il nostro registro, versione relazionale:

TEXT
1guardiani
2β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
3β”‚ id β”‚ nome           β”‚ ruolo           β”‚ castello_id β”‚
4β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
5β”‚ 1  β”‚ Jon Snow       β”‚ lord comandante β”‚ 1           β”‚
6β”‚ 2  β”‚ Samwell Tarly  β”‚ attendente      β”‚ 1           β”‚
7β”‚ 3  β”‚ Eddison Tollet β”‚ recluta         β”‚ 2           β”‚
8β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Somiglia a un foglio di calcolo, ma con una differenza cruciale: ogni colonna ha un tipo dichiarato (id Γ¨ un numero intero, nome Γ¨ testo) e il database rifiuta ciΓ² che non rispetta lo schema. Prova a salvare un guardiano senza nome o con un id testuale: non entra. Sono le "regole" del capitolo scorso, in azione.


Su quella colonna castello_id torniamo tra un attimo: Γ¨ lei la protagonista del capitolo.


πŸ”‘ La chiave primaria


Ogni riga ha bisogno di un'identitΓ  inconfondibile. Due guardiani potrebbero chiamarsi allo stesso modo, ma devono restare distinguibili: per questo ogni tabella ha una chiave primaria (primary key), una colonna il cui valore Γ¨ unico per ogni riga. Quasi sempre Γ¨ un id numerico che il database stesso incrementa a ogni inserimento.


Ti dice niente? È l'id 43 che il server assegnò a Samwell nel capitolo sul CRUD, ed è il 42 degli URL tipo /guardiani/42: le API usano la chiave primaria per indicare quale risorsa. I pezzi, come sempre, si incastrano.


πŸ—οΈ La chiave esterna: come nascono le relazioni


Ora la domanda da un milione di dragoni: come rappresentiamo il fatto che Jon presta servizio al Castello Nero? L'istinto direbbe "aggiungo una colonna col nome del castello". Ma se il castello ha anche una posizione, un comandante, un anno di costruzione? Li copiamo su ogni guardiano? E se il castello cambia comandante, aggiorniamo mille righe?


La soluzione relazionale Γ¨ piΓΉ elegante: i castelli diventano una tabella a sΓ©, e i guardiani li puntano:

TEXT
1castelli
2β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
3β”‚ id β”‚ nome             β”‚ posizione      β”‚
4β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
5β”‚ 1  β”‚ Castello Nero    β”‚ centro         β”‚
6β”‚ 2  β”‚ Forte Orientale  β”‚ costa est      β”‚
7β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Quel castello_id nella tabella guardiani Γ¨ una chiave esterna (foreign key): contiene la chiave primaria di una riga di un'altra tabella. Jon ha castello_id = 1 β†’ riga 1 dei castelli β†’ Castello Nero. Il dato del castello esiste in un posto solo; tutti gli altri lo referenziano.


Ti suona familiare anche questo? È la singola fonte di verità: lo stesso principio che, su scala diversa, la serie su Angular qui sul sito applica allo stato condiviso. Le buone idee, nell'informatica, girano.


πŸ›‘οΈ L'integritΓ  referenziale


E qui il database mostra i muscoli. Dichiarando la chiave esterna, non stai solo documentando la relazione: stai chiedendo al database di difenderla. Si chiama integritΓ  referenziale, e in pratica significa:


  • non puoi assegnare a un guardiano un castello_id che non esiste: il database rifiuta l'inserimento
  • non puoi cancellare il Castello Nero finchΓ© qualcuno ci presta servizio, oppure, se lo hai deciso tu in anticipo, la cancellazione si propaga (i famigerati RESTRICT e CASCADE: blocca, o travolgi tutto a cascata)

Questa Γ¨ la differenza profonda con il file di testo, e anche con molti database a documenti: le relazioni non sono una convenzione che il tuo codice spera venga rispettata: sono un contratto che il database fa rispettare. I riferimenti rotti, semplicemente, non possono esistere.

βœ… Conclusione


Grammatica acquisita: le tabelle con colonne tipizzate, la chiave primaria che dΓ  identitΓ  a ogni riga, la chiave esterna che crea le relazioni e l'integritΓ  referenziale che le difende. Il registro della Guardia ora ha una struttura degna dei suoi ottomila anni di storia.


Manca solo la lingua per parlarci: nel prossimo capitolo impariamo SQL: leggere, inserire, aggiornare e cancellare. E manteniamo una promessa fatta nel capitolo sulla sicurezza: vedrai coi tuoi occhi cos'Γ¨ una SQL injection.

Sviluppatore fullstack a Milano. Scrivo di Angular, ecosistema JavaScript e AI.