Una dipendenza transitiva in un database è una relazione indiretta tra i valori nella stessa tabella che causa una dipendenza funzionale. Per raggiungere lo standard di normalizzazione di Third Normal Form (3NF), è necessario eliminare qualsiasi dipendenza transitiva.
Per sua natura, una dipendenza transitiva richiede tre o più attributi (o colonne di database) che hanno una dipendenza funzionale tra loro, nel senso che la colonna A in una tabella si basa sulla colonna B attraverso una colonna intermedia C.
Vediamo come potrebbe funzionare.
Esempio di dipendenza transitiva
AUTORI
author_id | Autore | Libro | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Il gioco di Ender | stati Uniti |
Auth_001 | Orson Scott Card | Il gioco di Ender | stati Uniti |
Auth_002 | Margaret Atwood | Il racconto dell'ancella | Canada |
Nell'esempio AUTORI sopra:
- Libro → Autore : Qui, il Libro attributo determina il Autore attributo. Se conosci il nome del libro, puoi imparare il nome dell'autore. Però, Autore non determina Libro , perché un autore può scrivere più libri. Ad esempio, solo perché conosciamo il nome dell'autore Orson Scott Card, non conosciamo ancora il nome del libro.
- Autore → Author_Nationality : Allo stesso modo, il Autore attributo determina il Author_Nationality , ma non viceversa; solo perché sappiamo che la nazionalità non significa che possiamo determinare l'autore.
Ma questa tabella introduce una dipendenza transitiva:
- Libro → Author_Nationality: Se conosciamo il nome del libro, possiamo determinare la nazionalità tramite la colonna Autore.
Evitare le dipendenze transitive
Per garantire la Terza Forma Normale, rimuoviamo la dipendenza transitiva.
Possiamo iniziare rimuovendo la colonna Libro dalla tabella Autori e creando una tabella Libri separata:
LIBRI
libro_id | Libro | author_id |
---|---|---|
Book_001 | Il gioco di Ender | Auth_001 |
Book_001 | I bambini della mente | Auth_001 |
Book_002 | Il racconto dell'ancella | Auth_002 |
AUTORI
author_id | Autore | Author_Nationality |
---|---|---|
Auth_001 | Orson Scott Card | stati Uniti |
Auth_002 | Margaret Atwood | Canada |
L'ha risolto? Esaminiamo ora le nostre dipendenze:
Tabella dei LIBRI:
- libro_id → Libro: Il Libro dipende da libro_id .
- Non esistono altre dipendenze in questa tabella, quindi siamo a posto. Si noti che la chiave esterna author_id collega questa tabella alla tabella AUTORI mediante la sua chiave primaria author_id . Abbiamo creato una relazione per evitare una dipendenza transitiva, una progettazione chiave dei database relazionali.
Tabella degli AUTORI:
- author_id → Autore: Il Autore dipende da author_id .
- Autore → Author_Nationality: La nazionalità può essere determinata dall'autore.
- author_id → Author_Nationality: La nazionalità può essere determinata dal author_id tramite la Autore attributo. Abbiamo ancora una dipendenza transitiva.
Dobbiamo aggiungere una terza tabella per normalizzare questi dati:
PAESI
country_id | Nazione |
---|---|
Coun_001 | stati Uniti |
Coun_002 | Canada |
AUTORI
author_id | Autore | country_id |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Ora abbiamo tre tabelle, facendo uso di chiavi esterne per il collegamento tra le tabelle:
- Chiave esterna della tabella BOOK author_id collega un libro ad un autore nella tabella AUTORI.
- La chiave esterna della tabella AUTORI country_id collega un autore a un paese nella tabella COUNTRIES.
- La tabella COUNTRIES non ha una chiave esterna perché non ha bisogno di collegarsi a un'altra tabella in questo design.
Perché le dipendenze transitive sono un cattivo design del database
Qual è il valore di evitare le dipendenze transitive per aiutare a garantire 3NF? Consideriamo nuovamente la nostra prima tabella e vediamo i problemi che crea:
AUTORI
author_id | Autore | Libro | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Il gioco di Ender | stati Uniti |
Auth_001 | Orson Scott Card | I bambini della mente | stati Uniti |
Auth_002 | Margaret Atwood | Il racconto dell'ancella | Canada |
Questo tipo di design può contribuire a anomalie dei dati e incongruenze, ad esempio:
- Se hai cancellato i due libri "Children of the Mind" e "Ender's Game", cancelleresti completamente l'autore "Orson Scott Card" e la sua nazionalità dal database.
- Non è possibile aggiungere un nuovo autore al database a meno che non si aggiunga anche un libro; cosa succede se l'autore non è ancora stato pubblicato o non conosci il nome di un libro che è stato autore?
- Se "Orson Scott Card" ha cambiato la sua cittadinanza, dovresti modificarlo in tutti i documenti in cui appare. Avere più record con lo stesso autore può portare a dati imprecisi: cosa succede se la persona che ha inserito i dati non si rende conto che esistono più record per lui e cambia i dati in un solo record?
- Non è possibile eliminare un libro come "Il racconto dell'ancella" senza cancellare completamente l'autore.
Questi sono solo alcuni dei motivi per cui la normalizzazione e l'evitamento delle dipendenze transitive proteggono i dati e garantiscono l'uniformità.