Relazione uno a uno nei database - come funziona e quando usarla

Emilio Santoro 14 giugno 2026
Schema di un sistema di database (DBS) con più database (DB 1, DB 2, DB 3) e un sistema di gestione database (DBMS) che stabilisce una relazione univoca.

Indice

Quando due informazioni devono restare collegate senza generare duplicati, la progettazione della base dati diventa decisiva. La relazione univoca, più correttamente chiamata relazione uno a uno, permette di associare ogni record a un solo record corrispondente e aiuta a gestire dati separati, sensibili o opzionali. Vediamo come riconoscerla, implementarla con chiavi e vincoli SQL, rappresentarla nei formati dati e capire quando conviene davvero usarla.

La regola essenziale per collegare due tabelle senza ambiguità

  • Cardinalità 1:1 significa che ogni record di una tabella può avere al massimo un corrispondente nell’altra.
  • La relazione si applica davvero solo con una chiave esterna accompagnata da un vincolo UNIQUE.
  • Una relazione 0:1 ammette un collegamento facoltativo, mentre una relazione 1:1 lo rende obbligatorio almeno da un lato.
  • La separazione in due tabelle è utile per dati sensibili, opzionali o raramente consultati.
  • Nei dati JSON la stessa struttura può apparire come un oggetto annidato, ma il database deve comunque proteggere l’unicità.

Diagramma ERD e-commerce con tabelle Customer, Order, Products, Categories e Delivery. La relazione univoca tra Customer e Order è evidenziata.

Che cosa significa davvero una relazione uno a uno

In un database relazionale, una relazione uno a uno collega due entità in modo che a ogni istanza della prima corrisponda un solo elemento della seconda, e viceversa. Un esempio semplice è quello tra una persona e il relativo documento d’identità, ammesso che il modello aziendale stabilisca che ogni persona possa avere un solo documento registrato.

La parola “univoca” può però creare confusione. In senso matematico, una funzione univoca può indicare che a ogni elemento di partenza corrisponde un solo elemento di arrivo, senza dire che il percorso inverso sia altrettanto esclusivo. Nel database, quando si parla di associazione uno a uno, di solito si intende un vincolo più forte, con unicità in entrambe le direzioni.

La cardinalità va distinta dalla partecipazione. Una coppia 1:1 richiede la presenza di entrambi i record; una coppia 0:1 permette invece che il record collegato non esista ancora. Questa differenza è piccola sulla carta, ma cambia completamente il comportamento di inserimenti, aggiornamenti e report.

Un esempio concreto

Immaginiamo le tabelle Dipendenti e Badge. Se ogni dipendente può avere un solo badge e ogni badge appartiene a un solo dipendente, l’associazione è uno a uno. Se invece alcuni dipendenti lavorano da remoto e non possiedono alcun badge, il modello corretto diventa Dipendente 0:1 Badge.

Io uso spesso questa distinzione già nella fase concettuale, prima di scrivere SQL. Chiedersi “può esistere il record da solo?” evita molti errori successivi e impedisce di trasformare un dato facoltativo in un obbligo artificiale.

Come si distingue da una relazione uno a molti

La differenza principale non riguarda il numero di tabelle, ma il numero di record che possono condividere lo stesso collegamento. In una relazione uno a molti, un cliente può avere molti ordini; in una relazione uno a uno, ogni cliente può avere un solo profilo esteso.

Tipo di relazione Esempio Regola principale
Uno a uno Utente e profilo privacy Un utente ha al massimo un profilo e ogni profilo appartiene a un solo utente
Uno a molti Cliente e ordini Un cliente può avere molti ordini, ma ogni ordine appartiene a un cliente
Molti a molti Articoli e categorie Molti articoli possono appartenere a molte categorie, tramite una tabella ponte

Un errore frequente consiste nel chiamare uno a uno una relazione che è soltanto uno a molti con pochi dati presenti. Se oggi un cliente ha un ordine, non significa che il modello debba vietare un secondo ordine domani. La cardinalità deve descrivere la regola del dominio, non lo stato momentaneo della tabella.

Quando la relazione è realmente uno a uno, spesso vale la pena chiedersi se servano due tabelle. Se i campi sono sempre consultati insieme e hanno la stessa durata, un’unica tabella può essere più semplice. La separazione ha senso soprattutto quando esistono permessi diversi, dati opzionali o cicli di vita distinti.

Come implementarla in SQL senza lasciare varchi

