Oefening 1 Bedenk een voorbeeld van een vreemde sleutel die naar de eigen relatie verwijst.
Oplossing 1 Bijvoorbeeld een werknemer die leiding geeft aan andere werknemers.
Oefening 2 Gegeven is de relatie R (a, b, c, d). Geef voor de onderstaande gevallen de normaalvorm waarin R zich bevindt. a) a,b c ; a,b d ; c d. b) a,b d ; a c. c) a,b c ; a,b d. d) a,b,c d ; d a. e) a,b,c d ; d a ; d b ; d c. f) a b ; a c ; a d ; b a ; b c. g) a b ; a c ; a d ; b c ; b d. h) a b ; a c ; a d ; b a ; c d.
Oplossing 2 a) 2NF b) 1NF c) 3NF & BCNF d) 3NF e) 3NF & BCNF f) 3NF & BCNF want b -> d geldt ook zodat zowel a als b kandidaatsleutel zijn. g) 2NF er zijn transitieve afhankelijkheden. h) 2NF a en b zijn kandidaatsleutel maar er is een transitieve afhankelijkheid.
Oefening 3 Gegeven is de relatie R (a, b, c, d, e) en de volgende functionele afhankelijkheden: a b ; a d ; b,c e ; c e ; c a ; c b. In welke normaalvorm is het model? Indien R niet in BNCF is, transformeer het dan tot BNCF.
Oplossing 3 c b volgt uit c a en a b ; b,c e volgt uit c e en c b. Dus c is de primaire sleutel van de relatie. De relatie is in 2NV maar niet in 3NV want er zijn de transitieve afhankelijkheden a b en a d. Om naar 3NV en BCNV te gaan splitsen we de relatie in: R1 (c,a,e) R2 (a,b,d).
Oefening 4 Gegeven is de relatie R (a, b, c, d, e, f) met de functionele afhankelijkheden: a,b c,d,e,f a d d e d f. Normaliseer naar BCNF.
Oplossing 4 a,b is de primaire sleutel. Relatie is in 1NF want d is afhankelijk van deel van de sleutel. Om naar 2NF te gaan: R1 (a,b,c) R2 (a,d,e,f). Om naar 3NF te gaan: R1 (a,b,c) R2 (a,d) R3 (d,e,f).
Oefening 5 Een groot detailhandelsbedrijf X betrekt goederen van diverse kleine leveranciers. Bedrijf X geeft hiertoe bestelbonnen uit die naar de leveranciers worden verstuurd. De bestelbonnen zien er uit zoals op de pagina die volgt. De volgende aannames zijn er: Op een bon staan 1 tot 30 bestellingen van verschillende artikelen. De stukprijzen variëren tussen leveranciers; bij elke nieuwe bon kan elke leverancier bovendien een andere prijs opgeven. Er woont nooit meer dan 1 leverancier op één adres. Bonnummers worden eenmalig uitgegeven en dan naar verschillende leveranciers gestuurd met ingevulde artikelnummers en aantallen. De leverancier stuurt de bon terug naar bedrijf X met ingevulde prijzen en leverdatum, en levert alle artikelen van de bon in één keer op de leveringsdatum. X kiest dan op basis van leveringsdatum en prijs de leverancier die de bestelling mag leveren. Enkel de gekozen bestelling wordt in de databank bijgehouden. Maak van dit model een genormaliseerde gegevensstructuur. Begin met vooreerst alle attributen in één tabel te stoppen als volgt (we gebruiken geen herhaalde groepen): bestelling (bonnummer, artikelnummer, stukprijs, aantal, prijs, leveranciersnummer, adres, postcode, woonplaats, leveringsdatum) Spoor functionele afhankelijkheden op. Welke kandidaat-sleutels zijn er? Kies een identificerende sleutel. Normaliseer en leg bij elke stap uit waarom het model beter is dan het vorige.
Oefening 5 (vervolg) Leveranciernummer: Bonnummer: Adres: Leveringsdatum: Postcode: Woonplaats: Artikel Stukprijs Aantal Prijs Artikel Stukprijs Aantal Prijs................................................................................................ Subtotaal: Overgedragen: Totaal:
Oplossing 5 Welke zijn de functionele afhankelijkheden? leveranciersnummer -> adres, postcode, woonplaats postcode -> woonplaats woonplaats, adres -> leveranciersnummer postcode, adres -> leveranciersnummer bonnummer -> leveranciersnummer, leveringsdatum bonnummer, artikelnummer -> stukprijs, aantal, prijs De enige primaire sleutel die we kunnen vinden is artikelnummer, bonnummer. De tabel is in 1NF maar niet in 2NF want sommige attributen hangen slechts af van een deel van de sleutel. Om naar 2NF te gaan splitsen we de relatie als volgt: bestelling (bonnummer, leveranciersnummer, adres, postcode, woonplaats, leveringsdatum) lijn (bonnummer, artikelnummer, stukprijs, aantal, prijs) We hebben nu 2NF maar geen 3NF want er zijn nog transitieve afhankelijkheden. We werken die als volgt weg: bestelling (bonnummer, leveranciersnummer, leveringsdatum) leverancier (leveranciersnummer, adres, postcode) woonplaats (postcode, woonplaats) lijn (bonnummer, artikelnummer, stukprijs, aantal, prijs)
Oefening 6 Bekijken we een eenvoudige video bibliotheek: Elke video heeft een titel, een regisseur en een uniek serienummer. Uitleners hebben een naam, adres en lidnummer. Van elke video bestaat er maar één exemplaar. De databank bevat de verhuur van video's aan uitleners. Het model dat we krijgen ziet er als volgt uit: verhuur (titel, regisseur, serienummer, naam, adres, lidnummer, datum) a) Spoor functionele afhankelijkheden op. b) Welke kandidaat-sleutels zijn er? Kies een identificerende sleutel. c) Normaliseer en leg bij elke stap uit waarom het model beter is dan het vorige.
Oplossing 6 Welke zijn de functionele afhankelijkheden? serienummer -> titel, regisseur lidnummer -> naam, adres De enige primaire sleutel die we kunnen vinden is serienummer, lidnummer, datum. We zitten al in 1NF maar niet in 2NF want sommige attributen hangen slechts af van een deel van de sleutel. Om naar 2NF te gaan splitsen we als volgt: video (serienummer, titel, regisseur) uitlener (lidnummer, naam, adres) verhuur (lidnummer, serienummer, datum) Relatie is nu ook in 3NF en in BCNF.
Oefening 7 Normaliseer het volgende model. Het model geeft het rapport weer voor één student. Elke student kan één of meerdere hoofdvakken volgen en elk hoofdvak bestaat uit een aantal vakken waarvoor er punten worden gegeven. rapport (studentnummer, studentnaam, (hoofdvak, mentor, (vaknummer, vaktitel, leraar, lokaal, punten))) De afhankelijkheden zijn de volgende: studentnummer -> studentnaam vaknummer vaktitel,leraar leraar lokaal studentnummer, vaknummer, hoofdvak punten studentnummer, hoofdvak mentor
Oplossing 7 Het model is niet in 1NF. Om naar 1NF te gaan splitsen we als volgt: student (studentnummer, studentnaam) hoofdvak (studentnummer, hoofdvak, mentor) vak (studentnummer, hoofdvak, vaknummer, vaktitel, leraar, lokaal, punten) We zitten niet in 2NF. Om naar 2NF te gaan: student (studentnummer, studentnaam) hoofdvak (studentnummer, hoofdvak, mentor) punten (studentnummer, hoofdvak, vaknummer, punten) vak (vaknummer, vaktitel, leraar, lokaal) We zitten niet in 3NF. Om naar 3NF te gaan: student (studentnummer, studentnaam) hoofdvak (studentnummer, hoofdvak, mentor) punten (studentnummer, hoofdvak, vaknummer, punten) vak (vaknummer, vaktitel, leraar) leraar (leraar, lokaal)