RELAZIONE UNO A UNO
Una relazione uno a uno (1:1) in SQL si verifica quando un record in una tabella è associato a uno e un solo record in un’altra tabella, e viceversa.
Concetto:
Immagina di avere due entità che sono strettamente correlate, al punto che ogni istanza di una entità corrisponde esattamente a un’istanza dell’altra.
Esempi comuni di relazioni uno a uno:
- Persona e Patente di Guida: Ogni persona ha una sola patente e ogni patente appartiene a una sola persona.
Come si implementa una relazione uno a uno in SQL?
Ci sono due modi principali per implementare una relazione uno a uno in SQL, entrambi basati sull’uso di chiavi esterne (Foreign Keys) e vincoli UNIQUE:
1. Utilizzo di una Chiave Esterna con Vincolo UNIQUE:
Questo è il metodo più comune e flessibile. Si crea una chiave esterna in una delle due tabelle che fa riferimento alla chiave primaria dell’altra tabella, e si aggiunge un vincolo UNIQUE su questa chiave esterna.
Esempio:
Supponiamo di avere due tabelle: Utenti e ProfiliUtente.
SQL
-- Tabella Utenti
CREATE TABLE Utenti (
utente_id INT PRIMARY KEY,
nome VARCHAR(50),
email VARCHAR(100)
);
-- Tabella ProfiliUtente
CREATE TABLE ProfiliUtente (
profilo_id INT PRIMARY KEY,
utente_id INT UNIQUE NOT NULL, -- Chiave esterna con vincolo UNIQUE
data_nascita DATE,
indirizzo VARCHAR(200),
FOREIGN KEY (utente_id) REFERENCES Utenti(utente_id)
);
Spiegazione:
- La tabella
Utentiha una chiave primariautente_id. - La tabella
ProfiliUtenteha una propria chiave primariaprofilo_id. - Il campo
utente_idinProfiliUtenteè una chiave esterna che fa riferimento autente_idnella tabellaUtenti. Questo garantisce che ogni profilo sia associato a un utente esistente. - Il vincolo
UNIQUEsul campoutente_idinProfiliUtenteè fondamentale per enforcing la relazione uno a uno. Impedisce che più profili abbiano lo stessoutente_id, garantendo che un utente possa avere un solo profilo.
Vantaggi di questo approccio:
- Flessibilità: Permette che un record in una tabella possa esistere anche senza un record corrispondente nell’altra (se la chiave esterna non è
NOT NULL). Ad esempio, un utente potrebbe essere creato senza un profilo subito.
2. Utilizzo della Stessa Chiave Primaria in Entrambe le Tabelle (Meno Comune):
In questo approccio, la chiave primaria di entrambe le tabelle è la stessa e la chiave esterna nella seconda tabella è anche la sua chiave primaria. Questo crea una relazione molto stretta.
Esempio:
-- Tabella DettagliDipendente
CREATE TABLE DettagliDipendente (
dipendente_id INT PRIMARY KEY,
nome VARCHAR(50),
cognome VARCHAR(50)
);
-- Tabella DettagliContratto
CREATE TABLE DettagliContratto (
dipendente_id INT PRIMARY KEY, -- Chiave primaria e chiave esterna
data_inizio_contratto DATE,
stipendio DECIMAL(10, 2),
FOREIGN KEY (dipendente_id) REFERENCES DettagliDipendente(dipendente_id)
);
Spiegazione:
- Il campo
dipendente_idè la chiave primaria sia inDettagliDipendenteche inDettagliContratto. - In
DettagliContratto,dipendente_idè anche una chiave esterna che fa riferimento aDettagliDipendente(dipendente_id). Poiché è anche la chiave primaria diDettagliContratto, questo impone implicitamente l’unicità e quindi la relazione uno a uno.
Vantaggi:
- Molto semplice da comprendere e implementare per relazioni strettamente accoppiate dove le entità sono quasi un’unica cosa.
Svantaggi:
- Meno flessibile: Ogni record nella seconda tabella deve avere un record corrispondente nella prima, altrimenti non si potrebbe inserire (a meno di non rendere la chiave primaria nella seconda tabella nullable, il che non è la best practice).
- Difficile da scalare: Se in futuro si decide che una relazione potrebbe diventare uno-a-molti, questo approccio richiederà una ristrutturazione significativa.
RELAZIONE UNO A MOLTI
Una relazione 1 a N (uno a molti) in un database significa che:
Un singolo record di una tabella può essere collegato a molti record di un’altra tabella, ma ogni record dell’altra tabella è collegato a uno solo.
📘 Esempio reale
Tabella A: Autori
Tabella B: Libri
-
Un autore può aver scritto molti libri → questa è la parte “1 a N“
-
Ma ogni libro è scritto da un solo autore → quindi dalla parte dei libri c’è solo 1 autore
RELAZIONE N A N
Una relazione N a N (molti a molti) in un database relazionale si verifica quando più record di una tabella possono essere associati a più record di un’altra tabella.
Esempio concreto:
-
Uno studente può iscriversi a più corsi
-
Un corso può avere più studenti iscritti
Questa situazione non può essere gestita direttamente con due sole tabelle (studenti e corsi) perché non puoi avere una colonna che contiene “molti valori”.
Soluzione:
Si usa una tabella intermedia (detta tabella ponte o di associazione) che collega le due entità (in questo esempio iscrizioni):
studenti
CREATE TABLE studenti (
id INT PRIMARY KEY,
nome VARCHAR(100)
);
corsi
CREATE TABLE corsi (
id INT PRIMARY KEY,
nome VARCHAR(100)
);
iscrizioni (tabella ponte)
Questa tabella rappresenta la relazione N a N.
CREATE TABLE iscrizioni (
studente_id INT,
corso_id INT,
PRIMARY KEY (studente_id, corso_id),
FOREIGN KEY (studente_id) REFERENCES studenti(id),
FOREIGN KEY (corso_id) REFERENCES corsi(id)
);
