Professional Documents
Culture Documents
Oefeningen ERD - Normalisatie
Oefeningen ERD - Normalisatie
Oefening: De filmadministratie
Je wenst een eigen administratie op te stellen voor het verwerken van filmgegevens.
Bij elke film hoort de lijst met acteurs en het personage dat zij in de film speelden.
Bedoeling is ook de gegevens over de volledige filmcrew te verwerken. De filmcrew
bestaat uit de regisseur, cameramensen, ... Uiteindelijk wil je volgende overzicht
kunnen afdrukken:
FilmID: 1999/57
Titel: Bicentennial Man
Productiehuis: Touchstone Pictures
Release Date: 17/12/99
Korte inhoud: In the first decade of the new millenium, ....
Acteur Personage
Main Cast: Robin Williams Andrew Martin
Sam Neill Sir
Ioliver Platt Rupert Burns
...
MPAA rating: PG
Begrippen:
Entiteit:
■ Crew
■ Film
■ Auteur
■ Productiehuis
Attribuut:
■ Inhoud
■ Titel
■ Datum
1
Productiehuis Personage
Functie
0NF
Film = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate, KorteInhoud,
{ActeurID,Acteurvoornaam, Acteurfamilienaam, Personnage}, Rating,
{CrewID, CrewVoornaam, Crewfamilienaam, Functie})
1NF
Film = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate,
KorteInhoud, Rating)
Cast = (FilmID, ActeurID, ActeurVoornaam, ActeurFamilienaam, Personage)
CrewDetails = (FilmID, CrewID, Crewvoornaam, CrewFamilienaam, Fucntie)
2NF
→ Elke afhankelijkheid afsplitsen: enkel kijken naar tabellen met samengestelde
sleutel
Film = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate,
KorteInhoud, Rating)
Cast = (FilmID, ActeurID, Personage)
Acteur = (ActeurID, ActeurVoornaam, ActeurFamilienaam)
CrewDetails = (FilmID, CrewID, functie)
Crew = (CrewID, CrewVoornaam, CrewAchternaam)
3NF
Fim = (FilmID, Titel, ProductiehuisID, ReleaseDate, KorteInhoud, Rating)
Productiehuis = (ProductiehuisID, Productiehuis)
Cast = (FilmID, ActeurID, Personage)
Acteur= (ActeurID, ActeurVoornaam, ActeurFamilienaam)
CrewDetails = (FilmID, CrewID, functie)
Crew = (CrewID, CrewVoornaam, CrewAchternaam)
EXTRA VRAAG:
2
Wij zijn er bij opgave van uitgegaan dat iemand van de technische ploeg slechts 1
functie kan uitoefenen. Stel welke gevolgen heeft het voor organisatie en voor het
ERD als iemand van de technische ploeg meerdere functies zou hebben.
Stel dat je al jaren fan bent van het songfestival en dat je alle gegevens hierover
bijhoudt in een database. Van elk festival noteer je telkens de plaats (land en stad)
waar het wordt georganiseerd en de datum wanneer het plaatsvindt. Je houdt ook in
detail bij welke scores de deelnemende artiesten verkregen van de verschillende
landen. Je kan dan ook het volgende overzicht afdrukken voor elk songfestival ! Je
moet dus uit je databank informatie kunnen halen zoals hoeveel keer een land heeft
meegedaan, de totaalscore van land in een bepaald jaar, …
Normaliseer het onderstaande rapport:
Songfestival: 2003
Plaats: Riga, Letland
Datum: 24/mei
Land: Turkije
Artiest: Hannelore Casteels
Lied: Ik ben vandaag zo vrolijk
Score overzicht punten voorronde
Land: Punten
België 12
Nederland 10
Rusland 10
…
Totaal 167
Score finale
Land: Punten
Frankrijk 12
Duitsland 10
Rusland 9
…
Totaal 134
Land: België
Artiest: Hannelore Casteels Senior
Lied: Sanomi memeee amimameeemamooeeeeee
Score overzicht punten voorronde
Land: Punten
Turkije 8
Nederland 5
Rusland 12
…
Totaal 165
Score finale
3
Land: Punten
Duitsland 10
Rusland 9
Nederland 12
…
Totaal 109
Land
Song
Deelnemend
land
???
Je hebt een bureau dat sponsoring zoekt voor projecten van klanten. Je ontwerpt zelf
een database voor het verwerken van je klantengegevens met hun projecten en
zorgt ervoor dat je een overzicht kan drukken van alle sponsorgelden die je hebt
verzameld. Alle anonieme giften worden onder de persoon anoniem ondergebracht.
Hierdoor kan een persoon (bv “anoniem”) meerdere keren sponsorgeld storten. Ook
personen waarvan de naam is gekend, kunnen meerdere keren sponsorgeld storten.
Van elke storting aan sponsorgeld moet steeds het bedrag en de datum van de
storting worden bijgehouden.
Je organiseert in overleg met de klant ook evenementen om aan sponsoring te
komen. Er zijn wel kosten verbonden aan dergelijke evenementen. Dus per
evenement moet je een overzicht kunnen geven van de gemaakte kosten.
4
Teken het ERD
5
Klant Project Omschrijving
Vereist
bedrag
Evenement
Bedrag
Sponsoring
Datum Inkomsten
UitgavePost
Sponsor
Omschrijving Bedrag
Sponsoring
0NF
Project = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag, {SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode, SponsorGemeente, Bedrag, Datum}, {EvenementID,
Evenement, EvenementDatum, {Uitgave, UitgaveBedrag}, Inkomsten})
1NF
Project = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag)
Sponsoring = (ProjectID, SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode, SponsorGemeente, Bedrag, Datum)
Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)
→ ProjectID hier geen sleutel omdat je anders niet weet bij welk project het
evenement hoort
EvenementID = enkelvoudige sleutel
Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)
→ EvenementID is geen sleutel
UitgaveID = enkelvoudige sleutel
ProjectID bij de voorlaatste en EvenementID bij de laatste zijn geen sleutels omdat
we er vanuit gaan dat een evenement / uitgave sowieso bij 1 project / evenement
hoort → dus moet je niet meer expliciet vermelden, maar moet wel opgenomen
worden in de tabel om de relatie met de vorige tabel aan te duiden
2NF
Project = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,
VereistBedrag)
Sponsoring = (ProjectID, SponsorID, Bedrag, Datum)
Sponsor = (SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode, SponsorGemeente)
6
Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)
Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)
3NF
Project = (ProjectID, Project, KlantID, VereistBedrag)
Klant = (KlantID, Vereniging, Adres, Postcode)
Gemeente = (Postcode, Gemeente)
Sponsoring = (ProjectID, SponsorID, Bedrag, Datum)
Sponsor = (SponsorID, Voornaam, Familienaam, SponsorAdres,
SponsorPostcode)
SponsorGemeente = (SponsorPostcode, SponsorGemeente)
→ Want wordt al geheel vermeld in entiteit Gemeente
Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)
Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)
Een grote boekhandel beslist om een electronic bookshop te creëren via hun
website. Bezoekers van de website krijgen een elektronische caddy. Telkens zij een
boek wensen te kopen, nemen zij dit boek op in hun caddy. Bij het afsluiten van de
aankopen, moet de klant zijn persoonlijke gegevens opgeven.
Bestaande klanten vullen hiervoor hun klantnummer in waarna zijn persoonlijke
gegevens worden opgehaald. Nieuwe klanten moeten in een apart formulier hun
gegevens invullen, waarna een klantnummer wordt aangemaakt. Elke klant moet het
nummer van zijn kredietkaart ingeven vooraleer de aankoop kan worden bevestigd.
Een klant kan in principe bij elke aankoop een verschillende kredietkaart opgeven.
Na het bevestigen van de caddy krijgt de klant volgende overzicht van zijn aankopen:
7
De nummer van het kredietkaart moet elke keer opnieuw opgegeven worden, dus dit
nummer wordt niet verbonden met de klantgegevens
Begrippen:
- Caddy
- Customer
- Book
Klant Creditcard
Caddy Number
Caddy
Content
Book
Totaal boek → kan je opnemen in je ERD, maar dit is niet noodzakelijk. Het is een
berekend attribuut
In cirkel met stippellijnen aan 'CaddyContent'
0NF
Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber, {ISBN, Title,
{AuteurID, AuteurVoornaam, AuteurFamilienaam}, Quantity, Price})
1NF
Voorbereidende stap:
Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)
CaddyContent = (CaddyNumber, ISBN, Title, {AuteurID, AuteurVoornaam,
AuteurFamilienaam}, Quantity, Price)
Volledig uitgewerkt:
Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)
CaddyContent = (CaddyNumber, ISBN, Title, Quantity, Price) → samengestelde
sleutel
Auteursteam = (ISBN, AuteurID, AuteurVoornaam, AuteurFamilienaam)
→ samengestelde sleutel
2NF
Caddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,
Address, Postalcode, Gemeente, CreditcardNumber)
CaddyContent = (CaddyNumber, ISBN, Quantity)
8
Book = (ISBN, Title, Price)
Auteursteam = (ISBN, AuteurID)
Auteur = (AuteurID, AuteurVoornaam, AuteurFamilienaam)
3NF
Caddy = (CaddyNumber, Date, CustomerNumber, CreditcardNumber)
Customer = (CustomerNumber, Voornaam, Familienaam, Address, Postalcode,
Gemeente)
CaddyContent = (CaddyNumber, ISBN, Quantity)
Book = (ISBN, Title, Price)
Auteursteam = (ISBN, AuteurID)
Auteur = (AuteurID, AuteurVoornaam, AuteurFamilienaam)
Gemeente = (Postalcode, Gemeente)
Oefening: De souvenierverkoop
Een bedrijfje dat souveniers verkoopt, heeft niet alleen een winkel maar heeft ook
een aantal verkopers in dienst die met hun souvenierkarretje erop uittrekken om
souveniers te verkopen. Elke verkoper kiest elke week (van maandag tot zondag)
een locatie uit waar hij de hele week blijft staan.
De prijs van een souvenier kan verschillend zijn, afhankelijk van de plaats waar het
souvenierkarretje is opgesteld (of met andere woorden: afhankelijk van de plaats
waar het wordt verkocht). Op eenzelfde plaats geldt echter wel steeds dezelfde prijs
voor dat souvenier, ongeacht de verkoper. Op het einde van elke dag brengt elke
verkoper een overzicht binnen wat die dag precies werd verkocht.
Normaliseer het volgende overzicht (voorzie extra velden voor de sleutels):
Aard van het rapport gaat een goede hint geven van de herhalende groepen
Begrippen:
- Verkoper
- Plaats
- Weeknummer
- Artikel
- Plaats en artikel bepalen prijs
9
Datum PlaatsID
Verkoper Plaats
Verkoop
Locatie
PlaatsID VerkoperID
Aanbod
ArtikelID
Artikel
Datum
0NF
Verkoper = (VerkoperID, Voornaam, Familienaam, {PlaatsID, Plaats, Datum,
{ArtikelID, Artikel, Prijs, Aantal}})
1NF
→ Zorgen dat er geen herhalende groepen meer zijn
Verkoper = (VerkoperID, Voornaam, Familienaam)
VerkoopLocatie = (VerkoperID, PlaatsID, Plaats, Datum)
→ Datum onderstreept: 1 verkoper op 1 datum op 1 plaats
VerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Artikel, Prijs, Aantal)
2NF
→ Niet-sleutelvelden onafhankelijk maken
Verkoper = (VerkoperID, Voornaam, Familienaam)
VerkoopLocatie = (VerkoperID, PlaatsID, Datum)
Plaats = (PlaatsID, Plaats)
VerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Aantal)
Artikel = (ArtikelID, Artikel)
PrijsLocatie = (ArtikelID, PlaatsID, Prijs)
1
3NF
= 2NF
Sitautieschets:
Een bedrijf verkoopt goederen aan haar klanten. Per order kan een klant meerdere
producten bestellen. De prijzen van de goederen kunnen doorheen het jaar variëren,
maar natuurlijk wil het bedrijf op het einde van het jaar de juiste omzet kunnen
berekenen.
De orders van de klanten worden niet in één keer naar de klant verzonden. Als een
klant bv. 5 stuks van product X besteld en 7 stuks van product Y, dan is het mogelijk
dat er eerst een verzending en facturatie gebeurt van 3 stuks van product X en 4
stuks van product Y en nadien een tweede verzending en facturatie van de
overblijvende goederen. Bij één order kunnen dus meerdere facturen/verzendingen
horen. Een factuur/verzending is natuurlijk gekoppeld aan één order. Op elke factuur
wordt steeds nauwkeurig afgedrukt welke en hoeveel producten er worden
gefactureerd. Het is ook mogelijk dat bij een order nog geen enkele verzending en
facturatie is gebeurd.
Oefening: De consultants
De firma ABC Consultants verhuurt haar werknemers aan klanten waar zij
meewerken aan projecten. Elk project krijgt een unieke identificatiecode. Een
medewerker kan in dezelfde periode tegelijkertijd aan meerdere projecten bij
verschillende klanten meewerken.
Per project wordt een kilometervergoeding vastgelegd (aantal km + bedrag per km)
dat geldig is voor alle werknemers die aan het betreffende project meewerken. Indien
een werknemer niet bij de klant aan het project werkt, maar bij de firma ABC
Consultants, worden 0 km opgegeven. Om de facturen te kunnen maken, moet elke
medewerker een time sheet bijhouden. Hierbij noteert hij per dag aan welke
projecten hij heeft gewerkt. De medewerkers noteren dit telkens per dagdeel (DAG =
volledige dag, VM = voormiddag, NM= namiddag).
1
Oefening: oogartsenpraktijk
1
personeelslid het onderzoek heeft uitgevoerd. Ook bij het standaard ‘consultatie
oogarts’ wordt de oogarts automatisch genoteerd. De reden hiervoor is dat men op
die manier kan nagaan welke patiënten niet behandeld zijn geweest door zijn
normale oogarts. Bij ziekte van een oogarts probeert men immers zijn patiënten te
verwittigen en een nieuwe afspraak te maken. Bij dringende dossiers zal men
trachten de patiënt door een andere oogarts te laten behandelen.
Zodra alle voorbereidende onderzoeken zijn uitgevoerd, zal de patiënt door zijn
oogarts in de wachtkamer worden opgehaald voor de consultatie. Ook de oogarts
noteert de uitslag van zijn onderzoek.
Teken het ERD voor dit systeem en neem de belangrijkste attributen erin op zoals je
ze uit deze beschrijving kunt afleiden.
Oefening: De masterproeven
1
Normaliseer het bovenstaande rapport
Oefening: De wijnhandelaar
Je wordt in België wijnverdeler van Sloveense wijn. Je wenst hiervoor een database
te ontwerpen waarin je alle gegevens van de sloveense wijnen en hun wijnbouwers
kunt verwerken.
Normaliseer de gegevens vanhet onderstaande rapport.Let op: een wijnsoort kan
natuurlijk door meerdere wijnhuizen worden verkocht. Voorzie de nodige sleutels.
De kamporganisatie
Deel 1: ERD
Een jeugdorganisatie organiseert elk jaar een zomerkamp. De organisatie heeft de
beschikking over een terrein met verschillende blokhutten waarin telkens een 15-tal
1
deelnemers kunnen overnachten. Elke deelnemer wordt aan een blokhut
toegewezen. Binnen de groep 'kampeerders' van een blokhut is er steeds een
'blokhutleider' die toezicht houdt. Er worden verschillende wedstrijden en activiteiten
georganiseerd en alle leden van eenzelfde blokhut nemen telkens allemaal deel van
een activiteit. Aan het begin van het zomerkamp beslissen alle deelnemers van een
blokhut aan welke zij deelnemen. Het is niet de bedoeling dat de jeugdorganisatie ba
het zomerkamp de gegevens (wie in welke blokhut zat of de activiteiten waaraan een
blokhut deelnam) bijhoudt.
- Blokhut
- Deelname
- Leider: ja/nee veld
- Activiteiten
Als je 1 deelnemer mist, klopt je databank niet meer → veel-op-veel relatie tussen
deelnemer en activiteit deze relatie dus niet tekenen
Blokhut Deelnemer
Herhalende
Deelname Leider groep
samenstelling
Deel 2: Normalisatie
Normaliseer het volgende rapport:
1
0NV
Blokhut = (BlokhutID, Omschrijving, {DeelnemerID, Naam, Voornaam,
Geboortedatum, Leider}, {Datum, ActiviteitID, OmschrijvingActiviteit,
Bedrag, Score})
→ 1ste herhalende groep: Deelnemers
→ 2de herhalende groep: DeelnemersActiviteit
1NV
Blokhut = (BlokhutID, Omschrijving)
Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)
DeelnameActiviteit = (BlokhutID, Datum, ActiviteitID, OmschrijvingActiviteit, Bedrag,
Score)
2NV
Blokhut = (BlokhutID, Omschrijving)
Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)
DeelnameActiviteit = (BlokhutID, ActiviteitID, Score)
Activiteiten = (ActiviteitID, Datum, OmschrijvingActiviteit, Bedrag)
3NV = 2NV
Deel 3: SQL
De volgende database bevat de gegevens van de organisatoren van een
zomerkamp.
De deelnemers zijn ondergebracht in blokhutten, die aan activiteiten deelnemen. Alle
deelnemers van een blokhut nemen steeds deel aan dezelfde activiteiten. Per
blokhut is er een blokhutleider. De databank bevat gegevens van 1 zomerkamp.
1
Betekenis van de tabellen:
- tblDeelnemers deelnemers aan het zomerkamp
- tblBlokhutten de verschillende blokhutten die tijdens het zomerkamp
gebruikt kunnen worden
- tblBlokhutSamenstelling geeft aan welke deelnemer in welke blokhut logeert. Het
veldje leider is een Yes/No veld dat aangeeft of die
persoon de blokhutleider is
- tblActiviteiten de verschillende activiteiten die worden georganiseerd
- tblDeelname geeft per blokhut weer aan welke activiteiten de blokhut
deelneemt
Blokhut Deelname
BlokhutID
BlokhutID Activiteit
Blokhut
samenstelling
DeelnemerI
D
Jaar
Deelnemer
DeelnemerI
D
1
1. Welke blokhutten zijn tijdens het zomerkamp niet in gebruik? Geef enkel de
omschrijving van deze blokhutten.
Tweede stap: selecteer alle blokhutten die niet in de voorgaande lijst voorkomen
SELECT Omschrijving
FROM tblBlokhutten
WHERE BlokhutID NOT IN
(SELECT BlokhutID
FROM tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON
tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)
Oplossing:
SELECT AantalDeelnemers * Bedrag AS TotaalBedrag
FROM (SELECT tblActiviteit.ActiviteitID, Count(DeelnemerID) As AantalDeelnemers,
Bedrag
FROM (((tblActiviteiten INNER JOIN tblDeelname ON tblActiviteiten.ActiviteitenID =
tblDeelname.ActiviteitID) INNER JOIN tblBlokhutten ON tblBlokhutten.BlokhutID =
tblDeelname.BlokhutID) INNER JOIN tblBlokhutSamenstelling ON
tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)
GROUP BY tblActiviteit.ActiviteitID, Bedrag)
3. Wie is de jongste leider? Geef de naam als een lange string, en zijn
geboortedatum
Jongste persoon = persoon met geboortedatum <= aan alle andere geboortedata
1
Oplossing:
SELECT Naam & “ “ & Voornaam AS Deelnemer, Geboortedatum
FROM tblDeelnemers
WHERE Geboortedatum <= ALL
(SELECT Geboortedatum
FROM tblDeelnemers)
OF:
SELECT Naam & “ “ & Voornaam AS Deelnemer, Geboortedatum
FROM tblDeelnemers
WHERE Geboortedatum = (SELECT max(geboortedatum) FROM tblDeelnemers)
5. Geef per blokhut een overzicht van de deelnemers (naam als een lange
string), per blokhut in dalende volgorde van geboortedatum. De output toont
dus deelnemer, de blokhut en de geboortedatum
De filmindustrie
1
FilmID: 1999/ 57
Titel: Bicentennial Man
Productiehuis:
Touchstone Pictures
Release Date: 17/ 12/ 99
Korte inhoud:In the first decade of the new millenium, ....
...
Acteur Personage
Main Cast: Robin Williams Andrew Martin
SamNeill Sir
Ioliver Platt Rupert Burns
...
MPAA rating: PG
2
2. Hebben we productiehuizen in onze databank waarvan we geen films hebben
geregistreerd?
SELECT Productiehuis
→ Veldnaam
FROM Productiehuis
→ Tabelnaam
WHERE ProductiehuisID NOT IN
(SELECT ProductiehuisID FROM Film)
2
SELECT ActeurVoornaam & “ “ & Familienaam AS Acteur
FROM Acteur
WHERE ActeurID NOT IN
(SELECT ActeurID
FROM FilmPersonnage INNER JOIN Film ON FilmPersonnage.FilmID = Film.FilmID
WHERE Year(ReleaseDATe) = 2009))
8. Welke functies komen meer dan 2 keer voor in eenzelfde film (geef ook de
naam van deze film)?
SELECT Titel
FROM Film
WHERE ReleaseDate <= ALL
(SELECT ReleaseDate FROM Film)