Izbjegavajte prelazne zavisnosti kako biste osigurali normalizaciju
Prelazna zavisnost u bazi podataka je indirektna veza između vrijednosti u istoj tabeli koja uzrokuje funkcionalnu zavisnost . Da biste postigli standardni standard Treće normalne forme (3NF), morate ukloniti bilo kakvu tranzitivnu zavisnost.
Po svojoj prirodi, tranzitivna zavisnost zahteva tri ili više atributa (ili stupaca baze podataka) koji imaju funkcionalnu zavisnost između njih, što znači da se kolona A u tabeli oslanja na kolonu B kroz srednju kolonu C.
Da vidimo kako bi ovo moglo da funkcioniše.
Primjer tranzitivne zavisnosti
AUTORI
Author_ID | Autor | Knjiga | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott kartica | Enderova igra | Sjedinjene Države |
Auth_001 | Orson Scott kartica | Enderova igra | Sjedinjene Države |
Auth_002 | Margaret Atwood | Priča o sluškinji | Kanada |
U gore navedenom primeru AUTORI:
- Knjiga → Autor : Ovde, atribut knjige određuje atribut Autor . Ako znate ime knjige, možete saznati ime autora. Međutim, Autor ne određuje Knjigu , jer autor može pisati više knjiga. Na primer, samo zato što znamo ime autora Orson Scott Card, mi i dalje ne znamo ime knjige.
- Autor → Autor_Nationality : Isto tako, atribut autora određuje Author_Nationality , ali ne obrnuto; samo zato što znamo da nacionalnost ne znači da možemo odrediti autora.
Ali ova tabela uvodi tranzitivnu zavisnost:
- Book → Author_Nationality: Ako znamo ime knjige, možemo utvrditi nacionalnost preko kolone Autor.
Izbjegavanje tranzitivnih zavisnosti
Da bismo obezbedili treću normalnu formu, uklonimo tranzitivnu zavisnost.
Možemo početi uklanjanjem kolone Knjige iz tabele autora i kreiranjem odvojene tablice Knjige:
KNJIGE
Book_ID | Knjiga | Author_ID |
---|---|---|
Book_001 | Enderova igra | Auth_001 |
Book_001 | Deca umova | Auth_001 |
Book_002 | Priča o sluškinji | Auth_002 |
AUTORI
Author_ID | Autor | Author_Nationality |
---|---|---|
Auth_001 | Orson Scott kartica | Sjedinjene Države |
Auth_002 | Margaret Atwood | Kanada |
Da li je ovo popravilo? Pogledajmo sada naše zavisnosti:
BOOKS tabela :
- Book_ID → Knjiga: Knjiga zavisi od Book_ID-a .
- U ovoj tabeli ne postoje druge zavisnosti, pa smo u redu. Imajte na umu da inostrani ključ Author_ID povezuje ovu tabelu sa tabulatom AUTHORS preko svog primarnog ključa Author_ID . Stvorili smo odnos kako bismo izbegli tranzitivnu zavisnost, ključni dizajn relacionih baza podataka.
AUTORSKA tablica :
- Author_ID → Autor: Autor zavisi od Author_ID .
- Autor → Autornost: nacionalnost može utvrditi autor.
- Author_ID → Author_Nationality: Državljanstvo se može odrediti od Author_ID preko atributa Autor . Još uvek imamo tranzitivnu zavisnost.
Moramo dodati treću tabelu za normalizaciju ovih podataka:
DRŽAVE
Country_ID | Zemlja |
---|---|
Coun_001 | Sjedinjene Države |
Coun_002 | Kanada |
AUTORI
Author_ID | Autor | Country_ID |
---|---|---|
Auth_001 | Orson Scott kartica | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Sada imamo tri tabele, koristeći inostrane ključeve za povezivanje između tabela:
- Strani ključ ključa KNJIGE Autor_ID povezuje knjigu sa autorom u tabeli AUTORI.
- Strani ključ country_ID povezivanja autora tablice AUTHORS povezuje autora sa zemljom u tabeli COUNTRIES.
- Tabela COUNTRIES nema inostrani ključ jer nema potrebe da se poveže sa drugom tablom u ovom dizajnu.
Zašto su tranzitivne zavisnosti loše dizajnirane baze podataka
Koja je vrijednost izbjegavanja tranzitivnih zavisnosti kako bi se osigurala 3NF? Da razmotrimo naš prvi sto i vidimo probleme koje stvara:
AUTORI
Author_ID | Autor | Knjiga | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott kartica | Enderova igra | Sjedinjene Države |
Auth_001 | Orson Scott kartica | Deca umova | Sjedinjene Države |
Auth_002 | Margaret Atwood | Priča o sluškinji | Kanada |
Ovakav dizajn može doprinijeti anomalijama podataka i nekonzistentnosti, na primjer:
- Ako ste izbrisali dve knjige "Deca umova" i "Enderova igra", izbrisali biste autora "Orson Scott Card" i njegovu nacionalnost iz baze podataka.
- Ne možete dodati novog autora u bazu podataka, osim ako ne dodate knjigu; šta ako je autor još neobjavljen ili ne znate ime knjige koju je napisala?
- Ako je "Orson Scott kartica" promijenio svoje državljanstvo, morali biste ga promijeniti u svim zapisima u kojima se pojavljuje. Ako imate više zapisa sa istim autorkom, može doći do netačnih podataka: šta ako osoba koja unese podatke ne shvati da ima više zapisa za njega i da promijeni podatke u samo jednom zapisu?
- Ne možete izbrisati knjigu kao što je "The Handmaid's Tale" bez potpunog brisanja autora.
Ovo su samo neki od razloga zašto normalizacija i izbegavanje tranzitivnih zavisnosti štite podatke i obezbeđuju konzistentnost.