Relazione uno a uno in SQL - chiavi, vincoli e casi d’uso

Bruno De luca 8 giugno 2026
Diagramma di database che illustra una relazione uno a uno tra tabelle dipendenti e reparti, con chiavi primarie e esterne.

Indice

Quando due gruppi di informazioni descrivono lo stesso oggetto ma non dovrebbero stare nella stessa tabella, il modello 1:1 può essere la soluzione più ordinata. In questo articolo chiarisco come funziona una relazione uno a uno, come implementarla in SQL, quando conviene usarla e quali vincoli servono per evitare collegamenti duplicati o incoerenti.

La scelta 1:1 separa i dati senza perdere il collegamento

  • Cardinalità 1:1: ogni record della prima tabella può corrispondere a un solo record della seconda.
  • Chiave primaria: identifica in modo univoco il record principale.
  • Vincolo UNIQUE: impedisce che la stessa chiave esterna venga riutilizzata più volte.
  • NULL: permette di rendere facoltativa la presenza del record collegato.
  • Uso ideale: separare dati sensibili, opzionali o raramente consultati.

Che cosa significa davvero una relazione 1:1

In un database relazionale, una relazione 1:1 collega due tabelle in modo che un record da un lato corrisponda al massimo a un record dall’altro. Per esempio, a ogni dipendente può essere associato un solo fascicolo personale e ogni fascicolo appartiene a un solo dipendente.

Il punto importante è quel “al massimo”. La relazione può essere obbligatoria, quando ogni dipendente deve avere un fascicolo, oppure facoltativa, quando il fascicolo viene creato solo per alcuni dipendenti. Questa differenza dipende soprattutto dal fatto che la chiave esterna possa contenere NULL.
Tipo di collegamento Esempio Regola
1:1 obbligatorio Utente e profilo di autenticazione Ogni utente deve avere un profilo
1:1 facoltativo Cliente e dati fiscali aggiuntivi Il cliente può non avere ancora i dati fiscali
1:N Cliente e ordini Un cliente può avere molti ordini
N:N Studenti e corsi Molti studenti possono seguire molti corsi

Spesso si confonde il rapporto 1:1 con un semplice campo aggiuntivo. Io uso questa struttura solo quando esiste una ragione concreta per separare i dati, non per moltiplicare le tabelle senza necessità.

Come si costruisce in SQL

Il metodo più comune consiste nel creare una tabella principale e una tabella dipendente. La seconda contiene una chiave esterna che, allo stesso tempo, deve essere univoca. Senza questo vincolo, il database potrebbe accettare più righe dipendenti per lo stesso record principale e trasformare di fatto il rapporto in una relazione 1:N.

CREATE TABLE utenti (
    id INT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL UNIQUE
);

CREATE TABLE profili_privati (
    utente_id INT PRIMARY KEY,
    codice_fiscale VARCHAR(16),
    data_nascita DATE,
    FOREIGN KEY (utente_id) REFERENCES utenti(id)
);

In questo esempio utente_id è sia chiave primaria sia chiave esterna. Non può comparire due volte nella tabella dei profili e deve riferirsi a un utente esistente. È una soluzione molto pulita perché la tabella dipendente usa lo stesso identificativo della tabella principale.

Un’alternativa consiste nell’usare un identificativo separato e aggiungere un vincolo UNIQUE:

CREATE TABLE documenti_identita (
    id INT PRIMARY KEY,
    utente_id INT NOT NULL UNIQUE,
    numero_documento VARCHAR(30) NOT NULL,
    FOREIGN KEY (utente_id) REFERENCES utenti(id)
);

Questa variante è utile quando il record dipendente ha una propria identità tecnica o potrebbe evolvere in una struttura più autonoma. Nella pratica, però, la chiave condivisa riduce il rischio di errori e rende più immediata la lettura del modello.

Quando conviene separare le tabelle

