Il modello Entità-Relazione (E-R) è una rappresentazione grafica utilizzata nella progettazione di basi di dati per descrivere le relazioni tra le diverse entità. Le entità rappresentano oggetti del mondo reale, mentre le relazioni rappresentano le connessioni tra queste entità.
Nell’ambito della progettazione dei database, è importante definire correttamente le associazioni tra le entità, inclusi i tipi di associazioni come “1 a 1”, “1 a molti” e “molti a molti”. L’associazione 1 ad 1 è la più semplice perchè prevede una relazione biunivoca tra due entità: nel nostro esempio, abbiamo un direttore che afferisce ad uno ed un solo dipartimento, e dipartimento di cui fa capo un solo diretto.
Per modellare l’entità “direttore” e l’entità “dipartimento” con una relazione uno-a-uno, possiamo utilizzare il modello E/R (Entità/Relazione) e il modello logico. Iniziamo con il modello E/R:
Modello E/R (Entità/Relazione)
Nel modello E/R, puoi rappresentare l’entità “direttore” e l’entità “dipartimento” con i seguenti elementi:
- Entità “Direttore”:
- Attributi: direttore_id (chiave primaria), nome, cognome, data_di_nascita, ecc.
- Entità “Dipartimento”:
- Attributi: dipartimento_id (chiave primaria), nome, sede, ecc.
Per stabilire la relazione uno-a-uno tra il direttore e il dipartimento, puoi aggiungere un attributo “dipartimento_id” all’entità “Direttore” come chiave esterna che farà riferimento alla chiave primaria “dipartimento_id” dell’entità “Dipartimento”. Questo attributo “dipartimento_id” rappresenta il dipartimento di cui il direttore è responsabile.
Modello Logico
Nel modello logico, puoi rappresentare queste due entità come tabelle in un database relazionale:
Tabella “Direttore”
- Colonne: direttore_id (chiave primaria), nome, cognome, data_di_nascita, dipartimento_id* (chiave esterna).
Tabella “Dipartimento”:
- Colonne: dipartimento_id (chiave primaria), nome, sede.
Ora, tanto per capire le differenze, vediamo cosa cambia quando mettiamo l’attributo “dipartimento_id” da una parte o dall’altra, anche perchè scopriremo che in questo caso si tratta di scelte equivalenti.
Scenario 1: dipartimento_id come chiave esterna di Direttore
In questo caso, ogni direttore è associato a un unico dipartimento tramite la chiave esterna “dipartimento_id“. Un dipartimento può pertanto essere associato a un solo direttore.
Esempio di dati:
Tabella “Direttore”
direttore_id | nome | cognome | data_di_nascita | dipartimento_id |
---|---|---|---|---|
1 | Aldo | Ferdidando | 1983-01-15 | 101 |
2 | Alice | Gimpolaro | 1985-03-22 | 102 |
Tabella “Dipartimento”:
dipartimento_id | nome | sede |
---|---|---|
101 | Marketing | New York |
102 | Finanza | Los Angeles |
Query SQL possibili:
- Seleziona il direttore di un dipartimento specifico:
sql
SELECT *
FROM Direttore
WHERE dipartimento_id = 101;
- Cercare il dipartimento di un direttore specifico:
sql
SELECT Dipartimento.nome, Dipartimento.sede
FROM Direttore JOIN Dipartimento ON Direttore.dipartimento_id = Dipartimento.dipartimento_id WHERE Direttore.direttore_id = 1;
Scenario 2: dipartimento_id come chiave esterna di Dipartimento
In questo caso, ogni dipartimento è associato a un unico direttore tramite la chiave esterna “dipartimento_id”. Un direttore può essere associato a un solo dipartimento.
Esempio di dati:
Tabella “Direttore”:
direttore_id | nome | cognome | data_di_nascita |
---|---|---|---|
1 | John | Smith | 1980-01-15 |
2 | Alice | Johnson | 1975-03-22 |
Tabella “Dipartimento”:
dipartimento_id | nome | sede | direttore_id (chiave esterna) |
---|---|---|---|
101 | Marketing | New York | 1 |
102 | Finanza | Los Angeles | 2 |
Query SQL possibili:
- Seleziona il direttore di un dipartimento specifico:
sql
SELECT Direttore.*
FROM Dipartimento JOIN Direttore ON Dipartimento.direttore_id = Direttore.direttore_id
WHERE Dipartimento.dipartimento_id = 101;
- Trova il dipartimento di un direttore specifico:
sql
SELECT Dipartimento.nome, Dipartimento.sede
FROM Direttore JOIN Dipartimento ON Direttore.direttore_id = Dipartimento.direttore_id
WHERE Direttore.direttore_id = 1;
In entrambi gli scenari, la relazione uno-a-uno è rappresentata correttamente, ma la scelta di dove mettere l’attributo “dipartimento_id” determina in modo significativo come vengono effettuate le query e quali entità hanno la responsabilità dell’associazione.