Relazioni Tra Tabelle SQL

– Indice Tutorial –

In un database relazionale, le relazioni, tra tabelle, possono essere di tre tipi:

     

      • uno a molti;

      • uno a uno;

      • molti a molti.

     

    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 Utenti ha una chiave primaria utente_id.
    • La tabella ProfiliUtente ha una propria chiave primaria profilo_id.
    • Il campo utente_id in ProfiliUtente è una chiave esterna che fa riferimento a utente_id nella tabella Utenti. Questo garantisce che ogni profilo sia associato a un utente esistente.
    • Il vincolo UNIQUE sul campo utente_id in ProfiliUtente è fondamentale per enforcing la relazione uno a uno. Impedisce che più profili abbiano lo stesso utente_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:

    SQL
     
    -- 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 in DettagliDipendente che in DettagliContratto.
    • In DettagliContratto, dipendente_id è anche una chiave esterna che fa riferimento a DettagliDipendente(dipendente_id). Poiché è anche la chiave primaria di DettagliContratto, 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

    SQL
    CREATE TABLE Autori (
        id_autore INT PRIMARY KEY,
        nome VARCHAR(100)
    );
     
    CREATE TABLE Libri (
        id_libro INT PRIMARY KEY,
        titolo VARCHAR(100),
        id_autore INT,
        FOREIGN KEY (id_autore) REFERENCES Autori(id_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)

    );

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *