Una relazione uno-a-molti in un database si verifica quando ogni record nella Tabella A può avere molti record collegati nella Tabella B, ma ogni record nella Tabella B può avere solo un record corrispondente nella Tabella A.
Una relazione uno-a-molti in un database è la progettazione di database relazionali più comune ed è al centro di una buona progettazione.
I database possono anche implementare una relazione uno-a-uno e una relazione molti-a-molti.
Esempio di relazione uno-a-molti
Considera la relazione tra un insegnante e i corsi che insegna. Un insegnante può insegnare a più classi, ma il corso non avrebbe lo stesso rapporto con l'insegnante.
Pertanto, per ogni record in una tabella Insegnanti, potrebbero esserci molti record nella tabella Corsi. Questo esempio illustra una relazione uno-a-molti: un insegnante a più corsi.
Perché è importante stabilire una relazione uno-a-molti
Per rappresentare una relazione uno-a-molti, hai bisogno di almeno due tabelle. Vediamo perché.
Adesione al primo disegno della forma normale
Forse abbiamo creato una tabella in cui vogliamo registrare il nome e i corsi tenuti. Potremmo progettare una tabella Insegnanti e Corsi come questa:
ID_insegnante | Nome_insegnante | Corso |
---|---|---|
Insegnante_001 | Carmen | Biologia |
Insegnante_002 | Veronica | Matematica |
Insegnante_003 | Jorge | Inglese |
E se Carmen insegnasse due o più corsi? Abbiamo due opzioni con questo design. Potremmo aggiungerlo al record esistente di Carmen, in questo modo:
ID_insegnante | Insegnante_Nome | Corso |
---|---|---|
Insegnante_001 | Carmen | Biologia, matematica |
Insegnante_002 | Veronica | Matematica |
Insegnante_003 | Jorge | Inglese |
Tuttavia, il design sopra non è flessibile e potrebbe causare problemi in seguito durante l'inserimento, la modifica o l'eliminazione dei dati. Rende difficile la ricerca dei dati.
Questo progetto viola anche il primo principio di normalizzazione del database, First Normal Form (1NF), che afferma che ogni cella della tabella dovrebbe contenere un singolo dato separato.
La seconda regola della forma normale
Un' altra alternativa di design potrebbe essere quella di aggiungere un secondo record per Carmen:
Insegnante_ID | Insegnante_Nome | Corso |
---|---|---|
Insegnante_001 | Carmen | Biologia |
Insegnante_001 | Carmen | Matematica |
Insegnante_002 | Veronica | Matematica |
Insegnante_003 | Jorge | Inglese |
Questo approccio aderisce a 1NF ma è ancora una progettazione del database scadente perché introduce ridondanza e potrebbe gonfiare inutilmente un database di grandi dimensioni. Ancora più importante, i dati potrebbero diventare incoerenti.
Ad esempio, cosa succederebbe se il nome di Carmen fosse cambiato? Qualcuno che lavora con i dati potrebbe aggiornare il suo nome in un record e non aggiornarlo nel secondo record.
Questo design viola lo standard Second Normal Form (2NF), che aderisce a 1NF e deve anche evitare la ridondanza di più record. La regola 2NF ottiene questo risultato separando sottoinsiemi di dati in più tabelle e creando una relazione tra loro.
Come progettare un database con relazioni uno-a-molti
Per implementare una relazione uno-a-molti nella tabella Insegnanti e Corsi, dividi le tabelle in due e collegale utilizzando una chiave esterna.
Qui, abbiamo rimosso la colonna Corso nella tabella Insegnanti:
Insegnante_ID | Insegnante_Nome |
---|---|
Insegnante_001 | Carmen |
Insegnante_002 | Veronica |
Insegnante_003 | Jorge |
Ed ecco la tabella dei Corsi. Nota che la sua chiave esterna, Teacher_ID, collega un corso a un insegnante nella tabella Insegnanti:
ID_corso | Nome_corso | ID_insegnante |
---|---|---|
Corso_001 | Biologia | Insegnante_001 |
Corso_002 | Matematica | Insegnante_001 |
Corso_003 | Inglese | Insegnante_003 |
Abbiamo sviluppato una relazione tra la tabella Docenti e la tabella Corsi utilizzando una chiave esterna. Questa disposizione ci dice che Carmen insegna sia biologia che matematica e che Jorge insegna inglese.
Possiamo vedere come questo design eviti eventuali ridondanze, consenta ai singoli insegnanti di insegnare più corsi e implementi una relazione uno-a-molti.