Ett transitivt beroende i en databas är ett indirekt förhållande mellan värden i samma tabell som orsakar ett funktionellt beroende. För att uppnå normaliseringsstandarden för tredje normala formuläret (3NF) måste du eliminera alla transitiva beroende.
Av sin natur kräver ett transitivt beroende tre eller flera attribut (eller databaskkolumner) som har ett funktionellt beroende mellan dem, vilket betyder att kolumn A i ett bord beror på kolumn B genom en mellanliggande kolumn C.
Låt oss se hur det här kan fungera.
Transitivt beroende exempel
FÖRFATTARE
Author_ID | Författare | bok | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Enders spel | Förenta staterna |
Auth_001 | Orson Scott Card | Enders spel | Förenta staterna |
Auth_002 | Margaret Atwood | Tjänstemanens Tale | kanada |
I AUTHORS exempel ovan:
- bok → Författare : Här, den bok attributet bestämmer Författare attribut. Om du känner till boknamnet kan du lära sig författarens namn. Dock, Författare bestämmer inte bok , eftersom en författare kan skriva flera böcker. Till exempel, bara för att vi känner till författarens namn Orson Scott Card, vet vi fortfarande inte boknamnet.
- Författare → Author_Nationality : Likaså Författare attributet bestämmer Author_Nationality , men inte tvärtom; bara för att vi vet nationaliteten betyder inte att vi kan bestämma författaren.
Men denna tabell introducerar ett transitivt beroende:
- bok → Author_Nationality: Om vi känner till boknamnet kan vi bestämma nationaliteten via kolumnen författare.
Undvik Transitiv Beroende
För att säkerställa tredje normala formuläret, låt oss ta bort det transitiva beroendet.
Vi kan börja med att ta bort kolumnen Bok från författarbordet och skapa ett separat böckerstabell:
BÖCKER
Book_ID | bok | Author_ID |
---|---|---|
Book_001 | Enders spel | Auth_001 |
Book_001 | Barn av sinnet | Auth_001 |
Book_002 | Tjänstemanens Tale | Auth_002 |
FÖRFATTARE
Author_ID | Författare | Author_Nationality |
---|---|---|
Auth_001 | Orson Scott Card | Förenta staterna |
Auth_002 | Margaret Atwood | kanada |
Rättade det här? Låt oss undersöka våra beroenden nu:
BOOKS-bordet:
- Book_ID → Bok: De bok beror på Book_ID .
- Inga andra beroenden i denna tabell finns, så vi är okej. Observera att den främmande nyckeln Author_ID länkar denna tabell till AUTHORS-tabellen genom sin primära nyckel Author_ID . Vi har skapat ett förhållande för att undvika ett transitivt beroende, en nyckeldesign av relationsdatabaser.
Författare bordet:
- Author_ID → Författare: De Författare beror på Author_ID .
- Författare → Author_Nationality: Nationaliteten kan bestämmas av författaren.
- Author_ID → Author_Nationality: Nationaliteten kan bestämmas från Author_ID genom Författare attribut. Vi har fortfarande ett transitivt beroende.
Vi måste lägga till en tredje tabell för att normalisera denna data:
LÄNDER
Country_ID | Land |
---|---|
Coun_001 | Förenta staterna |
Coun_002 | kanada |
FÖRFATTARE
Author_ID | Författare | Country_ID |
---|---|---|
Auth_001 | Orson Scott Card | Coun_001 |
Auth_002 | Margaret Atwood | Coun_002 |
Nu har vi tre bord, med hjälp av främmande nycklar för att länka mellan borden:
- BOOK bordets främmande nyckel Author_ID länkar en bok till en författare i tabellen AUTHORS.
- AUTHORS tabellen är främmande nyckel Country_ID länkar en författare till ett land i tabellen LÄNDER.
- LÄNDER-tabellen har ingen utländsk nyckel eftersom det inte finns något behov av att länka till en annan tabell i den här designen.
Varför transitiva beroenden är dålig databasdesign
Vad är värdet av att undvika transitiva beroenden för att säkerställa 3NF? Låt oss överväga vårt första bord igen och se de problem det skapar:
FÖRFATTARE
Author_ID | Författare | bok | Author_Nationality |
---|---|---|---|
Auth_001 | Orson Scott Card | Enders spel | Förenta staterna |
Auth_001 | Orson Scott Card | Barn av sinnet | Förenta staterna |
Auth_002 | Margaret Atwood | Tjänstemanens Tale | kanada |
Denna typ av design kan bidra till dataavvikelser och inkonsekvenser, till exempel:
- Om du raderade de två böckerna "Barn av sinnet" och "Ender's Game" skulle du radera författaren "Orson Scott Card" och hans nationalitet helt från databasen.
- Du kan inte lägga till en ny författare i databasen såvida du inte lägger till en bok. vad händer om författaren ännu inte är offentliggjord eller du inte vet namnet på en bok som hon har författat?
- Om "Orson Scott Card" ändrade sitt medborgarskap, skulle du behöva ändra det i alla poster där han visas. Att ha flera poster med samma författare kan resultera i felaktiga data: Vad händer om datainmatningspersonen inte inser att det finns flera poster för honom och ändrar data i en enda post?
- Du kan inte ta bort en bok som "The Handmaid's Tale" utan att helt och hållet radera författaren.
Det här är bara några orsaker till att normalisering och undvikande av transitiva beroenden skyddar data och säkerställer konsekvens.