Hoofdstuk 11. Informatiemodellering

  11.7 De uniciteits- en de totaliteitsbeperking

Voordat de structuur van de database aan de hand van het IGD bepaald kan worden moeten er eerst nog twee belangrijke dingen gebeuren.

11.7.1 Uniciteitsbeperking

Bij elk feittype komen invulplaatsen voor. En nu is het belangrijk of er op zo'n invulplaats maar één ding ingevuld kan worden, of meer dan één.
Als het er maar één is dan wordt dat een uniciteitsbeperking genoemd.
Als voorbeeld nemen we het feittype zit_in_klas.

Een paar voorbeeldzinnen maken duidelijk wat er met de uniciteitsbeperking bedoeld wordt:

Petra Haarsma zit in klas.V5C
Dominic Claus zit in klas.V5C
Petra Haarsma zit in klas.V5A


Er zit een fout in bovenstaande zinnen, het is immers niet mogelijk dat Petra Haarsma in twee verschillende klassen zit.
De naam Petra Haarsma kan dus in de voorbeeldzinnen maar één keer voorkomen.

We noemen de invulplaats van het objecttype persoon daarom wel een unieke rol, het voldoet aan de unicitietsbeperking..
De rol van het objecttype klas is niet uniek, de klas V5C kan in meerdere zinnen voorkomen want een klas heeft meerdere leerlingen.

In het IGD is het mogelijk om de uniciteitsbeperkingen aan te geven. Je klikt in de werkbalk op Constraint Rollup .
Dan verschijnt de volgende knoppenbalk:

Om aan te geven dat bij het feittype zit_in_klas de invulplaats van persoon voldoet aan de unicitietsbeperking selecteer je alleen het vakje van persoon in het IGD-scherm(klik op het vakje terwijl je de Control-toets ingedrukt houdt) en klik je op:
Er verschijnt een pijl boven het vakje.

Bij het feittype woont_aan voldoet de invulplaats van persoon ook aan de unicitietsbeperking: een persoon kan maar op één adres wonen.
Je kunt dus ook een pijl zetten boven het linker hokje van het feittype woont_aan
(denk er om: er komt geen pijl boven de invulplaats van adres !)

Bij het feittype woont_in voldoet de invulplaats van persoon ook aan de unicitietsbeperking: een persoon kan maar in één plaats wonen.
Je kunt dus ook een pijl zetten boven het linker hokje van het feittype woont_in

Bij het feittype is_geboren_op voldoet de invulplaats van persoon ook aan de unicitietsbeperking: een persoon kan maar op één datum geboren zijn. Je kunt dus ook een pijl zetten boven het linker hokje van het feittype is_geboren_op

Bij het feittype doet_aan voldoet de invulplaats van persoon niet aan de unicitietsbeperking: een persoon kan op meer dan één sport zitten. Je kunt dus geen pijl zetten boven het linker hokje van het feittype doet_aan.

Maar in een IGD moeten alle feittypen een uniciteitsbeperking krijgen, dus een pijl op het linker hokje of een pijl op het rechter hokje, of als dat niet klopt een pijl over het geheel.

