O dependență tranzitorie într-o bază de date este o relație indirectă între valorile din aceeași tabelă care determină o dependență funcțională. Pentru a atinge standardul de normalizare a Formei 3 Normale (3NF), trebuie să eliminați orice dependență tranzitantă.
Prin natura sa, dependența tranzitiva necesită trei sau mai multe atribute (sau coloane de bază de date) care au o dependență funcțională între ele, ceea ce înseamnă că coloana A într-un tabel se bazează pe Coloana B printr-o coloană intermediară C.
Să vedem cum ar putea funcționa acest lucru.
Exemplu de dependență tranzitorie
AUTORI
Author_ID | Autor | Carte | Author_Nationality |
---|---|---|---|
Auth_001 | Cardul Orson Scott | Jocul lui Ender | Statele Unite |
Auth_001 | Cardul Orson Scott | Jocul lui Ender | Statele Unite |
Auth_002 | Margaret Atwood | Povestea roabei | Canada |
În exemplul AUTORI de mai sus:
- Carte → Autor : Aici Carte atributul determină Autor atribut. Dacă știți numele cărții, puteți afla numele autorului. In orice caz, Autor nu determină Carte , deoarece un autor poate scrie mai multe cărți. De exemplu, doar pentru că știm numele autorului Orson Scott Card, încă nu știm numele cărții.
- Autor → Author_Nationality : De asemenea, Autor atributul determină Author_Nationality , dar nu invers; doar pentru că știm naționalitatea nu înseamnă că putem determina autorul.
Dar acest tabel introduce o dependență tranzitivă:
- Carte → Author_Nationality: Dacă știm numele cărții, putem determina naționalitatea prin coloana Autorul.
Evitarea dependențelor tranzitorii
Pentru a asigura a treia formă normală, să eliminăm dependența tranzitantă.
Putem începe prin eliminarea coloanei Cărți din tabelul Autori și crearea unui tabel separat Cărți:
CĂRȚI
Book_ID | Carte | Author_ID |
---|---|---|
Book_001 | Jocul lui Ender | Auth_001 |
Book_001 | Copiii minții | Auth_001 |
Book_002 | Povestea roabei | Auth_002 |
AUTORI
Author_ID | Autor | Author_Nationality |
---|---|---|
Auth_001 | Cardul Orson Scott | Statele Unite |
Auth_002 | Margaret Atwood | Canada |
A rezolvat asta? Să examinăm acum dependențele noastre:
Tabele CARTE:
- Book_ID → Carte: Carte depinde de Book_ID .
- Nu există alte dependențe în acest tabel, deci suntem bine. Rețineți că cheia externă Author_ID leagă acest tabel la tabela AUTORI prin cheia primară Author_ID . Am creat o relație pentru a evita dependența tranzitiva, un design cheie al bazelor de date relaționale.
Tabelul AUTORI:
- Author_ID → Autor: Autor depinde de Author_ID .
- Autor → Author_Nationality: Naționalitatea poate fi determinată de autor.
- Author_ID → Author_Nationality: Naționalitatea poate fi determinată de la Author_ID prin Autor atribut. Mai avem o dependență tranzitantă.
Trebuie să adăugăm un al treilea tabel pentru a normaliza aceste date:
ȚĂRI
country_id | Țară |
---|---|
Coun_001 | Statele Unite |
Coun_002 | Canada |
AUTORI
Author_ID | Autor | country_id |
---|---|---|
Auth_001 | Cardul Orson Scott | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Acum avem trei mese, folosind cheile străine pentru a face legătura între mese:
- Cheia străină a tabelului BOOK Author_ID leagă o carte unui autor în tabela AUTORI.
- Cheia externă a tabelului AUTORILOR country_id leagă autorul unei țări în tabela COUNTRIES.
- Tabelul ȚĂRI nu are cheie străină, deoarece nu are nevoie să se lege la alt tabel în acest design.
De ce dependențele tranzitorii sunt baze de date greșite
Care este valoarea evitării dependențelor tranzitorii pentru a ajuta la asigurarea 3NF? Să luăm în considerare primul nostru tabel și să vedem problemele pe care le creează:
AUTORI
Author_ID | Autor | Carte | Author_Nationality |
---|---|---|---|
Auth_001 | Cardul Orson Scott | Jocul lui Ender | Statele Unite |
Auth_001 | Cardul Orson Scott | Copiii minții | Statele Unite |
Auth_002 | Margaret Atwood | Povestea roabei | Canada |
Acest tip de design poate contribui la anomalii și inconsecvențe de date, de exemplu:
- Dacă ați șters cele două cărți "Copiii minții" și "Jocul lui Ender", ați șterge autorul "Orson Scott Card" și naționalitatea sa complet din baza de date.
- Nu puteți adăuga un nou autor în baza de date decât dacă adăugați și o carte; ce dacă autorul este încă nepublicat sau nu știți numele unei cărți pe care a scris-o?
- Dacă "Orson Scott Card" și-a schimbat cetățenia, va trebui să o schimbați în toate înregistrările în care apare. Înregistrarea mai multor înregistrări cu același autor poate duce la date incorecte: Ce se întâmplă dacă persoana care introduce datele nu realizează că există mai multe înregistrări pentru el și modifică datele într-o singură înregistrare?
- Nu puteți șterge o carte precum "Povestea slujitorului" fără a șterge complet autorul.
Acestea sunt doar câteva motive pentru care normalizarea și evitarea dependențelor tranzitorii protejează datele și asigură coerența.