Oefeningen ERD - normalisatie

27
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 CrewID Description Name 1 Director: Chris Columbus 2 Screen writer Nick Kazan 3 Special Effects Steve Johnson 4 Producer Mark Radcliffe 5 Costume Designer Joseph G. Aulisi Teken het ERD Begrippen: Entiteit: Crew Film Auteur Productiehuis Attribuut: Inhoud Titel 1

description

Lessius Handelswetenschappen Informatiemanagement II Oefeningen ERD en normalisatie

Transcript of Oefeningen ERD - normalisatie

Page 1: 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/57Titel: Bicentennial ManProductiehuis: Touchstone PicturesRelease Date: 17/12/99Korte inhoud: In the first decade of the new millenium, ....

Acteur PersonageMain Cast: Robin Williams Andrew Martin

Sam Neill SirIoliver Platt Rupert Burns...

MPAA rating: PG

CrewID Description Name1 Director: Chris Columbus2 Screen writer Nick Kazan3 Special Effects Steve Johnson4 Producer Mark Radcliffe5 Costume Designer Joseph G. Aulisi

Teken het ERD

Begrippen: Entiteit:

■ Crew■ Film■ Auteur ■ Productiehuis

Attribuut:■ Inhoud■ Titel■ Datum

1

Page 2: Oefeningen ERD - normalisatie

Normaliseer het rapport

0NFFilm = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate, KorteInhoud,

{ActeurID,Acteurvoornaam, Acteurfamilienaam, Personnage}, Rating, {CrewID, CrewVoornaam, Crewfamilienaam, Functie})

