Izvairieties no transitiālas atkarības, lai palīdzētu normalizēt
Pārejoša atkarība datu bāzē ir netieša saistība starp vērtībām tajā pašā tabulā, kas izraisa funkcionālu atkarību . Lai sasniegtu trešās normālās formas normalizēšanas standartu (3NF), jums jānovērš jebkura pārejoša atkarība.
Pēc būtības pārnēsājamai atkarībai ir vajadzīgi trīs vai vairāki atribūti (vai datu bāzes kolonnas), kuru starpā ir funkcionāla atkarība, kas nozīmē, ka tabulas A sleja balstās uz B sleju caur starpposmu C.
Apskatīsim, kā tas varētu darboties.
Transitīvās atkarības piemērs
AUTORI
Author_ID | Autors | Grāmatu | Autora vārds |
---|---|---|---|
Auth_001 | Orson Scott Card | Endera spēle | Savienotās Valstis |
Auth_001 | Orson Scott Card | Endera spēle | Savienotās Valstis |
Auth_002 | Margaret Atvuds | Amatniecības stāsts | Kanāda |
Iepriekš minētajā AUTHORS piemērā:
- Grāmata → Autors : šeit atribūts Grāmata nosaka autoru atribūtu. Ja jūs zināt grāmatas nosaukumu, varat uzzināt autora vārdu. Tomēr Autors nenosaka grāmatu , jo autors var rakstīt vairākas grāmatas. Piemēram, tikai tāpēc, ka mēs zinām autora vārdu Orson Scott Card, mēs joprojām nezinām grāmatu nosaukumu.
- Autors → Author_Nationality : tāpat autora atribūts nosaka autoru_nacionālismu , bet ne otrādi; tikai tādēļ, ka mēs zinām valstspiederību, nenozīmē, ka mēs varam noteikt autoru.
Bet šajā tabulā ir iekļauta pārejoša atkarība:
- Book → Author_Nationality: ja mēs zinām grāmatu nosaukumu, mēs varam noteikt pilsonību, izmantojot kolonnu Autors.
Izvairīšanās no transitiālas atkarības
Lai nodrošinātu trešo parasto veidlapu, noņemiet transitive atkarību.
Mēs varam sākt, noņēmot kolonnu Grāmata no Autora tabulas un izveidot atsevišķu Grāmatu tabulu:
ZIŅAS
Book_ID | Grāmatu | Author_ID |
---|---|---|
Book_001 | Endera spēle | Auth_001 |
Book_001 | Mīlestības bērni | Auth_001 |
Book_002 | Amatniecības stāsts | Auth_002 |
AUTORI
Author_ID | Autors | Autora vārds |
---|---|---|
Auth_001 | Orson Scott Card | Savienotās Valstis |
Auth_002 | Margaret Atvuds | Kanāda |
Vai tas salaboja? Apskatīsim mūsu atkarības tagad:
GRĀMATU tabula :
- Book_ID → Grāmata: Grāmata ir atkarīga no Book_ID .
- Šajā tabulā nav citu atkarību, tādēļ mums ir labi. Ņemiet vērā, ka ārējā atslēga Author_ID savieno šo tabulu ar AUTHORS tabulu, izmantojot tā galveno atslēgu Author_ID . Mēs esam izveidojuši attiecības, lai izvairītos no pārejošas atkarības, kas ir galvenais relāciju datu bāzu dizains.
AUTHORS tabula :
- Author_ID → Autors: Autors ir atkarīgs no Author_ID .
- Autors → Author_Nationality: pilsonību var noteikt autors.
- Author_ID → Author_Nationality: pilsonību var noteikt no Author_ID, izmantojot Autora atribūtu. Mums joprojām ir pārejoša atkarība.
Lai šos datus normalizētu, mums jāpievieno trešā tabula:
VALSTIS
Valsts_ID | Valsts |
---|---|
Coun_001 | Savienotās Valstis |
Coun_002 | Kanāda |
AUTORI
Author_ID | Autors | Valsts_ID |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atvuds | Coun_002 |
Tagad mums ir trīs tabulas, izmantojot ārējās atslēgas, lai saikne starp tabulām:
- AUTORU tabulā BOOK tabulas ārējā atslēga Author_ID saista grāmatu autoram.
- AUTHORS tabulas ārējā atslēga Country_ID savieno autoru ar valsti VALSTU tabulā.
- Tabulai COUNTRIES nav ārējās atslēgas, jo nav nepieciešams saistīt to ar citu tabulu šajā dizainā.
Kāpēc transitive atkarības ir slikta datu bāzes dizains
Kāda ir vērtība, kā izvairīties no pārejošām atkarībām, lai palīdzētu nodrošināt 3NF? Atkārtoti izskatiet mūsu pirmo tabulu un redzam jautājumus, ko tā rada:
AUTORI
Author_ID | Autors | Grāmatu | Autora vārds |
---|---|---|---|
Auth_001 | Orson Scott Card | Endera spēle | Savienotās Valstis |
Auth_001 | Orson Scott Card | Mīlestības bērni | Savienotās Valstis |
Auth_002 | Margaret Atvuds | Amatniecības stāsts | Kanāda |
Šāda veida dizains var veicināt datu anomālijas un pretrunas, piemēram:
- Ja jūs izdzēsāt divas grāmatas "Bērni no prāta" un "Ender's Game", jūs pilnībā izdzēsīsiet autora "Orsona Scott Card" un viņa pilsonību no datubāzes.
- Jūs nevarat pievienot jaunu autoru datu bāzē, ja vien neesat pievienojis grāmatu; Ko darīt, ja autors vēl nav publicēts vai arī jūs nezināt tās grāmatas nosaukumu, kuru viņa ir autorējusi?
- Ja "Orson Scott Card" nomainīs savu pilsonību, jums vajadzētu mainīt to visos ierakstos, kuros viņš parādās. Ja vienam un tam pašam autoram ir vairāki ieraksti, var rasties neprecīzi dati: ja datu ievades persona neapzinās, ka viņam ir vairāki ieraksti un dati tiek mainīti tikai vienā ierakstā?
- Jūs nevarat izdzēst grāmatu, piemēram, "The Handmaid's Tale", taču arī pilnībā neizdzēšat autoru.
Šie ir tikai daži iemesli, kāpēc normalizācija un izvairoties no pārejošām atkarībām, datu aizsardzībai un konsekvences nodrošināšanai.