Loading
Loading
Databases gaat over het gestructureerd opslaan, ordenen en bevragen van grote hoeveelheden gegevens met een databasemanagementsysteem (DBMS). Je leert het relationele model, hoe je met een ERD een datamodel ontwerpt, hoe je door normaliseren redundantie en fouten voorkomt, en hoe je met SQL gegevens opvraagt en wijzigt. Keuzethema — onderdeel van het schoolexamen als de school dit thema kiest; informatica kent geen landelijk examen en wordt volledig met het schoolexamen (SE) afgesloten.
4Onderdelenca. 21min leestijd4VaardighedenNiveauBasis 1 · Standaard 2 · Verdieping 1
basisniveau
Zorg dat je het relationele model en de sleutels beheerst en een eenvoudige SELECT-query met WHERE en ORDER BY kunt lezen en schrijven.
verhoogd niveau
Kun je een casus zelfstandig modelleren in een ERD, een tabel tot 3NF normaliseren en query's met JOIN en GROUP BY opstellen en het resultaat voorspellen.
Lesetiefe: Verdieping
Schriftgröße: Standard
Tabel Leerling met primaire en refererende sleutel
Bekijk de tabel Leerling(LeerlingID, Naam, Woonplaats, KlasID) uit Afb. 1. Welke kolom is de primaire sleutel, welke is de refererende sleutel, en waarom zijn de andere kolommen ongeschikt als sleutel?
LeerlingID heeft voor elke rij een andere waarde (1, 2, 3, 4) en is nooit leeg. Daarmee kun je elke rij ondubbelzinnig aanwijzen, dus LeerlingID is de primaire sleutel.
Naam is ongeschikt: twee leerlingen zouden dezelfde naam kunnen hebben. Woonplaats komt zelfs meermaals voor (Utrecht bij rij 1 en rij 3). Zulke kolommen kunnen geen rij uniek identificeren.
KlasID bevat waarden als H4A en H4B. Dat zijn geen eigenschappen van de leerling zelf maar verwijzingen naar rijen in de tabel Klas. KlasID is dus de refererende sleutel (foreign key).
KlasID in Leerling verwijst naar KlasID (de primaire sleutel) in Klas. Zo hoort bij elke leerling precies een klas, terwijl een klas bij veel leerlingen kan horen.
Resultaat: LeerlingID is de primaire sleutel; KlasID is de refererende sleutel die naar de primaire sleutel van de tabel Klas verwijst. Naam en Woonplaats zijn niet gegarandeerd uniek en kunnen dus geen sleutel zijn.
Veelgemaakte fouten
Actieve herhaling
Gegeven een tabel Boek(BoekID, Titel, Auteur, UitgeverID) en een tabel Uitgever(UitgeverID, Naam, Plaats): wijs in beide tabellen de primaire sleutel aan, benoem de refererende sleutel en leg uit welke koppeling die legt.
Actief ophalen
Haal de kernpunten op — onthul ze daarna.
Bronnen: Examenprogramma informatica (HAVO) (CvTE / Examenblad)
ERD: leerlingen, klassen, vakken en docenten
Op een school geldt: elke leerling zit in precies een klas, een klas heeft veel leerlingen; een leerling volgt meerdere vakken en een vak wordt door veel leerlingen gevolgd. Ontwerp het ERD met de juiste cardinaliteiten en geef aan hoe je de veel-op-veel-relatie in tabellen omzet.
De zelfstandige naamwoorden leveren drie entiteiten: Leerling, Klas en Vak. Elk wordt straks een tabel met een eigen primaire sleutel (LeerlingID, KlasID, VakCode).
'Een leerling zit in een klas' en 'een klas heeft veel leerlingen'. Een-veel dus: de relatie 'zit in' is 1:N tussen Klas en Leerling, met de veel-kant bij de leerlingen.
'Een leerling volgt veel vakken' en 'een vak wordt door veel leerlingen gevolgd'. Veel aan beide kanten: de relatie 'volgt' is N:M.
Bij de 1:N-relatie zet je de sleutel van de een-kant als foreign key bij de veel-kant: de kolom KlasID komt in de tabel Leerling.
De N:M-relatie kan niet met een enkele foreign key. Maak een koppeltabel Inschrijving(LeerlingID, VakCode) met beide sleutels als foreign key; elke rij is een leerling die een vak volgt, en je kunt er het cijfer aan toevoegen.
Resultaat: Drie entiteiten (Leerling, Klas, Vak); 'zit in' is 1:N met KlasID als foreign key in Leerling; 'volgt' is N:M en wordt opgelost met de koppeltabel Inschrijving(LeerlingID, VakCode).
Veelgemaakte fouten
Actieve herhaling
Een bibliotheek leent boeken uit aan leden: een lid kan meerdere boeken lenen en een boek kan in de loop van de tijd door meerdere leden geleend worden. Teken het ERD met de entiteiten Lid en Boek, benoem de cardinaliteit van de uitleen-relatie en geef de koppeltabel met de juiste refererende sleutels.
Actief ophalen
Haal de kernpunten op — onthul ze daarna.
Bronnen: Examenprogramma informatica (HAVO) (CvTE / Examenblad)
Ongenormaliseerde inschrijvingstabel met redundantie
Neem de platte tabel Inschrijving(LeerlingID, Naam, VakCode, Vaknaam, Docent) uit Afb. 3. Wijs een anomalie aan en normaliseer de tabel stap voor stap naar 1NF, 2NF en 3NF.
Docent 'Dijk' staat bij elke rij met Informatica. Wijzigt Dijk van naam, dan moet dat in alle Informatica-rijen (update-anomalie). En een vak zonder ingeschreven leerling past nergens in de tabel (insert-anomalie).
Elke cel bevat al een atomaire waarde en er zijn geen herhalende groepen (geen cel met 'Informatica, Wiskunde'). De tabel voldoet dus al aan 1NF; de sleutel is de combinatie (LeerlingID, VakCode).
Naam hangt alleen van LeerlingID af en Vaknaam alleen van VakCode — beide van een deel van de sleutel. Splits af: Leerling(LeerlingID, Naam) en Vak(VakCode, Vaknaam, Docent). Over blijft Inschrijving(LeerlingID, VakCode).
Stel dat bij elke docent een vaste werkkamer hoort. Dan bepaalt VakCode de Docent en de Docent de DocentKamer: DocentKamer hangt transitief van de sleutel af. Verhuis de docentgegevens naar Docent(DocentID, Naam, Kamer) en zet DocentID als foreign key in Vak.
Elk feit staat nu een keer: een leerlingnaam in Leerling, een vaknaam in Vak, een docentkamer in Docent. Bij het opvragen koppel je de tabellen weer met JOIN via de sleutels.
Resultaat: Een platte tabel wordt Leerling(LeerlingID, Naam), Vak(VakCode, Vaknaam, DocentID), Docent(DocentID, Naam, Kamer) en koppeltabel Inschrijving(LeerlingID, VakCode). Alle drie de anomalieen zijn verdwenen omdat elk gegeven nog maar op een plek staat.
Veelgemaakte fouten
Actieve herhaling
Gegeven de platte tabel Bestelling(BestelID, Klantnaam, Klantadres, ArtikelCode, Artikelnaam, Aantal): wijs de redundantie en een update-anomalie aan en normaliseer de tabel naar 3NF. Geef de resulterende tabellen met hun primaire en refererende sleutels.
Actief ophalen
Haal de kernpunten op — onthul ze daarna.
Bronnen: Examenprogramma informatica (HAVO) (CvTE / Examenblad)
Resultaat van een SELECT-query
Gebruik de tabel Leerling(LeerlingID, Naam, Woonplaats, KlasID) uit Afb. 1. Schrijf een query die de naam en woonplaats geeft van alle leerlingen in klas H4A, alfabetisch gesorteerd op naam, en bepaal het resultaat.
Gevraagd zijn naam en woonplaats, dus: SELECT Naam, Woonplaats. Uit welke tabel? FROM Leerling.
Alleen klas H4A telt mee. KlasID is tekst, dus tussen aanhalingstekens: WHERE KlasID = 'H4A'. Dit selecteert de rijen van Sara (Utrecht) en Iris (Utrecht); Tom (H4B) en Noah (H5A) vallen af.
Alfabetisch op naam: ORDER BY Naam. Van 'Iris Bakker' en 'Sara de Vries' komt Iris eerst, want de I komt in het alfabet voor de S.
Samengevoegd: SELECT Naam, Woonplaats FROM Leerling WHERE KlasID = 'H4A' ORDER BY Naam. Het DBMS voert eerst FROM en WHERE uit (selecteren), dan ORDER BY (sorteren) en toont ten slotte de gekozen kolommen.
Resultaat: De query SELECT Naam, Woonplaats FROM Leerling WHERE KlasID = 'H4A' ORDER BY Naam geeft twee rijen: Iris Bakker (Utrecht) en Sara de Vries (Utrecht) — zie Afb. 4.
Veelgemaakte fouten
Actieve herhaling
Gegeven Leerling(LeerlingID, Naam, KlasID) en Klas(KlasID, Klasnaam, Mentor): schrijf een query die per klas het aantal leerlingen geeft, gesorteerd van veel naar weinig, en geef aan met welke sleutel je de tabellen eventueel moet koppelen.
Actief ophalen
Haal de kernpunten op — onthul ze daarna.
Bronnen: Examenprogramma informatica (HAVO) (CvTE / Examenblad)
Referenties en bronnen
CvTE / Examenblad