1NFFilm = (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 sleutelFilm = (FilmID, Titel, ProductiehuisID, Productiehuis, ReleaseDate,

KorteInhoud, Rating)Cast = (FilmID, ActeurID, Personage)Acteur = (ActeurID, ActeurVoornaam, ActeurFamilienaam)CrewDetails = (FilmID, CrewID, functie)Crew = (CrewID, CrewVoornaam, CrewAchternaam)

3NFFim = (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:

Productiehuis

Film Cast Acteur

Crew details Crew

Functie

Personage

2

Page 3: Oefeningen ERD - normalisatie

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.

Oefening: het Songfestival

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: 2003Plaats: Riga, LetlandDatum: 24/mei

Land: TurkijeArtiest: Hannelore CasteelsLied: Ik ben vandaag zo vrolijk

Score overzicht punten voorrondeLand: PuntenBelgië 12Nederland 10Rusland 10…Totaal 167

Score finaleLand: PuntenFrankrijk 12Duitsland 10Rusland 9…Totaal 134

Land: BelgiëArtiest: Hannelore Casteels SeniorLied: Sanomi memeee amimameeemamooeeeeee

Score overzicht punten voorrondeLand: PuntenTurkije 8Nederland 5Rusland 12…Totaal 165

Score finale

3

Page 4: Oefeningen ERD - normalisatie

Land: PuntenDuitsland 10Rusland 9Nederland 12…Totaal 109

Mogelijke entiteiten: Land, Songfestival, Artiest Attributen: Datum, Totaal, Plaats, Titelsong, Score

Teken het ERD

Herhalende groepen: Song (?), ScoresVoorronde, ScoreFinale

Normaliseer het rapport

???

Oefening: Het sponsorbureau

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.

Land

Songfestival

Song

Scores voorronde

Score land

Score finaleArtiest

Deelnemend land

4

Page 5: Oefeningen ERD - normalisatie

Teken het ERD

Netto-opbrengst en tekort op de winst gaan we niet opnemen in de normalisatie

5

Page 6: Oefeningen ERD - normalisatie

Normaliseer het rapport

0NFProject = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,

VereistBedrag, {SponsorID, Voornaam, Familienaam, SponsorAdres, SponsorPostcode, SponsorGemeente, Bedrag, Datum}, {EvenementID, Evenement, EvenementDatum, {Uitgave, UitgaveBedrag}, Inkomsten})

1NFProject = (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

2NFProject = (ProjectID, Project, KlantID, Vereniging, Adres, Postcode, Gemeente,

VereistBedrag)Sponsoring = (ProjectID, SponsorID, Bedrag, Datum)Sponsor = (SponsorID, Voornaam, Familienaam, SponsorAdres,

SponsorPostcode, SponsorGemeente)

Klant Project

Evenement

Vereist bedrag

Sponsoring

Sponsor

Bedrag

Datum

UitgavePost

Omschrijving

Inkomsten

Omschrijving Bedrag

Sponsoring

6

Page 7: Oefeningen ERD - normalisatie

Evenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)

3NFProject = (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 GemeenteEvenement = (ProjectID, EvenementID, Evenement, EvenementDatum, Inkomsten)Uitgave = (EvenementID, UitgaveID, Uitgave, UitgaveBedrag)

Oefening: De elektronische boekhandel

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:

Teken het ERD

7

Page 8: Oefeningen ERD - normalisatie

De nummer van het kredietkaart moet elke keer opnieuw opgegeven worden, dus dit nummer wordt niet verbonden met de klantgegevens

Begrippen:- Caddy- Customer- 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'

Normaliseer het rapport

0NFCaddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,

Address, Postalcode, Gemeente, CreditcardNumber, {ISBN, Title, {AuteurID, AuteurVoornaam, AuteurFamilienaam}, Quantity, Price})

1NFVoorbereidende 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

sleutelAuteursteam = (ISBN, AuteurID, AuteurVoornaam, AuteurFamilienaam)

→ samengestelde sleutel

2NFCaddy = (CaddyNumber, Date, CustomerNumber, Voornaam, Familienaam,

Address, Postalcode, Gemeente, CreditcardNumber)CaddyContent = (CaddyNumber, ISBN, Quantity)

Klant CaddyCreditcardNumber

Caddy Content

Book

8

Page 9: Oefeningen ERD - normalisatie

Book = (ISBN, Title, Price)Auteursteam = (ISBN, AuteurID)Auteur = (AuteurID, AuteurVoornaam, AuteurFamilienaam)

3NFCaddy = (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

Teken het ERD

Begrippen:- Verkoper- Plaats- Weeknummer- Artikel- Plaats en artikel bepalen prijs

9

Page 10: Oefeningen ERD - normalisatie

1°Als men een veel-op-veelrelatie wil oplossen in ERD → altijd samengestelde sleutel in uw normalisatie2°Als er meer dan 3 attributen zijn, zoals bij VerkoopDetail dan kan je 1 uniek attribuut maken, bv VerkoopDetailID. De 3 of meer andere attributen worden dan niet gebruikt in de normalisatie → vereenvoudiging

Hier: VerkoperID, PlaatsID, ArtikelID en Datum worden vervangen doorVerkoopDetailID

Normaliseer het rapport

0NFVerkoper = (VerkoperID, Voornaam, Familienaam, {PlaatsID, Plaats, Datum,

{ArtikelID, Artikel, Prijs, Aantal}})

1NF→ Zorgen dat er geen herhalende groepen meer zijnVerkoper = (VerkoperID, Voornaam, Familienaam)VerkoopLocatie = (VerkoperID, PlaatsID, Plaats, Datum)

→ Datum onderstreept: 1 verkoper op 1 datum op 1 plaatsVerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Artikel, Prijs, Aantal)

2NF→ Niet-sleutelvelden onafhankelijk makenVerkoper = (VerkoperID, Voornaam, Familienaam)VerkoopLocatie = (VerkoperID, PlaatsID, Datum)Plaats = (PlaatsID, Plaats)VerkoperDetail = (VerkoperID, PlaatsID, Datum, ArtikelID, Aantal)Artikel = (ArtikelID, Artikel)PrijsLocatie = (ArtikelID, PlaatsID, Prijs)

Verkoper Plaats

Verkoop Locatie

VerkoopDetail

Artikel

AanbodPlaatsID VerkoperID

PlaatsIDDatum

Prijs

ArtikelID

VerkoperID

PlaatsID

ArtikelID

Datum

VerkoperDetailID

10

Page 11: Oefeningen ERD - normalisatie

3NF= 2NF

Oefening: Het facturatiesysteem

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.

Teken het ERD voor deze situatie.

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).

Teken het ERDNormaliseer het rapport

11