Il collegamento più comune usa una chiave esterna, cioè una colonna che contiene l’identificativo di un record presente in un’altra tabella. Da sola, però, la chiave esterna non garantisce l’unicità. Per impedire che più righe puntino allo stesso record serve anche il vincolo UNIQUE.

CREATE TABLE utenti (
    id INTEGER PRIMARY KEY,
    email VARCHAR(อด) NOT NULL UNIQUE
);

CREATE TABLE profili_privacy (
    utente_id INTEGER PRIMARY KEY,
    consenso_marketing BOOLEAN NOT NULL DEFAULT FALSE,
    data_aggiornamento DATE,
    CONSTRAINT fk_profilo_utente
        FOREIGN KEY (utente_id)
        REFERENCES utenti(id)
);

In questo esempio utente_id è contemporaneamente chiave primaria e chiave esterna. Non può comparire due volte nella tabella dei profili e non può riferirsi a un utente inesistente. È una soluzione molto pulita quando ogni profilo dipende completamente dal proprio utente.

Un’alternativa consiste nel dare alla tabella secondaria una chiave propria e aggiungere un vincolo univoco sulla chiave esterna.

CREATE TABLE badge (
    id INTEGER PRIMARY KEY,
    dipendente_id INTEGER NOT NULL UNIQUE,
    codice VARCHAR(50) NOT NULL UNIQUE,
    FOREIGN KEY (dipendente_id)
        REFERENCES dipendenti(id)
);

Questa struttura è utile quando il record collegato deve avere una propria identità tecnica, per esempio perché viene tracciato in sistemi esterni. In entrambi i casi, il punto decisivo è lo stesso: la chiave esterna collega, UNIQUE limita a uno.

Obbligatorietà e valori NULL

Se il collegamento è obbligatorio, la chiave esterna deve essere definita con NOT NULL. Se è facoltativo, può restare vuota, ma bisogna controllare come il proprio DBMS gestisce più valori NULL all’interno di un indice univoco.

Il comportamento dei valori mancanti non è identico in tutti i sistemi. Per questo, prima di andare in produzione, io provo sempre almeno tre casi: inserimento senza collegamento, inserimento di un secondo collegamento e cancellazione del record principale. Sono test brevi, ma rivelano subito se il modello rispetta davvero la regola aziendale.

Quando conviene separare i dati in due tabelle

La relazione uno a uno non è automaticamente migliore di una tabella unica. La scelta diventa interessante quando i dati hanno frequenza di accesso, riservatezza o disponibilità diverse.

Dati sensibili

Un account applicativo può essere separato dai dati personali dell’utente. La tabella principale contiene identificativi e informazioni operative, mentre una tabella secondaria conserva indirizzo, telefono o preferenze di contatto. In questo modo si possono applicare permessi più restrittivi senza complicare ogni query dell’applicazione.

Dati opzionali

Un e-commerce potrebbe avere una tabella clienti e una tabella dati_fiscali. Non tutti i clienti richiedono fattura, quindi la seconda tabella può esistere soltanto quando serve. Questo evita una grande quantità di colonne vuote nella tabella principale e rende più chiaro il significato dei dati.

Leggi anche: Database Excel da scaricare - struttura, formule e report

Dati consultati raramente

In un sistema di analisi, la tabella degli eventi principali può essere separata dai metadati tecnici o dai dettagli di audit. La tabella più usata resta più compatta e le informazioni meno frequenti vengono lette solo quando richieste. Il vantaggio dipende però dal carico di lavoro, perché ogni separazione introduce almeno un JOIN aggiuntivo.

Per le dashboard BI, questo aspetto conta più della teoria. Se ogni report deve unire sempre le stesse due tabelle, una struttura separata può aumentare la complessità senza offrire benefici reali. Se invece i dati hanno livelli di accesso differenti, la divisione può migliorare sicurezza e manutenzione.

Come appare nei formati JSON e negli scambi dati

La stessa relazione può essere rappresentata in modi diversi a seconda del formato. Nel modello relazionale resta distribuita tra tabelle; in JSON, invece, il profilo può essere inserito direttamente dentro l’oggetto utente.

{
  "id": 42,
  "email": "utente@example.it",
  "profiloPrivacy": {
    "consensoMarketing": false,
    "dataAggiornamento": "2026-04-12"
  }
}

La struttura annidata è comoda per un’API perché il client riceve in una sola risposta dati logicamente collegati. Non significa, però, che il database debba memorizzarli nello stesso modo. Io preferisco mantenere le regole di integrità nel database e trasformare i dati in JSON soltanto nel livello applicativo.