Er kan ook geen pijl op het rechter hokje, want dat zou betekenen dat op elke sport maar één persoon zit. Dus dan moet je een lange pijl zetten boven beide hokjes, want de combinatie van de persoon en de sport is wel uniek (het is onzin om de zin Petra Haarsma doet aan tennis twee keer op te schrijven, zo'n zin is dus uniek). Dat doe je door op het feittype te klikken(dan worden beide hokjes geselecteerd) en dan te klikken op:

Bij het feittype heeft_cijfer_op_vak voldoet de invulplaats van persoon niet aan de unicitietsbeperking: een persoon kan in meer dan één zinnetje van dat soort voorkomen, hij of zij kan op verschillende vakken een cijfer hebben. Je kunt dus geen pijl zetten boven het linkerhokje van het feittype heeft_cijfer_op_vak.
De invulplaats van vak voldoet ook niet aan de unicitietsbeperking: een vak kan in meer dan één zinnetje van dat soort voorkomen, anders zou er maar één persoon zijn die een cijfer op dat vak heeft. Je kunt dus ook geen pijl zetten boven het middelste hokje van het feittype heeft_cijfer_op_vak.
De invulplaats van cijfer voldoet ook niet aan de unicitietsbeperking, je kunt dus ook geen pijl zetten boven het rechter hokje van het feittype heeft_cijfer_op_vak.

Maar de combinatie van de persoon en het vak is wel uniek.Als Petra Haarsma voor Nederlands een 8 heeft kan ze niet tegelijk ook een 7 voor Nederlands hebben als rapportcijfer.
Er moet dus een lange pijl boven de twee linker hokjes.
Dat doe je door de twee linker vakjes te selecteren (klik op de vakjes terwijl je de Control-toets ingedrukt houdt) en dan te klikken op: . Er verschijnt een pijl boven de twee vakjes.
Ook de feittypen die in de cirkels zitten (dat zijn unaire feiten, die tot objecttype zijn gepromoveerd) moeten van een pijl worden voorzien.
Vaak zijn dat feittypen met maar een enkele rol, het is logisch dat die voldoen aan de unicitietsbeperking: je zult bijvoorbeeld geen twee klassen met dezelfde naam hebben, iedere klas komt dus maar één keer voor.
De objecten worden soms met een combinatie van twee of meer labels aangeduid: een adres wordt bijvoorbeeld aangeduid met de straatnaam en het huisnummer. De combinatie van straatnaam en huisnummer is natuurlijk uniek, en dus kan er een lange pijl boven die twee hokjes.

Als je alle uniciteitsbeperkingen aanbrengt dan ziet het IGD er als volgt uit:



11.7.2 Totaliteitsbeperking

Bij elk feittype komen invulplaatsen voor. We zagen hierboven dat het belangrijk is of er op zo'n invulplaats maar één ding ingevuld kan worden, of meer dan één.
Als het er maar één is dan wordt dat een uniciteitsbeperking genoemd.
Het is ook belangrijk om te weten of er bij elk object iets ingevuld moet worden. Als dat zo is dan wordt dat een totaliteitsbeperking genoemd.
De uniciteitsbeperking kun je omschrijven als: niet meer dan één keer.
De totaliteitsbeperking kun je omschrijven als: iedereen heeft er minstens één.

Als voorbeeld nemen we het feittype woont_aan

Heeft iedereen een adres? Er zijn misschien wel daklozen, die geen adres hebben, maar als het gaat om een database voor een school zal iedereen een adres hebben. Bij het beantwoorden van die vraag is de universe dus belangrijk: over welke gegevens gaat het?

Bij het feittype woont_aan voldoet de invulplaats van het objecttype persoon dus aan de totaliteitsbeperking.

In het IGD is het mogelijk om de totaliteitsbeperkingen aan te geven. Je klikt in de werkbalk op Constraint Rollup
Dan verschijnt de volgende knoppenbalk:


Om aan te geven dat bij het feittype woont_aan de invulplaats van persoon voldoet aan de totaliteitsbeperking selecteer je alleen het linker vakje van het feittype woont_aan (klik op het vakje terwijl je de Control-toets ingedrukt houdt) en klik je op:
Er verschijnt een dikke stip op de cirkel van het object persoon, op de plaats waar de verbindingslijn naar de rechthoek van het feittype woont_aan.

Bij het feittype woont_in voldoet de invulplaats van persoon ook aan de totaliteitsbeperking: elke persoon, die in de database van een school voorkomt, heeft een adres.
Je kunt dus ook een dikke stip zetten bij de verbindingslijn van persoon naar het feittype woont_in

Bij het feittype is_geboren_op voldoet de invulplaats van persoon ook aan de totaliteitsbeperking: elke persoon heeft een geboortedatum.

Bij het feittype zit_in_klas voldoet de invulplaats van persoon ook aan de totaliteitsbeperking, tenminste als het een database betreft van leerlingen van een school: elke leerling, die in de database van een school voorkomt, zit in een klas.

Bij het feittype doet_aan voldoet de invulplaats van persoon niet aan de totaliteitsbeperking: niet elke persoon hoeft aan een sport te doen.

Bij het feittype heeft_cijfer_op_vak voldoet de invulplaats van persoon niet aan de totaliteitsbeperking: niet elke persoon hoeft een cijfer voor een bepaald vak te hebben.
De invulplaats van vak voldoet ook niet aan de totaliteitsbeperking: niet voor elk vak hoeven er cijfers te zijn. Misschien is een docent ziek geweest, zodat er geen cijfers zijn gegeven. Of misschien zit je in het begin van het jaar en zijn er helemaal nog geen cijfers gegeven.
De invulplaats van cijfer voldoet ook niet aan de totaliteitsbeperking, niet elk cijfer hoeft voor te komen op een rapport.

Als je alle totaliteitsbeperkingen aanbrengt dan ziet het IGD er als volgt uit:



Bij het bepalen van totaliteitsbeperkingen moet je er om denken dat het tot gevolg heeft dat iets beslist moet worden ingevuld in de database, een kolom mag dan niet leeg blijven.