Page 12: Oefeningen ERD - normalisatie

Oefening: oogartsenpraktijk

Een privépraktijk van oogartsen heeft verschillende mensen in dienst: oogartsen, medische assistenten, administratief personeel. Het administratief personeel ontvangt de patiënten, noteert afspraken, noteert de gegevens van nieuwe patiënten en wijst ze toe aan een oogarts. De medische assistenten voeren een aantal onderzoeken uit (bv. oogdrukmeting, meting gezichtsveld, …).Van elk personeelslid worden naast naam en adresgegevens ook de behaalde diploma’s genoteerd. Een personeelslid kan meerdere diploma’s hebben behaald.Van elke patiënt worden de persoonlijke gegevens genoteerd (naam, adresgegevens, geboortedatum). Elke patiënt krijgt ook een oogarts toegewezen.Patiënten komen op consultatie na vooraf gemaakte afspraken. Van elke afspraak wordt datum en uur genoteerd. Tevens wordt op dat moment meteen aangeduid welke onderzoeken er moeten worden uitgevoerd. Bij sommige patiënten is dit alleen ‘consultatie oogarts’, maar bij andere patiënten kan men ook aanduiden dat er tevens een oogdrukmeting en een onderzoek gezichtsveld moeten worden uitgevoerd. Het informatiesysteem bevat dus een lijst van alle mogelijke types onderzoeken.Niet alle medische assistenten kunnen alle onderzoeken uitvoeren. Het informatiesysteem moet kunnen bijhouden wie welke onderzoeken mag uitvoeren. Oogartsen kunnen uiteraard alle onderzoeken uitvoeren. Het administratief personeel mag geen enkel onderzoek uitvoeren.Zodra een patiënt zich voor een afspraak heeft aangeboden, duidt men aan dat de patiënt gekomen is. Door dit in apart aan te duiden, kan men later nagaan welke patiënten zich niet aan de afspraken houden. Men kan ze dan nadien eventueel contacteren. Telkens een patiënt zich aanbiedt op een afspraak ziet men ook meteen welke onderzoeken er moeten worden uitgevoerd. Indien er naast het standaard ‘consultatie oogarts’ nog andere onderzoeken moeten worden uitgevoerd, dan zullen de medische assistenten de patiënt ophalen uit de wachtkamer naargelang de onderzoeken die zij mogen uitvoeren. Elke medische assistent noteert steeds de uitslag van het onderzoek. Het informatiesysteem registreert automatisch welk

12

Page 13: Oefeningen ERD - normalisatie

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

Je bent aangesteld als coördinator van de meesterproeven. Je wilt hiervoor een database ontwerpen waarmee je de voorstellen en de verdedigingen van de meesterproeven kunt verwerken. Elke meesterproef heeft een promotor. Voor de verdediging moet je twee assessoren aanduiden en een datum, uur en lokaal vastleggen. Een personeelslid kan promotor zijn voor de ene meesterproef en assessor voor een andere meesterproef. Elk lokaal krijgt een lokaalNr of naam en is op een bepaalde campus gelegen. Het is de bedoeling om in je database ook de specificaties (aanwezig materiaal, aantal zitplaatsen, …) te kunnen verwerken. Van deze campus is het adres volledig gekend.Het is zeker de bedoeling om lijsten zoals het onderstaande rapport te kunnen afdrukken per academiejaar. Dus ook gegevens van voorgaande academiejaren moeten kunnen worden afgedrukt.Je wenst de nodige rapporten te kunnen afdrukken: overzichten verdedigingen per dag, per docent, per lokaal, ….

13

Page 14: Oefeningen ERD - normalisatie

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: ERDEen jeugdorganisatie organiseert elk jaar een zomerkamp. De organisatie heeft de beschikking over een terrein met verschillende blokhutten waarin telkens een 15-tal

14

Page 15: Oefeningen ERD - normalisatie

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.

Teken het ERD en geef de belangrijkste attributen.

- 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

Deel 2: NormalisatieNormaliseer het volgende rapport:

Blokhut Deelnemer

Deelname

Activiteit

LeiderHerhalende groep samenstelling

Herhalende groep van deelnemende activiteiten

15

Page 16: Oefeningen ERD - normalisatie

