En transitiv afhængighed i en database er et indirekte forhold mellem værdier i samme tabel, der forårsager en funktionel afhængighed. For at opnå normaliseringsstandarden for tredje normale formular (3NF) skal du eliminere enhver transitiv afhængighed.
Af dens art kræver en transitiv afhængighed tre eller flere attributter (eller databasekolonner), der har en funktionel afhængighed mellem dem, hvilket betyder, at kolonne A i en tabel afhænger af kolonne B gennem en mellemliggende kolonne C.
Lad os se, hvordan dette kan virke.
Eksempel på transitive afhængighed
FORFATTERE
Author_ID | Forfatter | Bestil | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Ender's Game | Forenede Stater |
Auth_001 | Orson Scott Card | Ender's Game | Forenede Stater |
Auth_002 | Margaret Atwood | Tjenestemandens Tale | Canada |
I AUTHORS eksempel ovenfor:
- Bestil → Forfatter : Her, den Bestil attribut bestemmer Forfatter attribut. Hvis du kender bognavnet, kan du lære forfatterens navn. Imidlertid, Forfatter bestemmer ikke Bestil , fordi en forfatter kan skrive flere bøger. For eksempel, fordi vi kender forfatterens navn Orson Scott Card, kender vi stadig ikke bognavnet.
- Forfatter → Author_Nationality : Ligeledes er Forfatter attribut bestemmer Author_Nationality , men ikke omvendt; bare fordi vi kender nationalitet betyder ikke, at vi kan bestemme forfatteren.
Men denne tabel introducerer en transitiv afhængighed:
- Bestil → Author_Nationality: Hvis vi kender bognavnet, kan vi bestemme nationaliteten via kolonnen Forfatter.
Undgå transitive afhængigheder
For at sikre tredje normale form, lad os fjerne den transitive afhængighed.
Vi kan begynde med at fjerne kolonnen Bog fra forfatterens bord og oprette en separat bøger-tabel:
BØGER
Book_ID | Bestil | Author_ID |
---|---|---|
Book_001 | Ender's Game | Auth_001 |
Book_001 | Børn i sindet | Auth_001 |
Book_002 | Tjenestemandens Tale | Auth_002 |
FORFATTERE
Author_ID | Forfatter | Author_Nationality |
---|---|---|
Auth_001 | Orson Scott Card | Forenede Stater |
Auth_002 | Margaret Atwood | Canada |
Har dette rettet det? Lad os undersøge vores afhængigheder nu:
Bøger bord:
- Book_ID → Bestil: Det Bestil afhænger af Book_ID .
- Der findes ingen andre afhængigheder i denne tabel, så vi er okay. Bemærk at den udenlandske nøgle Author_ID Linker denne tabel til AUTHORS tabellen via sin primære nøgle Author_ID . Vi har skabt et forhold for at undgå en transitiv afhængighed, et nøgleudtryk af relationelle databaser.
AUTHORS bord:
- Author_ID → Forfatter: Det Forfatter afhænger af Author_ID .
- Forfatter → Author_Nationality: Nationaliteten kan bestemmes af forfatteren.
- Author_ID → Author_Nationality: Nationaliteten kan bestemmes ud fra Author_ID gennem Forfatter attribut. Vi har stadig en transitiv afhængighed.
Vi skal tilføje en tredje tabel for at normalisere disse data:
LANDE
Country_ID | Land |
---|---|
Coun_001 | Forenede Stater |
Coun_002 | Canada |
FORFATTERE
Author_ID | Forfatter | Country_ID |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Nu har vi tre tabeller, der bruger fremmednøgler til at forbinde tabellerne:
- BOOK bordets fremmednøgle Author_ID Linker en bog til en forfatter i AUTHORS tabellen.
- AUTHORS bordets fremmednøgle Country_ID forbinder en forfatter til et land i LAND-tabellen.
- Listerne har ingen udenlandsk nøgle, fordi det ikke er nødvendigt at linke til en anden tabel i dette design.
Hvorfor transitive afhængigheder er dårlig database design
Hvad er værdien af at undgå transitive afhængigheder for at sikre 3NF? Lad os overveje vores første bord igen og se de problemer, det skaber:
FORFATTERE
Author_ID | Forfatter | Bestil | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Ender's Game | Forenede Stater |
Auth_001 | Orson Scott Card | Børn i sindet | Forenede Stater |
Auth_002 | Margaret Atwood | Tjenestemandens Tale | Canada |
Denne form for design kan bidrage til dataanomalier og inkonsekvenser, for eksempel:
- Hvis du slettede de to bøger "Børn i sindet" og "Ender's Game", ville du slette forfatteren "Orson Scott Card" og hans nationalitet helt fra databasen.
- Du kan ikke tilføje en ny forfatter til databasen, medmindre du også tilføjer en bog; Hvad hvis forfatteren endnu ikke er offentliggjort, eller du ikke kender navnet på en bog, hun har forfattet?
- Hvis "Orson Scott Card" ændrede sit statsborgerskab, skal du ændre det i alle poster, hvor han vises. At have flere optegnelser med samme forfatter kan resultere i unøjagtige data: Hvad hvis dataindgangspersonen ikke er klar over, at der er flere poster for ham og ændrer dataene i kun én post?
- Du kan ikke slette en bog som "The Handmaid's Tale" uden også at slette forfatteren helt.
Det er bare nogle grunde til, at normalisering og undgå transitive afhængigheder, beskytte data og sikre konsistens.