La separazione ha senso quando le informazioni hanno frequenze di utilizzo diverse. Un’applicazione può leggere il nome e l’email a ogni accesso, ma consultare i dati fiscali solo durante la fatturazione. Tenere tutto insieme significa caricare colonne inutili in molte query.

Dati sensibili o soggetti a permessi diversi

Una tabella separata permette di applicare più facilmente autorizzazioni specifiche. I dati pubblici dell’utente possono essere accessibili a molti servizi, mentre quelli personali restano disponibili solo a ruoli autorizzati.

Attributi opzionali

Se una parte del profilo viene compilata solo in alcuni casi, separarla evita numerose colonne vuote. Questo non rende automaticamente il database più veloce, ma può migliorare la chiarezza del modello e la gestione dei dati.

Leggi anche: Operatori logici SQL - AND, OR, NOT e NULL senza errori

Moduli indipendenti

Un gestionale può avere una tabella base per l’anagrafica e tabelle aggiuntive per dipendenti, fornitori o clienti. Il collegamento 1:1 consente di estendere il modello senza gonfiare la tabella principale, soprattutto quando i moduli vengono sviluppati o gestiti separatamente.

Non lo userei, invece, per dividere una tabella solo perché contiene molte colonne. Se i dati vengono sempre letti e aggiornati insieme, la separazione può aggiungere JOIN, complessità e punti di errore senza un beneficio reale.

Relazione obbligatoria o facoltativa

La scelta si traduce in SQL attraverso due vincoli semplici. Una chiave esterna definita come NOT NULL rende obbligatorio il collegamento; se invece ammette NULL, il record principale può esistere senza una riga nella tabella dipendente.

CREATE TABLE preferenze_utente (
    utente_id INT PRIMARY KEY,
    lingua VARCHAR(10) NOT NULL,
    FOREIGN KEY (utente_id) REFERENCES utenti(id)
);

Qui ogni riga rappresenta necessariamente un utente esistente. Tuttavia, il vincolo non obbliga ogni utente ad avere una riga in preferenze_utente. Il database impedisce un riferimento senza padre, ma non può sempre imporre automaticamente che ogni padre abbia un figlio.

Se il requisito aziendale è “ogni utente deve avere un profilo”, occorre gestire la creazione nella stessa transazione dell’utente oppure introdurre controlli applicativi e procedure di verifica. Questa è una distinzione che spesso sfugge nei diagrammi, ma diventa decisiva quando arrivano importazioni massive o integrazioni tra sistemi.

Gli errori che trasformano un 1:1 in un 1:N

L’errore più frequente è dimenticare PRIMARY KEY o UNIQUE sulla chiave esterna. Una semplice FOREIGN KEY garantisce che il valore esista nella tabella principale, ma non impedisce di usarlo in più righe.

  • Usare una chiave esterna senza vincolo di unicità.
  • Permettere duplicati durante un’importazione.
  • Confondere “un record collegato al massimo” con “ogni record deve avere un collegamento”.
  • Usare email o altri dati modificabili come identificativi principali.
  • Non definire cosa accade quando il record principale viene eliminato.

Per la cancellazione, la scelta dipende dal significato dei dati. ON DELETE CASCADE può essere appropriato per un profilo tecnico che non ha senso senza l’utente; per dati fiscali o documentali può essere più prudente bloccare la cancellazione o conservarli secondo le regole aziendali.

Prima di mettere il modello in produzione, controllo sempre tre casi. Inserisco un figlio senza padre, provo a inserire due figli per lo stesso padre e verifico cosa succede alla cancellazione del record principale. Questi test rivelano rapidamente se il database sta davvero applicando la cardinalità prevista.

Come scegliere tra 1:1, 1:N e una sola tabella

La decisione non riguarda solo la forma del diagramma. Incide su query, manutenzione, permessi e qualità dei dati. La mia regola pratica è partire dal significato del dominio e solo dopo scegliere la struttura tecnica.