0NVBlokhut = (BlokhutID, Omschrijving, {DeelnemerID, Naam, Voornaam,

Geboortedatum, Leider}, {Datum, ActiviteitID, OmschrijvingActiviteit,Bedrag, Score})

→ 1ste herhalende groep: Deelnemers→ 2de herhalende groep: DeelnemersActiviteit

1NVBlokhut = (BlokhutID, Omschrijving)Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)DeelnameActiviteit = (BlokhutID, Datum, ActiviteitID, OmschrijvingActiviteit, Bedrag,

Score)

2NVBlokhut = (BlokhutID, Omschrijving)Deelnemers = (BlokhutID, DeelnemerID, Naam, Voornaam, Geboortedatum, Leider)DeelnameActiviteit = (BlokhutID, ActiviteitID, Score)Activiteiten = (ActiviteitID, Datum, OmschrijvingActiviteit, Bedrag)

3NV = 2NV

Deel 3: SQLDe 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.

16

Page 17: Oefeningen ERD - normalisatie

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 diepersoon de blokhutleider is

- tblActiviteiten de verschillende activiteiten die worden georganiseerd- tblDeelname geeft per blokhut weer aan welke activiteiten de blokhut

deelneemt

Geef de SQL statements om volgende informatie uit de database te halen; benoem steeds eventueel berekende gegevens:

Blokhut

Blokhut samenstelling

Deelnemer

Deelname

Activiteit

BlokhutID

BlokhutID

DeelnemerID

DeelnemerID

Jaar

17

Page 18: Oefeningen ERD - normalisatie

1. Welke blokhutten zijn tijdens het zomerkamp niet in gebruik? Geef enkel de omschrijving van deze blokhutten.

Eerste stap: welke blokhutten zijn wel in gebruik?SELECT BlokhutIDFROM tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON

tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID → Subquery

Tweede stap: selecteer alle blokhutten die niet in de voorgaande lijst voorkomenSELECT OmschrijvingFROM tblBlokhuttenWHERE BlokhutID NOT IN(SELECT BlokhutIDFROM tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON

tblBlokhutten.BlokhutID = tblBlokhutSamenstelling.BlokhutID)

2. Voor sommige activiteiten moeten de deelnemers een extra bijdrage betalen (veldje Bedrag). Wat is de totale som die de kamporganisator hiervoor intvangt?(Tip: maakt eerst een query die het aantal deelnemers levert per activiteit en het te betalen bedrag voor die activiteit)

