Database-ontwerp: relaties#

Een relationele database draait om de relaties die entiteiten met elkaar kunnen hebben:

  • klant koopt product

  • auto wordt onderhouden door een monteur

  • docent doceert één of meer vakken

We willen in een ontwerp deze relaties zo precies mogelijk vastleggen.

Een relatie werkt twee kanten op; dat werkt ook zo bij entiteiten in een database-ontwerp

Nul, een, meer? ‘kardinaliteit’#

Voor een database-ontwerp is het van belang te weten ‘hoeveel’ van de ene entiteit hoort bij de andere entiteit. Bij de analyse stellen we vragen, zoals: “Klopt het dat een klant meerdere producten in een winkelmandje kan leggen?” en “Klopt het dat een winkelmandje bij precies 1 klant hoort?”.

Dit lijken eenvoudige vragen; dit klopt voor zo’n beetje elke online winkel! Soms weten we het antwoord niet meteen zoals de vraag: Klopt het dat een patiënt maximaal 1 infuuspomp tegelijk gebruikt? (Nee, soms zijn er meer medicijnen die onafhankelijk worden toegediend…)

Om deze aantallen vast te leggen zijn er in een database-ontwerp precies vier mogelijkheden voor de relaties:

  • Nul of één

  • Precies één

  • Nul of meer

  • Eén of meer

Voorbeelden:

  • Van een klant weten we nul of één e-mailadres

  • Elke regel in een bestelling hoort bij precies één bestelling

  • Een product wordt gekocht door nul of meer klanten

  • Elke bestelling omvat één of meer producten

Maar dit is maar de helft van het verhaal! Van al deze zaken willen we ook de andere kant van de relatie weten. Bijvoorbeeld:

  • Iedere bestelling bestaat uit één of meer regels, en

  • Iedere klant koopt één of meer producten.

ERDish-zinnen#

We willen ervoor zorgen dat we structureel alle relaties in de database goed beschrijven. Dit doen we door relaties tussen entiteiten te beschrijven in een precieze structuur. Voorbeelden:

  • auto en monteur:

    • Iedere auto wordt onderhouden door precies één monteur.

    • Iedere monteur onderhoudt één of meer auto’s.

  • product en klant

    • Ieder product wordt gekocht door nul of meer klanten.

    • Iedere klant koopt één of meer producten.

Aan de voorbeelden kun je zien dat die zinnen altijd dezelfde structuur hebben:

Iedere entiteit A werkwoord …aantal… entiteit B

En dat de zinnen altijd in paren voorkomen. Als er een relatie is tussen twee entiteiten, dan moet je beide kanten van de relatie beschrijven.

Voorbeelden van ERDish-zinparen#

  • Iedere leerling volgt één of meer vakken. Ieder vak wordt gevolgd door nul of meer leerlingen.

  • Elke medewerker werkt voor precies één afdeling. Voor iedere afdeling werken één of meer medewerkers.

  • Elke klant plaatst nul of meer bestellingen. Iedere bestelling is voor precies één klant.

  • Elke gebruiker heeft één of meer accounts. Elk account hoort bij precies één gebruiker.

Entiteit-relatie-diagrammen, een plaatje zegt meer#

De ‘kardinaliteit’ die we hierboven beschreven met woorden als ‘precies één’, ‘één of meer’ tekenen we als zogenaamde kraaienpoten (de Engelse term hiervoor is crow’s feet). Dit is een veelgebruikte manier om in een diagram de hoeveelheid (kardinaliteit) van een relatie te beschrijven.

Deze kraaienpoten zien er zo uit:

Plaatje van de vier kraaienpoten

Een rondje of een streep voor nul of één. Een enkele streep of drie streepjes in de vorm van een vogelpootje voor de ‘meer’-variant.

Van ERDish-zinnen naar een ERD#

We hebben ERDish-zinnen gemaakt om de relaties tussen entiteiten te beschrijven. Dit zetten we om in een diagram op de volgende manier.

  • auto en monteur:

    • Iedere auto wordt onderhouden door precies één monteur.

    • Iedere monteur onderhoudt één of meer auto’s.

Plaatje van auto monteur ERD

In dit plaatje:

  • Wordt iedere entiteit getoond als rechthoek met afgeronde hoeken.

  • Zijn attributen opgenomen

  • Staan kraaienpoten

  • Staat de betekenis van de relatie beschreven op de lijn

Als er meer entiteiten zijn, dan worden die allemaal ondergebracht in een grote plaat. In het volgende hoofdstuk zien we daarvan een voorbeeld.