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.