Query van de tipSELECT tblActiviteit.ActiviteitID, Count(DeelnemerID) As AantalDeelnemers, BedragFROM (((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

Oplossing:SELECT AantalDeelnemers * Bedrag AS TotaalBedragFROM (SELECT tblActiviteit.ActiviteitID, Count(DeelnemerID) As AantalDeelnemers, BedragFROM (((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

Eerste stap: alle geboortedata verzamelenSELECT GeboortedatumFROM tblDeelnemers

Jongste persoon = persoon met geboortedatum <= aan alle andere geboortedata

18

Page 19: Oefeningen ERD - normalisatie

Oplossing:SELECT Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM tblDeelnemersWHERE Geboortedatum <= ALL(SELECT GeboortedatumFROM tblDeelnemers)

OF:SELECT Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM tblDeelnemersWHERE Geboortedatum = (SELECT max(geboortedatum) FROM tblDeelnemers)

4. Aan welke activiteiten nemen meer dan 3 blokhutten deel? Geef de omschrijving van de blokhut en het aantal activiteiten

Selecteren op een groepstotaal → HAVING-component

SELECT Omschrijving, Count(BlokhutID) AS AantalFROM tblActiviteiten INNER JOIN tblDeelname ON tblActiviteiten.ActiviteitID = tblDeelname.ActiviteitIDGROUP BY OmschrijvingHAVING Count(BlokhutID) > 3

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

SELECT Omschrijving, Naam & “ “ & Voornaam AS Deelnemer, GeboortedatumFROM (tblBlokhutten INNER JOIN tblBlokhutSamenstelling ON tblBlokhut.BlokhutID = tblBlokhutSamenstelling.BlokhutID) INNER JOIN tblDeelnemers ON tblDeelnemers.DeelnemerID = tblBlokhutSamenstelling.DeelnemerIDORDER BY Omschrijving, Geboortedatum DESC

→ DESC = descending >< voor ascending moet je er niets bijzetten

De filmindustrie

19

Page 20: Oefeningen ERD - normalisatie

Geef de SQL-statements voor volgende vragen:

1. In hoeveel films heeft elke acteur meegespeeld?

SELECT ActeurVoornaam & “ “ & ActeurFamilienaam AS Acteur, Count(FilmID) AS Aantal FROM Acteur INNER JOIN FilmPersonnages ON Acteur.ActeurID = Filmpersonnage.ActeurIDGROUP BY ActeurVoornaam & “ “ & ActeurFamilienaam

20

Page 21: Oefeningen ERD - normalisatie

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)

3. Hoeveel filmen hebben we met rating 'PG'?

SELECT Count(FilmID) AS AantalFROM FilmWHERE Rating = “PG”

4. Welke films hebben meer dan 10 acteurs?

SELECT Titel, Count(ActeurID) AS AantalFROM Film INNER JOIN FilmPersonnages ON Film.FilmID = FilmPersonnages.FilmIDGROUP BY TitelHAVING Count(ActeurID) >= 10

ORDER BY → sorteren en alle informatie tonenGROUP BY → sorteren en alles herleiden tot 1 lijntje per groep hij toont

5. Geef een volledig overzicht van de acteurs per film

SELECT Titel, ActeurVoornaam & “ “ & ActeurFamilienaam AS ActeurFROM Film INNER JOIN FilmPersonnagse ON Film.FilmID = FilmPersonnages.FilmID) INNER JOIN Acteurs ON Acteurs.ActeurID = FilmPersonnages.ActeurIDORDER BY Titel, ActeurFamilienaam, ActeurVoornaam

6. Welke acteurs hebben slechts voor 1 regisseur (= functie binnen technische ploeg) gewerkt?

SELECT ActeurVoornaam & “ “ & ActeurFamilienaam AS Acteur, Count(FunctieID) AS AantalRegisseursFROM ((Acteur INNER JOIN Filmpersonnage ON FilmPersonnage.ActeurID = Acteur.ActeurID) INNER JOIN Film ON Film.FilmID = FilmPersonnages.FilmID) INNER JOIN TechnPloeg ON Film.FilmID = TechnPloeg.FilmIDWHERE FunctieID = 4GROUP BY ActeurVoornaam & “ “ & ActeurFamilienaamHAVING Count(FunctieID) = 1

7. Welke acteur heeft in 2009 in geen enkele film gespeeld?

21

Page 22: Oefeningen ERD - normalisatie

SELECT ActeurVoornaam & “ “ & Familienaam AS ActeurFROM ActeurWHERE ActeurID NOT IN(SELECT ActeurIDFROM FilmPersonnage INNER JOIN Film ON FilmPersonnage.FilmID = Film.FilmIDWHERE Year(ReleaseDATe) = 2009))

8. Welke functies komen meer dan 2 keer voor in eenzelfde film (geef ook de naam van deze film)?

SELECT Functie, Titel, Count(FilmID) AS AantalFROM (Film INNER JOIN TechnPloeg ON Film.FilmID = TechnPloeg.FilmID) INNER JOIN Functies ON TechnPloeg.FunctieID = Functies.FunctieIDGROUP BY Functie, TitelHAVING Count(FilmID) >2

9. Welke acteurs beelden in welke films meer dan 1 personage uit?

SELECT ActeurVoornaam & “ “ & Familienaam AS Acteur, Titel, Count(Personnage) AS AantalFROM (Acteur INNER JOIN FilmPersonnage ON Acteur.ActeurID = FilmPersonnage.ActeurID) INNER JOIN Film ON FilmPersonnage.FilmID = Film.FilmIDGROUP BY ActeurVoornaam & “ “ & Familienaam, TitelHAVING Count(Personnage) >1

10. Welke film werd het eerst uitgebracht?

SELECT TitelFROM FilmWHERE ReleaseDate <= ALL(SELECT ReleaseDate FROM Film)

22