Skip to main content

Transitiv avhengighet i en database

Computational Linguistics, by Lucas Freitas (April 2025)

Computational Linguistics, by Lucas Freitas (April 2025)
Anonim

En transitiv avhengighet i en database er et indirekte forhold mellom verdier i samme tabell som forårsaker en funksjonell avhengighet. For å oppnå normaliseringsstandarden for Tredje Normal Form (3NF), må du eliminere enhver transitiv avhengighet.

Av sin natur krever en transitiv avhengighet tre eller flere attributter (eller databasekolonner) som har en funksjonell avhengighet mellom dem, noe som betyr at kolonne A i et bord er avhengig av kolonne B gjennom en mellomliggende kolonne C.

La oss se hvordan dette kan fungere.

Eksempel på transitiv avhengighet

FORFATTERE

Author_IDForfatterBokAuthor_Nationality
Auth_001Orson Scott CardEnder's Gameforente stater
Auth_001Orson Scott CardEnder's Gameforente stater
Auth_002Margaret AtwoodTjenestemannens taleCanada

I AUTHORS eksempelet ovenfor:

  • Bok → Forfatter : Her, den Bok attributt bestemmer Forfatter Egenskap. Hvis du kjenner boknavnet, kan du lære forfatterens navn. Derimot, Forfatter bestemmer ikke Bok , fordi en forfatter kan skrive flere bøker. For eksempel, bare fordi vi kjenner forfatterens navn Orson Scott Card, vet vi fortsatt ikke boknavnet.
  • Forfatter → Author_Nationality : På samme måte, Forfatter attributt bestemmer Author_Nationality , men ikke omvendt; bare fordi vi vet nasjonalitet betyr ikke at vi kan bestemme forfatteren.

Men dette tabellen introduserer en transitiv avhengighet:

  • Bok → Author_Nationality: Hvis vi kjenner boknavnet, kan vi avgjøre nasjonaliteten via Forfatter-kolonnen.

Unngå transitive avhengigheter

For å sikre Tredje Normal Form, la oss fjerne den transitive avhengigheten.

Vi kan begynne med å fjerne Bok-kolonnen fra Forfatter-tabellen og opprette et eget Bøker-tabellen:

BØKER

Book_IDBokAuthor_ID
Book_001Ender's GameAuth_001
Book_001Barn av sinnetAuth_001
Book_002Tjenestemannens taleAuth_002

FORFATTERE

Author_IDForfatterAuthor_Nationality
Auth_001Orson Scott Cardforente stater
Auth_002Margaret AtwoodCanada

Gjorde dette fikse det? La oss undersøke våre avhengigheter nå:

Bøker bord:

  • Book_ID → Bok: De Bok kommer an på Book_ID .
  • Ingen andre avhengigheter i denne tabellen eksisterer, så vi har det bra. Merk at den utenlandske nøkkelen Author_ID kobler denne tabellen til AUTHORS tabellen gjennom sin primære nøkkel Author_ID . Vi har skapt et forhold for å unngå transitiv avhengighet, et nøkkeldesign av relasjonsdatabaser.

AUTHORS bord:

  • Author_ID → Forfatter: De Forfatter kommer an på Author_ID .
  • Forfatter → Author_Nationality: Nasjonaliteten kan bestemmes av forfatteren.
  • Author_ID → Author_Nationality: Nasjonaliteten kan bestemmes fra Author_ID gjennom Forfatter Egenskap. Vi har fortsatt en transitiv avhengighet.

Vi må legge til et tredje bord for å normalisere disse dataene:

LAND

Country_IDLand
Coun_001forente stater
Coun_002Canada

FORFATTERE

Author_IDForfatterCountry_ID
Auth_001Orson Scott CardCoun_001
Auth_002Margaret AtwoodCoun_002

Nå har vi tre bord, og benytter seg av utenlandske nøkler for å koble mellom bordene:

  • BOOK bordets utenlandske nøkkel Author_ID kobler en bok til en forfatter i AUTHORS-tabellen.
  • AUTHORS bordets utenlandske nøkkel Country_ID kobler en forfatter til et land i LAND-tabellen.
  • LAND-tabellen har ingen utenlandsk nøkkel fordi det ikke er nødvendig å lenke til et annet bord i dette designet.

Hvorfor Transitive Dependence er dårlig database design

Hva er verdien av å unngå transitive avhengigheter for å sikre 3NF? La oss se på vårt første bord igjen og se problemene det oppretter:

FORFATTERE

Author_IDForfatterBokAuthor_Nationality
Auth_001Orson Scott CardEnder's Gameforente stater
Auth_001Orson Scott CardBarn av sinnetforente stater
Auth_002Margaret AtwoodTjenestemannens taleCanada

Denne typen design kan bidra til dataforstyrrelser og inkonsekvenser, for eksempel:

  • Hvis du slettet de to bøkene "Children of the Mind" og "Ender's Game", ville du slette forfatteren "Orson Scott Card" og hans nasjonalitet helt fra databasen.
  • Du kan ikke legge til en ny forfatter i databasen, med mindre du også legger til en bok; hva hvis forfatteren ennå ikke er publisert eller du ikke kjenner navnet på en bok hun har forfatter?
  • Hvis "Orson Scott Card" endret statsborgerskapet, må du endre det i alle poster der han vises. Å ha flere poster med samme forfatter kan resultere i unøyaktige data: hva hvis datainngangen ikke skjønner det er flere poster for ham og endrer dataene i bare én plate?
  • Du kan ikke slette en bok som "The Handmaid's Tale" uten å også slette forfatteren helt.

Dette er bare noen grunner til at normalisering, og unngå transitiv avhengighet, beskytte data og sikre konsistens.