Con CSV la relazione è meno evidente. Di solito si usa una colonna condivisa come utente_id in due file, ma il formato non impedisce duplicati o riferimenti inesistenti. Durante un’importazione, conviene quindi controllare duplicati, righe orfane e identificativi mancanti prima di caricare i dati nel sistema relazionale.

Anche XML può rappresentare una struttura padre-figlio, ma il formato descrive la forma del documento, non garantisce da solo che il rapporto sia uno a uno. La protezione dell’unicità deve arrivare dallo schema, dalle regole di validazione o dal database che riceve i dati.

Gli errori che compromettono il modello

Il primo errore è affidarsi alla logica dell’applicazione senza imporre vincoli nel database. Un controllo nel codice può essere aggirato da un secondo servizio, da un’importazione manuale o da una query eseguita direttamente. L’unicità importante deve essere obbligatoria a livello di schema.

Il secondo errore è usare una relazione uno a uno per nascondere un problema di modellazione. Se una persona può avere più indirizzi, più numeri di telefono o più ruoli, una tabella secondaria con una sola riga non rappresenta correttamente la realtà. In quel caso serve probabilmente una relazione uno a molti.

Un altro problema nasce dalle cancellazioni. Se si elimina l’utente principale, bisogna decidere cosa accade al record collegato. ON DELETE CASCADE può essere adatto per dati dipendenti e ricostruibili, mentre per informazioni soggette a conservazione o audit è spesso preferibile bloccare la cancellazione o usare una disattivazione logica.

Infine, non bisogna confondere un identificativo univoco con un attributo che sembra unico. Un indirizzo email può cambiare o, in certi sistemi, essere condiviso. Per le relazioni strutturali preferisco usare chiavi surrogate stabili, lasciando email e codici aziendali come vincoli separati solo quando la regola di business lo richiede davvero.

La scelta finale dipende dalla regola dei dati

Una relazione uno a uno funziona bene quando il legame è reale, stabile e verificabile. La combinazione di chiave primaria, chiave esterna, UNIQUE e corretta gestione dei NULL rende il modello affidabile sia per le applicazioni sia per le analisi.

Prima di creare la tabella secondaria, mi pongo sempre tre domande. Il record può esistere senza l’altro? Potranno comparire più elementi collegati in futuro? I dati hanno requisiti diversi di sicurezza, aggiornamento o consultazione?

Se le risposte confermano l’unicità, la separazione può rendere il database più ordinato e governabile. Se invece l’unicità è soltanto occasionale, è meglio non forzarla: un modello leggermente più flessibile oggi può evitare migrazioni costose quando il processo reale crescerà.

Domande frequenti

Serve una chiave esterna accompagnata da un vincolo UNIQUE. In alternativa, la chiave esterna può essere anche la chiave primaria della tabella secondaria, impedendo duplicati e riferimenti a record inesistenti.

La relazione 1:1 richiede la presenza di entrambi i record, almeno dal lato previsto dal modello. La relazione 0:1 consente invece che il record collegato non esista ancora; in SQL, il collegamento facoltativo può usare un valore NULL, mentre quello obbligatorio richiede NOT NULL.

La separazione è utile quando i dati hanno permessi diversi, sono sensibili, opzionali, consultati raramente o seguono cicli di vita distinti. Se invece i campi vengono sempre letti insieme e hanno la stessa durata, una tabella unica può essere più semplice perché evita JOIN aggiuntivi.

Il record collegato può essere inserito come oggetto annidato, ad esempio un profilo dentro l’oggetto utente. JSON facilita lo scambio con le API, ma non garantisce da solo unicità o riferimenti validi: questi vincoli devono restare protetti nel database.

Valuta l'articolo

Valutazione: 0.00 Numero di voti: 0

Tag

sql
chiavi esterne
cardinalità
json
integrità referenziale
Autor Emilio Santoro
Emilio Santoro
Mi chiamo Emilio Santoro e mi occupo di analisi dati, business intelligence e data science da 4 anni. Ho iniziato a esplorare questo mondo perché sono affascinato dal potenziale dei dati nel trasformare le decisioni aziendali e nel fornire una comprensione più profonda dei fenomeni. Sul sito mondobi.it, cerco di rendere accessibili concetti complessi, condividendo la mia esperienza nel collegare la teoria alla pratica e nel presentare informazioni in modo chiaro e organizzato. La mia priorità è offrire contenuti accurati, utili e sempre aggiornati, basati su un'attenta verifica delle fonti e un confronto costante con le tendenze del settore.

Condividi post

Scrivi un commento