Situazione Struttura consigliata Motivo
Gli attributi esistono sempre e vengono usati insieme Una sola tabella Riduce JOIN e complessità
Gli attributi sono separati per sicurezza o ciclo di vita Relazione 1:1 Isola dati e responsabilità
Un’entità può avere più elementi collegati Relazione 1:N La chiave esterna può ripetersi
Entrambe le entità possono avere più corrispondenze Relazione N:N Serve una tabella ponte

Dal punto di vista delle prestazioni, un JOIN tra due tabelle ben indicizzate non è automaticamente un problema. Il vero rischio è costruire una frammentazione artificiale che costringe ogni report o dashboard a ricomporre continuamente dati che appartengono allo stesso concetto.

Per analisi e business intelligence considero anche il livello di aggregazione. Un modello 1:1 può essere ottimo nel database operativo, mentre nel data warehouse potrebbe essere più pratico consolidare gli attributi in una dimensione unica, se questo semplifica le letture e non crea duplicazioni.

La verifica finale prima di adottare il modello

Prima di confermare la struttura, scrivo in una frase la regola del dominio: “un dipendente può avere un solo fascicolo” oppure “ogni cliente può avere al massimo un profilo fiscale”. Se la frase non è sempre vera, probabilmente il rapporto corretto è un altro.

Controllo poi unicità, obbligatorietà, cancellazione e frequenza d’uso. Sono questi quattro elementi, più del nome della relazione, a determinare se il modello sarà affidabile nel tempo.

Una buona progettazione non consiste nell’usare più tabelle possibile. Consiste nel rappresentare con precisione le regole reali, lasciando al database il compito di bloccare gli errori prima che arrivino nei report, nelle dashboard e nei processi decisionali.

Domande frequenti

La tabella dipendente deve usare una chiave esterna univoca. Si può fare rendendo la chiave esterna anche PRIMARY KEY, oppure usando un identificativo separato con un vincolo UNIQUE sulla chiave esterna. La sola FOREIGN KEY non basta, perché consentirebbe più righe dipendenti per lo stesso record.

Una chiave esterna con NOT NULL rende obbligatorio il riferimento quando esiste una riga nella tabella dipendente; ammettendo NULL, il collegamento può essere facoltativo. Tuttavia, NOT NULL non obbliga ogni record principale ad avere una riga dipendente: per imporre questa regola servono la stessa transazione, controlli applicativi o procedure di verifica.

La separazione è utile per dati sensibili, opzionali o consultati raramente, oltre che quando le tabelle hanno permessi, cicli di vita o moduli applicativi diversi. Se gli attributi vengono sempre letti e aggiornati insieme, una sola tabella può ridurre JOIN e complessità.

Occorre provare a inserire un record dipendente senza padre, inserire due dipendenti per lo stesso padre e verificare la cancellazione del record principale. ON DELETE CASCADE può essere adatto a un profilo tecnico, mentre per dati fiscali o documentali può essere preferibile bloccare la cancellazione o conservarli secondo le regole aziendali.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

sql
chiavi esterne
cardinalità
integrità referenziale
vincoli di unicità
Autor Bruno De luca
Bruno De luca
Mi chiamo Bruno De Luca e da 9 anni mi dedico con passione all'analisi dei dati, alla Business Intelligence e alla Data Science. Quello che mi affascina di questo campo è la capacità di trasformare numeri grezzi in storie comprensibili, aiutando a prendere decisioni più informate e strategiche. Sul sito mondobi.it, il mio obiettivo è condividere conoscenze, semplificare concetti complessi e offrire prospettive aggiornate, basandomi su un approccio rigoroso di verifica delle fonti e organizzazione delle informazioni. Cerco sempre di rendere i contenuti accessibili e utili, per chiunque voglia navigare nel mondo dei dati con maggiore consapevolezza.

Condividi post

Scrivi un commento