Een afhankelijkheid is een beperking die van toepassing is op of de relatie tussen attributen definieert. Het komt voor in een database wanneer informatie die is opgeslagen in dezelfde databasetabel op unieke wijze andere informatie bepaalt die in dezelfde tabel is opgeslagen. Je kunt dit ook omschrijven als een relatie waarbij het kennen van de waarde van een attribuut (of een set attributen) voldoende is om je de waarde van een ander attribuut (of een set attributen) in dezelfde tabel te vertellen. Database-afhankelijkheden verwarren vaak zowel studenten als databaseprofessionals. Gelukkig zijn ze niet zo ingewikkeld als ze lijken. Ze kunnen het beste worden uitgelegd aan de hand van enkele voorbeelden. Hier zullen we veelvoorkomende typen database-afhankelijkheid onderzoeken.
Database-afhankelijkheden en functionele afhankelijkheden
Zeggen dat er een afhankelijkheid is tussen attributen in een tabel is hetzelfde als zeggen dat er een functionele afhankelijkheid is tussen die attributen. Als er een afhankelijkheid in een database is, zodat attribuut B afhankelijk is van attribuut A, dan zou je dit schrijven als: A -> B
In een tabel met kenmerken van werknemers, waaronder Burgerservicenummer (BSN) en naam, kan bijvoorbeeld worden gezegd dat de naam afhankelijk is van het BSN (of BSN -> naam) omdat de naam van een werknemer op unieke wijze kan worden bepaald aan de hand van een BSN. De omgekeerde verklaring (naam -> SSN) is echter niet waar omdat meer dan één medewerker dezelfde naam kan hebben, maar altijd verschillende SSN’s.
Triviale functionele afhankelijkheden
Een triviale functionele afhankelijkheid treedt op wanneer u een functionele afhankelijkheid van een attribuut beschrijft van een verzameling attributen die het originele attribuut bevat. {A, B} -> B is bijvoorbeeld een triviale functionele afhankelijkheid, evenals {naam, SSN} -> SSN. Dit type functionele afhankelijkheid wordt triviaal genoemd omdat het kan worden afgeleid uit gezond verstand. Het is duidelijk dat als je de waarde van B al kent, de waarde van B op unieke wijze kan worden bepaald door die kennis.
Volledige functionele afhankelijkheden
Een volledige functionele afhankelijkheid treedt op wanneer u al voldoet aan de vereisten voor een functionele afhankelijkheid en de set attributen aan de linkerkant van de functionele afhankelijkheidsverklaring niet verder kan worden verminderd. {SSN, leeftijd} -> naam is bijvoorbeeld een functionele afhankelijkheid, maar het is geen volledige functionele afhankelijkheid omdat u de leeftijd aan de linkerkant van de instructie kunt verwijderen zonder de afhankelijkheidsrelatie te beïnvloeden.
Transitieve afhankelijkheden
Transitieve afhankelijkheden treden op wanneer er een indirecte relatie is die een functionele afhankelijkheid veroorzaakt. A -> C is bijvoorbeeld een transitieve afhankelijkheid wanneer deze alleen waar is omdat zowel A -> B als B -> C waar zijn.
Meerwaardige afhankelijkheden
Meerwaardige afhankelijkheden treden op wanneer de aanwezigheid van een of meer rijen in een tabel de aanwezigheid van een of meer andere rijen in diezelfde tabel impliceert. Stel je bijvoorbeeld een autobedrijf voor dat veel automodellen produceert, maar van elk model altijd zowel rode als blauwe kleuren maakt. Als u een tabel hebt met de modelnaam, kleur en het jaar van elke auto die het bedrijf produceert, is er een meerwaardige afhankelijkheid in die tabel. Als er een rij voor een bepaalde modelnaam en jaar in het blauw staat, moet er ook een soortgelijke rij zijn die overeenkomt met de rode versie van diezelfde auto.
Belang van afhankelijkheden
Database-afhankelijkheden zijn belangrijk om te begrijpen omdat ze de basisbouwstenen bieden die worden gebruikt bij databasenormalisatie, het proces van het efficiënt organiseren van gegevens in een database. Bijvoorbeeld:
- Om ervoor te zorgen dat een tabel de tweede normaalvorm (2NF) heeft, mag er geen geval zijn van een niet-prime-attribuut in de tabel dat functioneel afhankelijk is van een subset van een kandidaatsleutel.
- Om een tabel in de derde normaalvorm (3NF) te laten zijn, moet elk niet-prime-attribuut een niet-transitieve functionele afhankelijkheid hebben van elke kandidaatsleutel.
- Om een tabel in Boyce-Codd Normal Form (BCNF) te laten zijn, moet elke functionele afhankelijkheid (behalve triviale afhankelijkheden) op een supersleutel staan.
- Om een tabel in de vierde normaalvorm (4NF) te laten zijn, mag deze geen meerwaardige afhankelijkheden hebben.