DATABASE ontwerpen

advertisement
2011
ROC ter AA T&T
Cees Loomans
[DATABASE ONTWERPEN]
Wat moet je weten over database ontwerpen. Wat heb je nodig, wat moet je doen. Wat is het
resultaat?
DATABASE ontwerpen
1 januari 2011
Inhoud
Introductie ............................................................................................................................................... 4
Enkele basisconcepten ............................................................................................................................ 4
Databasesysteem .................................................................................................................................... 6
Hardware ............................................................................................................................................. 6
Data ..................................................................................................................................................... 8
Software ............................................................................................................................................ 11
Databasemanagementsysteem ..................................................................................................... 11
Toepassingsprogramma 's ............................................................................................................. 11
Gebruikers ......................................................................................................................................... 12
Data-administrator (DA) ................................................................................................................ 12
Database-Administrator (DBA) ...................................................................................................... 12
Toepassingsontwikkelaar (TO) ...................................................................................................... 12
Eindgebruiker (EU)......................................................................................................................... 12
Database management systeem ....................................................................................................... 13
Hoofdfunctionaliteit ...................................................................................................................... 13
Architectuur................................................................................................................................... 16
Vragen deel 1a....................................................................................................................................... 24
Relationele database ............................................................................................................................. 25
Voordelen en mogelijkheden van relationele databases .................................................................. 27
Klantcontactsysteem ......................................................................................................................... 28
Tabellen en de primaire sleutel ......................................................................................................... 29
Gegevens koppelen ........................................................................................................................... 31
De een op veel relatie ....................................................................................................................... 32
De veel op veel relatie ....................................................................................................................... 33
De een op een relatie ........................................................................................................................ 34
Database normaliseren ..................................................................................................................... 36
De eerste normaalvorm (1NF) ........................................................................................................... 37
De derde normaalvorm (3NF) ........................................................................................................... 39
Het definitieve database-ontwerp .................................................................................................... 41
Nog een voorbeeld: webwinkel......................................................................................................... 42
Conclusie ........................................................................................................................................... 42
Het ontwerp proces van een database. ................................................................................................ 44
Hoofdstuk: Introductie
De tweede normaalvorm (2NF) ......................................................................................................... 38
2
DATABASE ontwerpen
1 januari 2011
Scope ................................................................................................................................................. 46
Logisch Ontwerp ................................................................................................................................ 46
0-de normaal vorm :
Onderken alle data-elementen (scope)................................................... 46
1-de normaal vorm: Zoek de sleutel waarmee alle data op te zoeken is .................................. 47
2-de normaal vorm: Maak alle data afhankelijk van de gehele sleutel. ........................................... 47
3-de normaal vorm:
Maak alle data afhankelijk van niets dan de sleutel. .................................. 48
Maak een ERD ................................................................................................................................... 49
De Technische Optimalisatie: ................................................................................................................ 51
Het doel ............................................................................................................................................. 51
Optimalisatiestappen ........................................................................................................................ 51
Ranges ........................................................................................................................................... 52
Denormaliseer ............................................................................................................................... 53
Combineer tabellen ....................................................................................................................... 53
Sla afgeleide gegevens op ............................................................................................................. 54
Voeg indexen toe........................................................................................................................... 54
Sorteer ........................................................................................................................................... 55
Implementatie ....................................................................................................................................... 56
Maak tabel ......................................................................................................................................... 56
Extra kolom........................................................................................................................................ 56
Maak Index ........................................................................................................................................ 56
Verklarende woordenlijst ...................................................................................................................... 58
Hoofdstuk: Introductie
Vragen deel 1b ...................................................................................................................................... 62
3
DATABASE ontwerpen
1 januari 2011
Introductie
In deze cursus leer je een database ontwerpen.
Een database is een verzameling gegevens die bij elkaar horen. Databasesystemen zijn programma's
die deze gegevens opslaan en beschikbaar maken. Er is dus een verschil tussen een database en een
databasesysteem.
De database is de verzameling gegevens en regels om deze gegevens op te vragen.
Een databasesysteem is het geheel van programma’s en hardware waarmee de gegevens uit de
database kunnen worden opgevraagd, veranderd of worden gewist.
Veel computerprogramma's maken gebruik van een databasesysteem om gegevens te beheren. Je
maakt zelf waarschijnlijk dagelijks gebruik van databasesystemen. Als je geld opneemt bij de
pinautomaat raadpleeg je, via het databasesysteem van de bank, de database van de bank. Als je
websites op internet bezoekt raadpleeg je een database waar (o.a) paginateksten in op zijn geslagen,
als je een nieuw paspoort aanvraagt wordt ongetwijfeld een database met persoonsgegevens
geraadpleegd, etc.
Vaak wordt met een database ook het database systeem bedoeld. Alleen als het nodig is zullen we
het verschil aangeven.
In deze cursus relationele database ontwerpen leer je zelf een database ontwerpen volgens het
relationeel model.
Het relationeel model bestaat uit een aantal aanbevelingen die je toe kan passen op het ontwerp van
je database. Het beschrijft hoe gegevens logisch en efficiënt georganiseerd kunnen worden in
tabellen en hoe gegevens uit verschillende tabellen gekoppeld kunnen worden. De meeste databases
zijn tegenwoordig relationeel.
Als leidraad voor deze cursus is de ontwikkeling van een eenvoudige database voor een klant
contactsysteem genomen. We gaan daartoe tabellen ontwerpen voor het opslaan van klantgegevens
en 'contactmomenten'.
Om de principes in deze cursus wat te verhelderen zijn er voorbeelden opgenomen.
Computersystemen worden tegenwoordig gebruikt voor de automatisering van allerlei aspecten van
menselijke activiteit. Een belangrijke activiteit, die niet meer is weg te denken in de huidige
maatschappij, is het automatisch beheren van gegevens met het oog op latere verwerking en
hergebruik. In eenvoudige gevallen komt dit louter neer op het bijhouden van gegevens voor later
onderzoek. In meer geavanceerde toepassingen mondt dit uit in complexe taken voor de
ondersteuning van diverse activiteiten binnen een onderneming. Een goed (of slecht?) voorbeeld
hiervan is het zoekgedrag van de gebruikers van Google dat o.a. gebruikt wordt voor het gericht
toezenden van advertenties (waarmee Google zijn geld verdient)
Hoofdstuk: Introductie
Enkele basisconcepten
4
DATABASE ontwerpen
1 januari 2011
Naast het doorzoeken, zijn het toevoegen, verwijderen, aanpassen en consistent houden van de
gegevens typisch basistaken die voorkomen bij gegevens beheer. We maken hierbij duidelijk
onderscheid tussen ‘data’ (of gegevens) en ‘informatie’.
Met data bedoelen we ‘gegeven feiten’. Zo zijn cijfers, getallen, symbolen, karakters en woorden die
je dagelijks tegenkomt verschillende vormen van data.
Informatie verwijst daarnaast ook naar de betekenis van de gegevens: Je beschikt ook over de
betekenis die een bepaalde gebruiker of groep van gebruikers toekent aan die data.
Hebben we het over informatiebeheer dan is het verschil tussen ‘data’ en ‘informatie’ belangrijk. De
huidige computersystemen kunnen bijna allemaal alleen maar op een efficiënte manier data
beheren. Dit leidt dan ook rechtstreeks naar de term ‘database’ met de volgende omschrijving:
Een database is een verzameling van persistente data
Persistent geeft aan dat de gegevens gedurende een bepaalde tijd worden opgeslagen in een
permanent geheugen van een systeem. Het gaat niet verloren bij het uitschakelen van het systeem.
De gegevens blijven meestal opgeslagen tot ze expliciet, door tussenkomst van een gebruiker of
toepassing worden gewist.
Wat betreft het beheer van de betekenis van de gegevens, met andere woorden het beheren van
informatie of de semantiek , is de beschikbare technologie momenteel nog ontoereikend.
Onderzoek richt zich tegenwoordig op het komen tot semantisch rijkere gegevensmodellen met als
doel systemen te ontwikkelen die volwaardige ‘informatiebases’ in plaats van ‘databases’ kunnen
beheren.
Hoofdstuk:
Een computersysteem voor het beheer van databases wordt een databasesysteem genoemd.
5
DATABASE ontwerpen
1 januari 2011
Databasesysteem
In een databasesysteem
onderscheiden we globaal genomen
drie hoofdcomponenten: de
hardware, de data (gegevens) en de
software. Daarnaast is het belangrijk
om ook de gebruikers van het systeem
te beschouwen. In de figuur hiernaast
zijn deze schematisch voorgesteld.
Hardware
Hoewel het zeker niet de bedoeling is om in dit dictaat veel aandacht te besteden aan
hardwareaspecten, bespreken we toch in het kort de belangrijkste hardwarecomponenten binnen
een databasesysteem.
Essentieel zijn de central processing unit (CPU) en het computergeheugen waarin de database wordt
opgeslagen. De CPU kan fysiek bestaan uit één of meer processoren en zorgt voor het uitvoeren van
de software-instructies. Om redenen van onder meer efficiëntie en implementeerbaarheid is het
geheugen van een computer hiërarchisch georganiseerd. Daarbij onderscheiden we twee
hoofdcategorieën:
Primair geheugen. Geheugens uit deze categorie zijn rechtstreeks aanspreekbaar door de CPU. Het
primaire geheugen staat fysiek het dichtst bij de CPU en is daarom het snelst toegankelijk. De
geheugencapaciteit is echter beperkt.
Tot het primaire geheugen behoren:

Statisch RAM -geheugen (Random Access Memory). Statisch RAM -geheugen wordt ook wel
het cachegeheugen genoemd en wordt door de CPU in hoofdzaak gebruikt om de uitvoering
van programma's te versnellen. Statisch RAM-geheugen is het snelste, doch tegelijk het
duurste geheugen binnen een databasesysteem .
Dynamisch RAM-geheugen. Dit geheugen is het belangrijkste werkgeheugen voor de CPU en
noemen we daarom ook wel het hoofdgeheugen. We gebruiken het voor de tijdelijke opslag
van data en programmacode. Het voordeel van dynamisch RAM-geheugen is de lagere
kostprijs. Nadeel is echter de tragere werking vergeleken met statisch RAM-geheugen.
Vaak worden er in het primaire geheugen minstens twee zogenaamde databasebuffers opgezet.
Terwijl de inhoud van de ene buffer wordt ingelezen of weggeschreven, kan de CPU tegelijkertijd
(parallel) de data uit de andere buffer verwerken. Een direct gevolg hiervan is dat de hoeveelheid
data die per lees- of schrijfoperatie wordt overgedragen van en naar het primaire geheugen gelijk is
aan de grootte van een databasebuffer.
Het primaire geheugen heeft een tijdelijk karakter. Hierdoor is het niet bedoeld als
hoofdopslagmedium voor databases. Daar een dynamisch RAM -geheugen van 8 tot 16 Gigabytes op
één enkel computersysteem geen uitzondering meer is, bestaan er databases die integraal in het
Hoofdstuk: /Databasesysteem

6
DATABASE ontwerpen
1 januari 2011
RAM-geheugen zijn opgeslagen. Vaak gaat het daarbij om toepassingen waarbij extreem hoge
overdrachtsnelheden zijn vereist, wat bijvoorbeeld het geval is bij databases voor telefooncentrales.
Uiteraard dienen bij dergelijke databases zeker veiligheidsvoorzieningen tegen dataverlies te worden
getroffen, zoals het bijhouden van een kopie van de database in een permanent geheugen.
Algemeen geldt dat hoe meer dynamisch RAM -geheugen je tot je beschikking hebt en hoe meer
werkruimte (voor databasebuffers) je hierin voor het databasesysteem reserveert, hoe beter de
prestaties van het databasesysteem zullen zijn.
Een speciale vorm van geheugen dat sommigen eveneens tot het primaire geheugen rekenen, is het
zogenaamde flashgeheugen, waarbij EEPROM-technologie (Electrically Erasable Programmabie Read
-Only Memory) wordt gebruikt. Voorbeelden van (kleine)
databases op flashgeheugen zijn de datacollecties in mp3spelers,
digitale fototoestellen, pda's en camera's.
Secundair geheugen. Gegevensdragers uit deze categorie hebben
gewoonlijk een veel grotere opslagcapaciteit, zijn goedkoper, maar
hebben een veel tragere gegevenstoegang. Data in het secundaire
geheugen kan niet rechtstreeks worden verwerkt door de cpu,
maar moeten hiertoe eerst naar een databasebuffer worden
gekopieerd. Deze datastromen zijn gevisualiseerd in figuur
hiernaast.
Tot het secundaire geheugen behoren:
De magneetschijfgeheugens. Deze geheugens zijn
opgebouwd uit één of meer roterende schijven die langs
één of twee zijden beschrijfbaar zijn. Elke schijf is door de fabrikant onderverdeeld in cirkels
die we tracks noemen. Bij verschillende schijven vormen de tracks die zich op een gelijke
afstand van het middelpunt van de schijf bevinden een cilinder. De tracks zijn op hun beurt
onderverdeeld in sectoren.
Bij het formatteren, verdeelt het besturingssysteem, bijvoorbeeld Windows, Linux of Unix, de
sectoren onder in pagina's van gelijke grootte. Elke pagina bestaat uit een vast aantal
sectoren. De databasebuffers uit het primaire geheugen worden even groot gekozen als de
grootte van een pagina. Daardoor wordt per lees- en schrijfoperatie één pagina gekopieerd.
Om een pagina te kunnen lezen of beschrijven moet deze vooraf worden gelokaliseerd.
Hierbij moet rekening worden gehouden met drie tijdspannes: de tijd die nodig is om de
lees/schrijfkoppen van het opslagmedium te verplaatsen naar de juiste track of cilinder, de
tijd die nodig is om de schijf te roteren tot aan het begin van de eerste sector van de
betreffende pagina en de tijd die nodig is om de data over te brengen. De eerste twee
tijdspannes duren vaak veel langer dan de derde en vormen een prestatie-'bottleneck'. Om
prestatieredenen is het belangrijk dat we de data in de schijfbestanden zodanig organiseren
dat het aantal paginatransfers minimaal wordt gehouden.
Bij de bestandsorganisatie maken we een onderscheid tussen primaire en secundaire
bestandsorganisatie. Primaire bestandsorganisatie heeft betrekking op de manier waarop
Hoofdstuk: /Databasesysteem

7
DATABASE ontwerpen
1 januari 2011
een database fysiek wordt opgeslagen. De data kan daarbij bijvoorbeeld al dan niet geordend
worden. Secundaire bestandsorganisatie heeft tot doel de toegang tot de fysiek opgeslagen
database verder te optimaliseren door extra data over bijvoorbeeld de locatie van gegevens
en verbanden tussen gegevens bij te houden. Indexen zijn voorbeelden hiervan, we
bespreken ze indien nodig later nog.
Magneetschijfgeheugens worden momenteel het meest gebruikt als secundair
geheugenmedium voor databases.
De cd-rom en dvd-geheugens. Dit zijn recentere opslagmedia. In configuraties waarbij
verschillende van dergelijke geheugens worden samengebracht in een soort 'jukebox' systeem kunnen grote opslagcapaciteiten worden bereikt. Door hun minder goede
schrijffaciliteiten zijn cd's en dvd's eerder geschikt voor de opslag van databases die enkel
moeten kunnen worden geraadpleegd. Voorbeelden zijn digitale telefoongidsen, digitale
archieven, geografische databases en digitale woordenboeken en encyclopedieën. Een
belangrijk minpunt is de beperkte duurzaamheid van zelf beschreven cd's en dvd's, waardoor
we hun bruikbaarheid voor kritische toepassingen op zijn minst in twijfel moeten trekken.
De magneetbandgeheugens. Magneetbandgeheugens worden in hoofdzaak gebruikt voor
archivering en back-up. Omwille van hun fysieke karakteristieken werken
magneetbandgeheugens alleen efficiënt bij sequentiële toegang (in volgorde van fysieke
opslag) tot de data. Ook hier kan een soort 'jukebox' -systeem worden gebruikt om de
opslagcapaciteit te vergroten. Een voorbeeld van een database op magneetbandgeheugen is
het EOS-archief (Earth Observation Satellite) van de NASA. Sommige auteurs categoriseren
magneetbandgeheugens als tertiair geheugen.
Data
Centraal in een databasesysteem staan de databases. Een database wordt meestal in het geheugen
gestructureerd opgeslagen als een collectie van records. Elk record is opgebouwd uit één of meer
velden die data kunnen bevatten. Deze velden zijn vastgelegd in het recordtype van het record en
worden elk gekarakteriseerd door een naam en een datatype. Analoog als bij programmeertalen legt
het datatype de toegelaten waarden en operatoren voor het veld vast. Naast velddefinities heeft een
recordtype ook een naam. Doorgaans bevat een database verschillende records die gegroepeerd zijn
Hoofdstuk: /Databasesysteem
In volgende figuur stellen we de hiërarchie van
het computergeheugen voor. De magneetbandgeheugens zijn hierin apart vermeld als
tertiair geheugen. Aan de top van de hiërarchie
staat het snellere, duurdere geheugen met
doorgaans kleinere opslagcapaciteit. De basis
wordt gevormd door het tragere, minder snel
toegankelijk geheugen met een grotere
opslagcapaciteit.
8
DATABASE ontwerpen
1 januari 2011
volgens diverse recordtypes. In het secundaire geheugen worden de records opgeslagen in
bestanden. Meestal bevat een bestand een aantal records. Hoewel dit geen vereiste is, kunnen er in
hetzelfde bestand records van verschillende recordtypes zijn opgeslagen.
In de praktijk kan het aantal records in een database variëren van enkele tot miljoenen. Daarnaast
kan een databasesysteem tegelijkertijd instaan voor het beheer van meerdere databases.
Voorbeeld
De figuur op de volgende bladzijde bevat een voorstelling van de recordtypes en records uit een
voorbeelddatabase voor schilderkunst. De database bestaat uit een collectie van records van drie
recordtypes: 'Schilderij', 'Artiest' en 'Eigenaar'. Omwille van de leesbaarheid zijn de records geordend
per recordtype en worden de veldnamen voorafgaand aan de records herhaald. De gebruikte
datatypes zijn:

CHAR(n) voor het modelleren van karakter strings van lengte n.
INTEGER voor het modelleren van gehele getallen (die geïnterpreteerd worden als
jaartallen).
REAL voor het modelleren van reële getallen.
Besturingssystemen zoals MVS, Windows, Linux en Unix, bieden geen oplossing voor het vastleggen
en het behandelen van de soms complexe verbanden die kunnen bestaan tussen de data in een
bestand. Als ze voorkomen, zijn dergelijke verwantschappen en verbanden echter zeer belangrijk
voor de gebruikers en toepassingsprogramma's: ze verduidelijken de semantiek (betekenis) van de
verschillende entiteiten (beschreven dingen) uit het toepassingsdomein.
Databases moeten hierom zodanig zijn opgebouwd, dat alle verbanden die voorkomen tussen data
op een efficiënte manier, liefst zonder verlies aan semantiek worden weergegeven. Dubbele opslag,
met andere woorden overtollige data, moeten we daarbij zo veel mogelijk vermijden. Een database
zien we als een geïntegreerd geheel. Data die in de reële wereld samenhangen, brengen we bij
Hoofdstuk: /Databasesysteem


9
DATABASE ontwerpen
1 januari 2011
voorkeur onder in dezelfde database en de verbanden tussen deze data geven we daarbij zo goed
mogelijk weer.
Zo wordt bijvoorbeeld het verband tussen een schilderij en een schilder in de voorbeelddatabase
voor schilderkunst weergegeven door middel van het veld 'Artiest' van het recordtype 'Schilderij' en
het veld 'Naam' van het recordtype 'Artiest'. Een 'Schilderij' -record met waarde 'Monet' voor het
veld 'Artiest' wordt hierbij gerelateerd met het 'Artiest' - record met dezelfde veldwaarde voor
'Naam'. In plaats van te werken met aparte datacollecties voor schilderijen en artiesten, worden
beide geïntegreerd in één database.
Hoofdstuk: /Databasesysteem
Het geïntegreerd zijn van de data is een belangrijk kenmerk van elke database.
1
0
DATABASE ontwerpen
1 januari 2011
Software
Om de hardware te kunnen aansturen en databases te kunnen opzetten, beheren en efficiënt te
gebruiken, zijn computerprogramma's nodig. De belangrijkste software in een databasesysteem is
het databasemanagementsysteem.
Het databasemanagementsysteem (dbms) is de softwarecomponent van een databasesysteem die
instaat voor het beheer van de databases.
Voorbeelden zijn de opensource-systemen MySQL en Postgress en de commerciële systemen DB2,
SQL Server, Oracle, Sybase en MS Access.
Naast het dbms zijn er vaak nog andere softwarecomponenten die deel uitmaken van het
databasesysteem. Denk daarbij aan allerhande (in huis ontwikkelde) toepassingsprogramma's, tools,
communicatiesoftware en software voor datawarehousing, data-analyse of automatische
rapportgeneratie.
Databasemanagementsysteem
Het databasemanagementsysteem is bedoeld voor het beheer van de databases en schermt
daarvoor de gebruikers af van de technische details van hardware en bestandsorganisatie. Alle
interactie met een database gebeurt via het dbms: als een gebruiker data wil opzoeken, toevoegen,
wijzigen of verwijderen, voeren we dit in het dbms in, dat vervolgens zorgt voor de correcte
afhandeling van de gevraagde operatie. Bij een zoekopdracht toont het dbms op een overzichtelijke
manier de resultaten aan de gebruiker.
Hoofdstuk: /Databasesysteem
Toepassingsprogramma 's
Je kunt op indirecte wijze werken met een database via toepassingssoftware. De toepassingssoftware zorgt eerst voor de verbinding met het dbms en de toegang tot de relevante
databases. Daarna zal het de gebruikersacties die betrekking hebben op de database vertalen naar
database operaties, die dan voor de verwerking worden doorgestuurd naar het dbms. Bij een online
toepassing verwerkt het dbms de opdrachten realtime. Bij een batch-toepassing worden de
opdrachten op een meer geschikt tijdstip verwerkt, bijvoorbeeld ’s nachts of tijdens het weekend
wanneer het systeem minder druk bezet is. Na uitvoering van de operaties stuurt het dbms
eventuele resultaten door naar het toepassingsprogramma, dat de resultaten toont aan de
gebruiker. Uiteraard dienen ook eventuele fouten te worden opgevangen.
1
1
DATABASE ontwerpen
1 januari 2011
Gebruikers
Met een gebruiker bedoelen we een persoon die op een of andere manier interactie met het
databasesysteem heeft. Als er verschillende gebruikers zijn, worden er meestal gebruikersprofielen
gemaakt. De beheerder kan dan bepalen wie welke bevoegdheden heeft.
De belangrijkste gebruikerprofielen zijn:
Data-administrator, database-administrator, toepassingsontwikkelaar en eindgebruiker. Sommige
van deze gebruikersprofielen zijn standaard vastgelegd in het dbms. De meeste systemen staan het
toe om eigen gebruikersprofielen te maken.
Data-administrator (DA)
Dit profiel is bedoeld voor personen die in een onderneming centraal verantwoordelijk zijn voor de
data en deze hebben meestal een hogere kader functie in de onderneming. Hij of Zij beslist welke
data, in welk formaat, in welke database wordt opgenomen en hij of zij is ook verantwoordelijk voor
de registratie van deze informatie. Verder legt hij of zij de bedrijfsstrategie vast voor de toegang, de
gebruikersprofielen, de beveiliging, verwerking en communicatie van de data en de prioriteiten
ingeval van toegangsconflicten. Hij of zij speelt een grote rol bij het database ontwerp. De functie is
van het grootste belang bij grote conversies of aanpassingen aan de databases, zoals die rond het
millenium (rond het jaar 2000) en die bij de invoering van de euro.
Database-Administrator (DBA)
Het database administrator profiel is voor die personen die technisch verantwoordelijk zijn voor de
implementatie en onderhoud van de databases. Uiteraard overlegt hij of zij daarvoor met de DataAdminstrator en volgt hun beslissingen strikt op. Ook zorgt hij voor het herstellen van de databases
na het falen ervan (backup en restore), de consistentie van de databases, het monitoren van de
prestaties en het goed functioneren van het database systeem. In grote ondernemingen wordt de
Database-Administrator taak meestal over meerdere personen verdeeld.
Eindgebruiker (EU)
De eindgebruikers zijn de mensen die sporadisch of voor de uitvoering van hun dagelijkse taken
werken met de database. Afhankelijk van de manier waarop de interactie met de database gebeurt,
maken we een onderscheid tussen gewone eindgebruikers en geavanceerde eindgebruikers.

Gewone eindgebruiker. De gewone eindgebruiker werkt op een vrij eenvoudige
manier met de database. Meestal gebeurt dit via een toepassingsprogramma, waarbij de
eindgebruiker volledig van de databasestructuur is afgeschermd. In sommige gevallen kan de
interactie plaatsvinden via heel eenvoudige instructies die door de eindgebruiker zelf worden
Hoofdstuk: /Databasesysteem
Toepassingsontwikkelaar (TO)
De toepassingsontwikkelaar zorgt voor de ontwikkeling van de (in huis ontwikkelde)
toepassingsprogramma’s die het toelaten om op een interactieve, gebruikersvriendelijke manier te
werken met het databasesysteem. Duidelijk is dat hij of zij zal moeten overleggen met de DatabaseAdministrator, om de structuur en implementatie van de databases en de gebruikte
parameterinstellingen voor primaire en secundaire bestandsorganisatie te kennen, en om een
optimale interactie met de database te kunnen realiseren. Voor het uittesten van de ontwikkelde
software moet de toepassingsontwikkelaar beschikken over een werkkopie van de databases.
1
2
DATABASE ontwerpen
1 januari 2011
ingevoerd en die moeten zijn opgebouwd volgens de grammatica van de gebruikte
databasetaal. Door het minder complexe, meestal voorgeprogrammeerde, karakter is de
interactie van een gewone eindgebruiker gewoonlijk vrij goed voorspelbaar. Bij de
optimalisatie van het databasesysteem moet deze voorspelbaarheid door de DBA optimaal
worden benut.

Geavanceerde eindgebruiker. De geavanceerde eindgebruiker werkt vrijwel altijd met
de database via complexere instructies uit de databasetaal of via verfijnde dataanalysesoftware. Typerend zijn het minder routinematige gebruik en de enorme variaties in
de vraagstelling. Vaak zal de complexiteit van de vraagstelling het benutten van alle
mogelijkheden vereisen. Dit alles maakt dat de interactie vrijwel niet te voorspellen is.
Database management systeem
In deze paragraaf bespreken we in detail de belangrijkste softwarecomponent van een
databasesysteem, namelijk het databasemanagementsysteem (dbms). Eerst staan we stil bij de
functionaliteit van een dbms. Daarna lichten we de architectuur kort toe.
Hoofdfunctionaliteit
De belangrijkste taken van een dbms zijn de definitie, manipulatie en constructie van databases.
Databasedefinitie
Bij de definitie van een database moeten zowel de databasestructuur als de semantische regels voor
de database worden vastgelegd. Semantische regels zijn nodig om de integriteit van de database te
helpen garanderen. Integriteit slaat op de correctheid van de data in de database. Een database
modelleert immers informatie en moet op elk moment een zo goed mogelijke weergave zijn van de
realiteit. De data moeten een consistent geheel vormen.
Incorrectheid van data kan ook optreden als er geen redundantie meer mogelijk is. Als bijvoorbeeld
voor het geboortejaar ('Geboren') een waarde '2900' wordt opgegeven, of als er voor een schilderij
een schilder wordt opgegeven die niet voorkomt in de database, of als het geboortejaar ('Geboren')
van een artiest zijn sterfjaar ('Gestorven') niet voorafgaat. Dergelijke vormen van incorrectheid
kunnen worden voorkomen door semantische regels vast te leggen voor de database. Zo kan bijvoorbeeld de geldigheid van een geboortejaar worden gecontroleerd met de regels
'Geboren=heden-12'
'Geboren= Gestorven-12'
Hoofdstuk: /Databasesysteem
Als het mogelijk is, moet de database-integriteit worden gecontroleerd door het dbms. De database
moet daarom zo zijn ontworpen dat er geen tegenstrijdige data in kunnen voorkomen. Deze zijn
immers een potentiële bron van inconsistentie. Als bijvoorbeeld in de schilderkunstdatabase ook in
het recordtype 'Schilderij' het geboortejaar van de schilder zou worden bijgehouden, bestaat het
risico dat bij een eventuele correctie niet alle kopieën worden gecorrigeerd, met als gevolg dat de
database inconsistent wordt doordat ze conflicterende gegevens bevat.
1
3
DATABASE ontwerpen
1 januari 2011
Hierbij is 'heden' het huidig jaartal en er wordt aangenomen dat geen schilderijen in de database
mogen worden opgenomen van artiesten die jonger zijn dan 12 jaar. Het dbms moet erop toezien
dat databases steeds voldoen aan de opgelegde semantische regels.
Niet elke vorm van in correctheid wordt gecontroleerd door het dbms. Als we bijvoorbeeld een
verkeerd geboortejaar invoeren, bijvoorbeeld 1861 in plaats van 1860, kan het systeem dit niet
controleren. Mede hierom is een autorisatiesysteem met gebruikersprofielen vereist: slechts
gebruikers of gebruikersgroepen die verantwoordelijk zijn voor de inhoud van de database mogen
data in de database invoeren, aanpassen of verwijderen. Het is immers bekend dat gebruikers
minder nauwkeurig werken naarmate ze minder verantwoordelijk zijn voor de data, of ze er minder
profijt van hebben dat de database correct is. Uiteraard kan een autorisatiesysteem niet uitsluiten
dat ook deze personen fouten maken.
Databasemanipulatie
Voor de manipulatie van een database moeten de noodzakelijke operatoren worden gecreëerd voor
het efficiënt toevoegen, verwijderen en aanpassen van data en het efficiënt doorzoeken van
databases. De primaire en secundaire bestandsorganisatie moeten op een optimale datamanipulatie
zijn afgesteld. Dit vereist de nodige prestatie-monitoring en expertise van de DBA. Een dbms kan
uitgerust zijn met een databasemanipulatietaal. De grammatica van deze taal schrijft voor hoe
instructies voor databasemanipulatie moeten zijn opgebouwd. Gebruikers kunnen de taal interactief
inzetten voor het wijzigen of doorzoeken van de database. Daarnaast kunnen taalconstructies
worden ingebed in programma code of kunnen er communicatieprotocollen zijn aangemaakt die het
mogelijk maken om vanuit (in huis ontwikkelde) toepassingsprogramma's te werken met het dbms
en de databases.
De voorschriften voor de definitie en de manipulatie van databases zijn vastgelegd in een zogenoemd
data(base)model.
Het dbms moet ervoor zorgen dat de aangemaakte databases efficiënt worden bijgehouden in het
geheugen, zonder dat de eindgebruikers en toepassingsontwikkelaars zich hoeven te bekommeren
over de fysieke opslagdetails. Hiertoe moet het dbms faciliteiten bieden voor databaseconstructie
die het mogelijk maken om een gepaste primaire bestandsorganisatie op te zetten. De
databasestructuur die is vastgelegd bij de databasedefinitie moet daarbij worden vertaald naar een
recordstructuur . Het volledige beheer van de fysieke opslag valt onder de controle van het dbms.
Vaak zal de databaseconstructie via een gepaste parameterinstelling door de DBA kunnen worden
geconfigureerd.
Andere functionaliteit
Naast de hiervoor vermelde hoofdtaken kan een dbms verder nog een oplossing bieden voor het
delen van dezelfde data, de beveiliging van de data, een optimaal systeemgedrag en administratie en
controle.
Hoofdstuk: /Databasesysteem
Databaseconstructie
1
4
DATABASE ontwerpen
1 januari 2011
Delen van dezelfde data
Gebruikers of software moeten dezelfde data kunnen delen en eventueel tegelijkertijd kunnen
aanpassen of doorzoeken. Hiertoe moet een dbms zijn uitgerust met faciliteiten voor simultane
toegang tot de database. Het delen van een database moet volledig transparant zijn voor de
gebruikers en toepassingsprogramma's. Dit wil zeggen dat een gebruiker of software steeds op een
geïsoleerde manier met de database moet werken, net alsof er geen gedeelde toegang tot de
database bestaat.
Het efficiënt delen van databases houdt ook in dat een dbms toegangsconflicten moet kunnen
verhinderen. Een klassiek voorbeeld van een toegangsconflict is het probleem van dubbele boeking,
die kan optreden wanneer twee gebruikers tegelijkertijd dezelfde plaats in een theater, trein of
vliegtuig boeken.
Beveiliging van de data
Een dbms moet in staat zijn om de data die het beheert te beschermen tegen ongeoorloofd gebruik
en tegen fysiek falen van het databasesysteem.
Als de database toegankelijk is voor verschillende gebruikers, kan het gebeuren dat niet iedereen
toegang mag hebben tot de volledige database. Bij ongeoorloofde toegang kunnen gebruikers, al dan
niet opzettelijk, schadelijke acties uitvoeren op de database. Het dbms moet de data kunnen
afschermen en beveiligen tegen ongeoorloofde manipulatie en gebruik. Een beveiligingsmethode kan
gebaseerd zijn op een autorisatiesysteem met wachtwoordbeveiliging en gebruikersprofielen. Om te
voorkomen dat de inhoud van een database via het rechtstreeks af scannen van het geheugen zou
kunnen worden gelezen, kan de data versleuteld worden weggeschreven.
Merk op dat de hiervoor besproken semantische regels voor de integriteit van de database kunnen
worden gezien als een middel om de data te beveiligen tegen schadelijke operaties door geoorloofd
gebruik: incorrecte gegevens dienen daarbij zo veel mogelijk te worden gedetecteerd en geweerd.
Regelmatig een back-up maken van de database is belangrijk voor het herstelproces, maar is op zich
onvoldoende omdat een beschadigde database bij voorkeur moet worden hersteld tot haar toestand
net vóór het falen en niet tot haar toestand net vóór de meest recentste back-up.
Optimaal systeemgedrag
Voorgaande faciliteiten moeten worden gerealiseerd zonder veel nadeel voor de gebruikers: een
dbms moet in staat zijn om grote hoeveelheden data te beheren en daarbij de gebruikers nog
redelijke toegangstijden garanderen. Een belangrijk deel van de techniek in een dbms is daarom
gericht op het optimaliseren van de datatoegang. Een efficiënte secundaire bestandsorganisatie is
daarbij noodzakelijk. Veelal zal de secundaire bestandsorganisatie via een gepaste
Hoofdstuk: /Databasesysteem
Het fysiek falen van een databasesysteem kan bijvoorbeeld een externe oorzaak hebben, zoals
stroomuitval of veroorzaakt worden door een hardwaredefect, bijvoorbeeld een defect
opslagmedium. De beveiligingsfaciliteiten van een dbms moeten in geval van fysiek falen het verlies
aan data zo veel mogelijk beperken.
1
5
DATABASE ontwerpen
1 januari 2011
parameterinstelling door de DBA kunnen worden geconfigureerd. Een ander aspect is de
optimalisatie van de uitvoering van de instructies van de gebruikers.
Verschillende gebruikers die het systeem tegelijkertijd gebruiken, hebben soms conflicterende
prestatie-eisen die onmogelijk allemaal tegelijk kunnen worden gerealiseerd. Zo kan de vraag voor
directe analyse resultaten door een manager het systeem kortstondig belasten, wat tijdelijk funest
kan zijn voor de prestatie van bijvoorbeeld de dataregistratie bij de productie. Wanneer dergelijke
conflicten zich voordoen, moet de DBA - steeds in overleg met de DA - gepast kunnen ingrijpen en
het meest geschikte compromis voor de onderneming uitwerken.
Administratie en controle
Een dbms moet de gebruikers - dikwijls de DBA's - voldoende faciliteiten bieden voor
systeemadministratie en systeemcontrole.
Tot de belangrijkste administratie- en controletaken behoren onder meer: het aanpassen van de
secundaire bestandsorganisatie aan de actuele noden van de onderneming, het bijhouden en
analyseren van prestatiestatistieken, het beheer van gebruikersprofielen en -accounts, het aanmaken
van back-ups, het aanleggen van een logbestand voor beveiligingsdoeleinden (hierbij worden de
acties van gebruikers in meer of minder detail geregistreerd) en het onderhoud van het
databasesysteem.
De hedendaagse databasemanagement systemen zijn vrijwel
allemaal gebouwd volgens een 'drielagen' -architectuur die
geïnspireerd is op de architectuur die is voorgesteld door de
ANSII SPARC dbms-studiegroep . Deze architectuur zie je in naast
liggende figuur. Dit betekent echter niet dat er geen andere
architecturen bestaan en worden gebruikt.
De drie lagen van deze structuur noemen we respectievelijk de
interne laag, de logische laag en de externe laag.
De interne laag
De interne laag (ook opslaglaag genoemd) staat het dichtst bij de fysieke opslag van de database. In
deze laag beschrijven we de databaserecords die eerder werden geïntroduceerd. Daarbij besteden
we onder meer aandacht aan structuur, manier van opslag en toegangspaden. Databaserecords
worden georganiseerd in bestanden. De structuur van de records wordt vastgelegd in recordtypes,
Hoofdstuk: /Databasesysteem
Architectuur
De implementatie van een dbms gebeurt volgens een
architectuur die bestaat uit verschillende lagen, gaande van de
fysieke gegevensopslag naar de logische entiteiten (bijvoorbeeld
tabellen en objecten) die door de toepassing worden gebruikt.
Zoals kort werd aangegeven in het historische overzicht is de
belangrijkste reden voor een 'meerlagen' -architectuur het
verkrijgen van dataonafhankelijkheid.
1
6
DATABASE ontwerpen
1 januari 2011
de manier van opslag wordt bepaald door de keuze van de primaire bestandsorganisatie en de
toegangspaden worden mede bepaald door de keuze van de secundaire bestandsorganisatie.
Records van hetzelfde recordtype kunnen een vaste of variabele lengte hebben.
Een variabele lengte kan onder meer te wijten zijn aan de volgende feiten:

Eén of meer recordvelden hebben een datatype met domeinwaarden van een variabele
lengte. Zo zou het veld 'Naam' van het recordtype:
RECORDTYPE Artiest (Naam:CHAR(30); Voornaam:CHAR(20); Geboren:INTEGER;
Gestorven:INTEGER)
uit het voorbeeld van de schildersdatabase een geassocieerd datatype VARCHAR kunnen
hebben, waarvan de domeinwaarden bestaan uit een variabel aantal karakters (in plaats van
het datatype CHAR ( 30) , met domeinwaarden van exact dertig karakters).


Eén of meer recordvelden zijn meerwaardig. Een domeinwaarde van een meerwaardig
recordveld is een collectie die kan bestaan uit een vast of variabel aantal elementen.
Bijvoorbeeld, het recordtype 'Artiest' zou een meerwaardig veld 'Hobby' kunnen hebben met
geassocieerd datatype SET (VARCHAR) , waarvan elke waarde een verzameling van hobby's
voorstelt.
Eén of meer velden van het recordtype zijn optioneel. Het is niet verplicht om een waarde op
te geven voor optionele velden. Zo zou bijvoorbeeld kunnen worden vastgelegd dat de
velden 'Geboren' en 'Gestorven' van het recordtype 'Artiest' optioneel zijn.
Voor een recordtype met
records van vaste lengte
wordt ook de recordlengte
weggeschreven in de file
header. Het dbms kan dan
de eerste byte van een
recordveld lokaliseren op
basis van de relatieve
positie van deze byte ten
opzichte van de startbyte
van het record. Een
voordeel van het werken
Hoofdstuk: /Databasesysteem
Om de records van een bestand te beschrijven, kan vooraan in het bestand een zogenoemde file
header worden opgenomen, waarin onder meer de manier van opslag van de voorkomende
recordtypes is beschreven. Elk record in het bestand kan dan worden voorafgegaan door een
recordtype-indicator die
verwijst naar de van toepassing zijnde beschrijving.
1
7
DATABASE ontwerpen
1 januari 2011
met records van vaste lengte is hierom de vereenvoudigde recordtoegang. Een nadeel is het
inefficiënte gebruik van het geheugen: bij te grote veldlengtes heeft men ongebruikte ruimte, bij te
kleine veldlengtes is er niet genoeg ruimte voor de dataopslag met informatieverlies als gevolg.
De manier van opslag bij dit
voorbeeld werd voor records van
het recordtype 'Artiest'
geïllustreerd in de volgende
figuur (a) . Voor de unieke
identificatie van de records werd
elk recordtype uitgebreid met
een prefix-veld. Dit prefix -veld is
vastgelegd door de gekozen
primaire bestandsorganisatie.
Voor een betere toegankelijkheid werd verder voor elk recordtype een index gedefinieerd. In zijn
eenvoudigste vorm kan een index worden gezien als een geordende lijst van koppels van de vorm:
< veldwaarde,referentie>
Hierbij is veldwaarde een waarde die voorkomt in het veld waarover de index is gedefinieerd.
Referentie is een pointer naar de geheugenplaats waar een record met die veldwaarde is opgeslagen.
Deze pointer kan bijvoorbeeld het adres (track/cilinder, sector) zijn van de pagina waarin het record
zich bevindt. De elementen – koppels- van de index zijn geordend op basis van hun veldwaarde. Dit
laat het toe om snel, volgens het betreffende recordveld, te navigeren door de records. Indexen zijn
een voorbeeld van technieken die deel uitmaken van de secundaire bestandsorganisatie.
Bij een recordtype met records van variabele lengte is er een bijkomende techniek nodig om het
einde van de recordvelden aan te duiden. Een bruikbare techniek, die gebaseerd is op het gebruik
van separatorkarakters zie je in figuur hierboven (b). Daarbij hebben we de volgende, alternatieve
definitie voor het recordtype 'Artiest' gebruikt:
Hierbij hebben de velden 'Naam', 'Voornaam' en 'Hobby' nu een variabele lengte, is 'Hobby' ook een
meerwaardig veld en zijn de velden 'Geboren' en 'Gestorven' optioneel. Omdat er optionele velden
zijn, werd elke veldwaarde in het record gemerkt met een veldnaamindicator (Vo, V1 ,V2 ,V3 ,V4 en Vs).
Verder plaatsen we aan het einde van elk veld een separatorkarakter: voor het laatste veld van het
record is dit een 'einderecord' -indicator, voor alle andere velden is dit een 'einde_veld' -indicator.
Voor de beschrijving van de meerwaardige velden is er ook een derde soort separatorkarakter, de
'einde_waarde' -indicator, nodig om de respectieve waarden voor het veld van elkaar te kunnen
onderscheiden. De separatorkarakters kiezen we zodanig dat ze niet als karakter voorkomen in een
toegelaten waarde van een datatype dat door het dbms wordt ondersteund. Variaties en
alternatieve beschrijvingstechnieken zijn mogelijk.
Zoals is aangegeven in een eerdere figuur ligt de interne laag het dichtst bij de fysieke opslag.
Opslagdetails over de primaire en secundaire bestandsorganisatie, die doorgaans onder het beheer
Hoofdstuk: /Databasesysteem
RECORDTYPE Artiest (Naam: VARCHAR ; Voornaam: VARCHAR ; Hobby:SET(VARCHAR);
OPTIONAL Geboren:INTEGER; OPTIONAL Gestorven:INTEGER)
1
8
DATABASE ontwerpen
1 januari 2011
van het besturingssysteem vallen, worden niet beschreven in de interne laag. Zo wordt er
bijvoorbeeld niet aangegeven op welke fysieke pagina('s) een record is weggeschreven. Evenmin
wordt in de interne laag meer detail gegeven over hoe de toegang tot de fysieke pagina's wordt
geoptimaliseerd. Dergelijke fysieke opslagdetails zijn heel (besturings)systeemspecifiek en worden
buiten de architectuur van een dbms gehouden.
De logische laag
In de logische laag (ook de gemeenschappelijke laag genoemd) werken we met een abstracte
voorstelling van de database. Deze representatie vormt een gemeenschappelijke kijk op de volledige
database, zoals deze wordt gezien door alle gebruikers die geen toegangsbeperkingen tot de
database hebben.
De logische laag houdt alle fysieke opslagdetails verborgen, zodat alle aandacht kan gaan naar de
abstracte beschrijving van alle in de database voorkomende entiteiten, verwantschappen tussen
entiteiten, gebruikersgedefinieerde operatoren en integriteitsbeperkingen. De abstracte beschrijving
van de database dient te gebeuren volgens de voorschriften van het gebruikte databasemodel en
noemen we het databaseschema. Naast de operatoren voor de definitie van databaseschema's legt
het databasemodel de operatoren vast voor het manipuleren van databases. Op deze manier heeft
het databasemodel een zeer belangrijke impact op het soort toepassingen dat het dbms efficiënt kan
ondersteunen. Toepassingen moeten de mogelijkheden van het databasemodel optimaal benutten
en tegelijkertijd berusten in de beperkingen ervan.
De databaserecords uit voorbeeld van de schilderdatabase kunnen in de logische laag gedefinieerd
zijn zoals in een eerder figuur te zien, dat is:
RECORDTYPE Schilderij (ID:CHAR(3); Naam:CHAR(30); Artiest:CHAR(30); Periode: INTEGER;
Waarde:REAL; Eigenaar:CHAR(30) )
RECORDTYPE Artiest (Naam:CHAR(30); Voornaam:CHAR(20); Geboren:INTEGER; Gestorven:
INTEGER)
RECORDTYPE Eigenaar (Naam:CHAR(30); Plaats:CHAR(20); Land:CHAR(20) )
Hoofdstuk: /Databasesysteem
Naast de structurele aspecten, gedrag- en integriteitaspecten, behandelen we op het logische niveau
ook nog andere aspecten, zoals gemeenschappelijke faciliteiten voor beveiliging, falen en herstel en
het delen van de database door verschillende gebruikers.
1
9
DATABASE ontwerpen
1 januari 2011
De externe laag
Omdat een dbms tegelijkertijd door een aantal gebruikers gebruikt kan worden en elke individuele
eindgebruiker meestal slechts een kleine fractie van de database benut, is er ook een externe laag
(ook de individuele laag genoemd). Deze laag staat het dichtst bij de toepassingsontwikkelaars en
eindgebruikers.
In de externe laag worden de zogenoemde (externe) views op de database gedefinieerd. Een view is
een kijk op de database die bepaalt hoe de database wordt gezien door een beperkte groep van
eindgebruikers en toepassingsontwikkelaars: voor deze gebruikers lijkt het alsof de view de database
is. De manier waarop individuele gebruikers de database moeten of wensen waar te nemen, kan
immers verschillen van de manier waarop de database logisch is beschreven. Voor een
gebruikersgroep kunnen, afhankelijk van de noden en toegangsrechten, verschillende views zijn
gedefinieerd. Een view kan toegankelijk zijn voor verschillende gebruikersgroepen.
Een view kan onder meer worden aangemaakt voor beveiliging (afschermen van een deel van de
gegevens), voor het afleiden van nieuwe data uit de database (daarbij moet worden beschreven hoe
de nieuwe data kunnen worden verkregen) of voor dataconversie (om te voldoen aan de
gebruikerswensen).
Voorbeelden van views uit de externe laag voor de schilderdatabase uit het eerdere voorbeeld zijn:
In COBOL-code:
01 Tentoonstellingsitem.
02 ItemNaam PIC X(30).
02 Schilder PIC X(30).
De eerste view in dit voorbeeld is ontworpen voor ontwikkelaars die werken met de COBOLprogrammeertaal.
Het databaserecordtype 'Schilderij' wordt erdoor voorgesteld als 'Tentoonstellingsitem'. Alleen de
'Naam' - en 'Artiest' -velden van het recordtype zijn zichtbaar in de view, zij het onder een voor de
toepassing meer geschikte naam 'ItemNaam', respectievelijk 'Schilder'. De tweede en derde view zijn
ontworpen voor ontwikkelaars die werken met de programmeertaal Java. De tweede view is ook
gedefinieerd voor het recordtype 'Schilderij', daar waar de derde view is gedefinieerd over het
recordtype 'Artiest'. In de derde view is een nieuw afgeleid veld 'LeeftijdBijSterfte' geïntroduceerd,
waarvan de waarde bijvoorbeeld wordt berekend als het verschil 'Gestorven - Geboren' van het
sterftejaar en geboortejaar van de 'Artiest'. Dit nieuwe veld is weergegeven als operatie van de
Hoofdstuk: /Databasesysteem
In Java-code:
class Schilderij {
String Naam;
String Schilder;
}
class Schilder {
String Naam;
String Voornaam;
int LeeftijdBijSterfte( );
}
2
0
DATABASE ontwerpen
1 januari 2011
klasse. De Java-code voor deze operatie maakt deel uit van de implementatie van de klasse' Schilder'
en wordt niet getoond in het voorbeeld.
Niet alle views hoeven gespecificeerd te zijn in een programmeertaal. Als het databasemodel een
eigen DDL (Data Definition Language) heeft, die de definitie van views ondersteunt, gebruiken we
deze voor de specificatie. Een voorbeeld is de DDL van de SQL-standaardtaal voor relationele
databases.
Mappings
In de drie hiervoor beschreven lagen wordt enkel gewerkt met intermediaire beschrijvingen van data.
De feitelijke data bevinden zich in de fysieke opslag. Wanneer gebruikers of toepassingsprogramma's
werken met de database via de externe laag, moeten ze de aangevraagde operaties eerst vertalen
naar operaties in de onderliggende logische laag, daarna naar operaties in de interne laag en die ten
slotte omzetten naar operaties die inwerken op de fysieke opslag. Omgekeerd moeten de resultaten
van een interactie (bijvoorbeeld de resultaten van de zoekopdracht) via respectievelijk de interne
laag, de logische laag en de externe laag naar de gebruiker of het toepassingsprogramma worden
gecommuniceerd. Voor een gebruiker die werkt met de database via de logische laag, valt de
communicatie met de externe laag uiteraard weg. Een interactie via de interne laag is bij veel
databasesystemen niet toegestaan en anders voorbehouden aan de DBA.
De omzettingsprocessen van data en operaties tussen de drie lagen van de architectuur beschrijven
we aan de hand van mappings. Deze zijn in figuur waar de drie lagen structuur in wordt beschreven,
aangegeven met dubbele pijlen. Zoals hiervoor al werd vermeld, wordt de correspondentie tussen de
interne laag en de fysieke opslag buiten de architectuur gehouden, omdat deze te sterk
systeemafhankelijk is. Hierom wordt er in de architectuur geen mapping gemaakt tussen de interne
laag en de fysieke opslag. Uiteraard moet het dbms kunnen werken met de fysiek opgeslagen data,
wat interactie met het besturingssysteem vereist.
Voor elke view in de externe laag is er een 'externe/logische' -mapping gedefinieerd. Deze mapping
definieert de correspondentie tussen de view en de logische voorstelling van de database. Zoals je
ziet in voorbeeld,kunnen velden daarbij een andere naam of datatype krijgen, kunnen er nieuwe
afgeleide velden worden toegevoegd of kunnen er velden verborgen gehouden worden.
Tussen de logische laag en de interne laag is er juist één 'logische/interne' -mapping gedefinieerd.
Deze mapping definieert de correspondentie tussen de logische en de interne representatie van de
database. Opnieuw zijn verschillen mogelijk: extra interne velden, andere veldnamen, enzovoort (zie
de andere voorbeelden).
Voor de volledigheid vermelden we nog dat de meeste systemen het toelaten om views te definiëren
op basis van andere views, in plaats van op basis van de logische beschrijving van de database. In
voorkomend geval moeten er ook 'externe/externe' mappings worden aangemaakt.
Door het gebruik van een 'meerlagen' -architectuur, zoals we in de vorige paragraaf beschreven,
wordt dataonafhankelijkheid verkregen. Dit betekent concreet dat, door een gepaste aanpassing van
de mappings, de beschrijving van de data in een bepaalde laag wordt aangepast zonder dat dit een
impact heeft op de andere lagen. Het grote voordeel hiervan is een gemakkelijker onderhoud van het
databasesysteem. Er wordt een onderscheid gemaakt tussen fysieke en logische
dataonafhankelijkheid.
Fysieke dataonafhankelijkheid
Fysieke dataonafhankelijkheid betekent dat de interne beschrijving van de database en de
'logische/interne' -mapping kunnen worden aangepast zonder dat dit een gevolg heeft op de logische
Hoofdstuk: /Databasesysteem
Dataonafhankelijkheid
2
1
DATABASE ontwerpen
1 januari 2011
beschrijving van de database (en dus ook op de views die eventueel zijn gedefinieerd in de externe
laag).
Aanpassing van de interne beschrijving kan nuttig zijn wanneer de fysieke opslag moet worden
gereorganiseerd. Bijvoorbeeld, wanneer er ten gevolge van gewijzigde interactiepatronen van de
gebruikers wordt gekozen voor een nieuwe, meer efficiënte primaire bestandsorganisatie. Of
wanneer, om de prestatie te verbeteren,
de secundaire bestandsorganisatie moet worden aangepast door de creatie van bijkomende indexen.
Door de fysieke dataonafhankelijkheid worden de primaire en secundaire bestandsorganisatie
afgeschermd van de logische database. Zo komen gebruikers en toepassingsprogramma's niet
onnodig in contact met de fysieke opslagdetails en kan alle aandacht gaan naar de intuïtievere en dus
beter handelbare, abstracte databasestructuur en operatoren. In principe komt alleen de DBA in
contact met de fysieke opslagparameters.
Dankzij de fysieke dataonafhankelijkheid zijn toepassingsprogramma's immuun voor aanpassingen
aan de fysieke opslagstructuur en toegangsmechanismen. Dit biedt uiteraard enorme
onderhoudsvoordelen voor de toepassingsprogramma's.
Logische dataonafhankelijkheid
Logische dataonafhankelijkheid betekent dat de logische beschrijving van de database en de
'externe/logische' -mappings kunnen worden aangepast zonder dat dit een impact heeft op de
diverse views.
Aanpassingen aan de logische databasebeschrijving kunnen nodig zijn wanneer een recordtype moet
worden hernoemd, aangepast of verwijderd of wanneer een nieuw recordtype moet worden
aangemaakt.
Toepassingsprogramma's worden hierdoor ook immuun voor aanpassingen aan de logische
beschrijving van de database, wat opnieuw een onderhoudsvoordeel met zich meebrengt. De
logische databasebeschrijving kan (samen met de fysieke beschrijving) evolueren met de noden van
de onderneming, zonder dat daarbij steeds de bestaande toepassingsprogramma' s moeten worden
aangepast. De enige vereiste is het aanpassen van de 'externe/logische'-mappings.
Ter afsluiting van dit hoofdstuk staan we even stil bij de voor- en nadelen van het gebruik van
databasesystemen. Wanneer je te maken krijgt met een vraag naar gecomputeriseerde
gegevensopslag moet je deze voor- en nadelen grondig afwegen om tot de meest geschikte oplossing
te komen.
Het belangrijkste voordeel bij het kiezen voor het gebruik van een databasesysteem is dat de
systeemontwikkelaar zich niet hoeft te bekommeren om de implementatie van de dbms - faciliteiten
voor onder meer het delen van dezelfde data, beveiliging en integriteit. Alle aandacht kan hierdoor
worden gevestigd op de feitelijke structuur en functionaliteit van de toepassingen. Hoe meer dbms
faciliteiten vereist zijn bij het op te zetten systeem, hoe beter het is om te kiezen voor een
databasesysteem.
Het nadeel van een databasesysteem is dat sommige dbms-faciliteiten voor de toepassing overbodig
kunnen zijn en zo een zekere overlast en prestatieverlies met zich mee kunnen brengen. Hierdoor
kan het voordeliger zijn om te kiezen voor de implementatie van een eenvoudiger, weliswaar volledig
op maat ontworpen, opslagsysteem. Dit kan onder meer het geval zijn wanneer:
 het te ontwikkelen systeem eenvoudig is, weinig of geen dbms-faciliteiten vereist, volledig
omschreven is en met de tijd bijna niet zal evolueren. Men hoeft zich dan niet te
bekommeren over de installatie en configuratie van een complex dbms.
 de eisen (snelheid, compactheid van code en compactheid van opgeslagen data) aan het
systeem zo uitgebreid zijn, dat deze onmogelijk kunnen worden voldaan wanneer een
volwaardig dbms wordt gebruikt. Dit kan onder meer het geval zijn als we strenge eisen
Hoofdstuk: /Databasesysteem
Wanneer gebruik je een databasesysteem?
2
2
DATABASE ontwerpen

1 januari 2011
stellen aan de uitvoeringstijd (toepassingen in productieomgevingen, telecommunicatie
enzovoort) of als we strikte beperkingen opleggen aan de geheugencapaciteit (toepassingen
op mobiele devices).
men te kampen heeft met budgettaire beperkingen: commerciële databasesystemen zijn
meestal niet goedkoop en vragen vaak extra investeringen in zowel hardware, software als
training van de gebruikers. Zelfontwikkelde opslagsystemen vragen echter ook extra
investering zodat in voorkomend geval een grondig kosten/baten analyse van beide
scenario’s zeker aangewezen is. Een ‘open source’ dmbs kan een goed alternatief zijn. Let
wel dit laaste brengt ook de nodige kosten mee. Bijvoorbeeld er moet intern kennis over het
dmbs aanwezig zijn. Deze kennis zal betaald moeten worden.
Hoofdstuk: / Vragen deel 1a
Om deels tegemoet te kunnen komen aan voorgaande situaties bieden de meeste constructeurs van
databasesystemen ook afgeslankte versies van hun systemen aan.
2
3
DATABASE ontwerpen
1 januari 2011
Vragen deel 1a
Hoofdstuk: / Vragen deel 1a
1. Wat is het verschil tussen data (gegevens) en informatie? Waarom is het nuttig om binnen de
context van een database een onderscheid te maken tussen beiden?
2. Wat is een database, een databasesysteem en een databasemanagementsysteem?
3. Uit welke componenten bestaat een databasesysteem?
4. Schets de geheugen hiërarchie. Bespreek de rol van de verschillende geheugentypen die
hierin voorkomen met betrekking tot databases. Waarom zijn databasebuffers belangrijk?
5. Wat zijn database records? Welke types kan men onderscheiden? Hoe kunnen deze worden
beschreven?
6. Waartoe dienen datawarehousing en datamining? Waar staan deze ten opzichte van
databases?
7. Wat zijn gebruikersprofielen? Bespreek de taken van een data-administrator en een
database-administrator.
8. Bespreek databasedefinitie, databasemanipulatie en databasereconstructie.
9. Waarom is het noodzakelijk dat databases kunnen worden gedeeld? Wat zou er gebeuren als
dat niet kan?
10. Waarom is het noodzakelijk dat databases worden beveiligd?
11. Waarom is er een verschil tussen de interne laag van de drielagen architectuur en de fysieke
dataopslag? Wat is het nut van de interne laag?
12. Wat zijn indexen? Waartoe worden deze gebruikt in databases?
13. Wat is het nut van de logische laag en de externe laag van de drie lagen architectuur?
14. Waarop slaat dataonafhankelijkheid? Geef met een concreet voorbeeld aan wat het nut
hiervan is.
15. Waarmee moet men rekening houden bij de keuze om een toepassing wel of geen
databasesysteem te gebruiken?
16. Bedenk een realistische toepassing waarbij je zeker een zelfontwikkeld opslagsysteem zou
kiezen.
2
4
DATABASE ontwerpen
1 januari 2011
Relationele database
In een relationele database worden gegevens, voor de gebruikers, geordend in tabellen. Dit maakt
het onder andere mogelijk om snel specifieke gegevens te selecteren. Hieronder staan de gegevens
in een databasetabel.
Door in deze tabel naar een cursus_id te zoeken in de cursus_id-kolom kunnen snel de bijhorende
titel en categorie opgevraagd worden. Dat gaat veel sneller dan door een tekstbestand heen
wandelen totdat je de gewenste informatie gevonden hebt. Bij een relationele database kunnen
gegevens uit specifieke rijen, kolommen en zelfs uit verschillende tabellen gecombineerd opgevraagd
worden. Je kunt het cursus_id (de 'primaire sleutel') gebruiken om de cursus te koppelen aan
gegevens in andere tabellen. Hierover later meer.
Het concept van de relationele database waarin gegevens zijn geordend in tabellen is bedacht in de
jaren 70 door meneer Ted Codd. De relationele database is een zeer krachtige methode voor het
opslaan van gegevens gebleken. Tegenwoordig gebruiken heel veel programma's een relationele
database om gegevens in op te slaan.





Oracle. Oracle wordt in de regel gebruikt voor grotere professionele applicaties
Microsoft SQL server. Het professioneel RDBMS van Microsoft wordt gebruikt voor alle
soorten applicaties, van studentenapplicaties tot professionele applicaties met veel
gebruikers. MSSQL is alleen beschikbaar voor Windows.
Mysql community en onder zowel hobbyisten en beginners als professionelen wereldwijd.
Mysql is gratis (of beter gezegd 'vrij') verkrijgbaar.
IBM doet ook een grote duit in het zakje met verschillende databasesystemen, waarvan DB2
de populairste is.
Microsoft Access is een uitgekleed RDBMS. Het mist sommige functies van een professioneel
RDBMS en is bedoeld voor kantoor- en thuisgebruik.
Een database-ontwerp maak je niet voor een bepaald RDBMS. Het ontwerp van de database is
onafhankelijk van het databasesysteem, zolang je een relationeel databasesysteem (RDBMS)
gebruikt. Je zou de database die we in deze cursus ontwerpen op elk van bovengenoemde database-
Hoofdstuk: Relationele database
Tegenwoordig zijn er tal van verschillende Relationele Database Management Systemen (RDBMS) in
gebruik. Tot de toppers van de database-industrie behoren
2
5
DATABASE ontwerpen
1 januari 2011
Hoofdstuk: Relationele database
systemen kunnen maken. Je moet daarbij wel gebruik maken van de voor die database ontwikkelde
instrumenten (SQL dialecten enzovoort)
2
6
DATABASE ontwerpen
1 januari 2011
Voordelen en mogelijkheden van relationele databases
Naast het snel opzoeken van informatie heeft een relationele database nog een aantal voordelen.







Een relationele database kan gegevens in verschillende tabellen relateren door het gebruik
van sleutels. Daardoor kunnen gerelateerde gegevens uit verschillende tabellen tegelijk
opgevraagd worden.
Efficiënte opslag van gegevens. Gegevens worden maar één keer en op één plek zijn
opgeslagen. Dit zorgt ervoor dat een wijziging of verwijdering van informatie altijd maar op
één plek hoeft te gebeuren.
Met een relationele database kan je regels opstellen voor het soort gegevens dat in een veld
opgeslagen kan worden. Zo kun je onder andere datumvelden, tekstvelden en numerieke
velden aanmaken.
Integriteit van gegevens. Door het formuleren van de juiste relaties van tabellen kun je de
integriteit (correctheid, betrouwbaarheid) van de gegevens die zijn opgeslagen beter
garanderen.
De meeste relationele databasesystemen kennen een rechtenstructuur, waarmee aan
verschillende gebruikers verschillende rechten toegekend kunnen worden. Zo kun je het
recht hebben om gegevens uit de database te op te vragen, maar niet om nieuwe gegevens
in te voeren.
Relationele databases zijn geavanceerde programma's die geoptimaliseerd zijn voor
bepaalde taken, zoals bijvoorbeeld het zoeken door numerieke velden, data sorteren, etc.
Deze technologie maakt het mogelijk om zeer snel gegevens te zoeken en te presenteren.
Voor het bevragen van een relationele database is een krachtige 'query taal' beschikbaar met
de naam 'Structured Query Language' (SQL). Deze taal maakt het onder andere mogelijk om
zeer geavanceerde gegevensselecties te maken uit de database.
Het relationeel is een standaard, net als SQL, de taal om relationele database te bevragen.
Standaardisering maakt het mogelijk om gegevens uit de ene database vaak relatief
eenvoudig naar de andere database over te zetten.
Hoofdstuk: Relationele database

2
7
DATABASE ontwerpen
1 januari 2011
Klantcontactsysteem
Zoals gezegd is de leidraad van deze cursus relationele database ontwerpen een
'klantcontactsysteem'.
De eisen voor dit klanten systeem zijn:
In dit klantcontactsysteem willen we contactmomenten opslaan. Een contactmoment ontstaat elke
keer dat er tussen ons en een van onze klanten gecommuniceerd wordt via de telefoon, per e-mail of
per post. Een programma dat gebruik maakt van deze database kan de database gebruiken om
bijvoorbeeld een overzicht te genereren van de contactmomenten die er geweest zijn met een klant.
Of om klantgegevens op te vragen van een specifieke klant.
We willen voor het klantcontactsysteem een database ontwerpen waarin we klantgegevens en
'contactmomenten' op kunnen slaan. Klantgegevens zijn bijvoorbeeld naam, adres, telefoonnummer
en het e-mailadres. Een contactmoment is een beschrijving van elke keer dat er gecommuniceerd
wordt tussen het bedrijf en een klant.
Door een goed database-ontwerp te maken kunnen we een programma dat gebruik gaat maken van
de database ruime mogelijkheden geven voor bijvoorbeeld


Het opvragen van klantgegevens (met behulp van het SQL SELECT statement)
Het opvragen van alle contactmomenten van een klant
Het zoeken van contactmomenten op een bepaalde datum of een datuminterval.
Het aanpassen, invoeren en verwijderen van klantgegevens (met behulp van de SQL UPDATE
statements)
Het aanpassen, invoeren en verwijderen van contactmomenten
etc
Hoofdstuk: Relationele database




2
8
DATABASE ontwerpen
1 januari 2011
Tabellen en de primaire sleutel
Een relationele database bestaat uit tabellen. In deze tabellen zijn gegevens van dezelfde soort in
rijen of in vaktaal records opgeslagen. Je zag eerder al een voorbeeld van een tabel waarin wat
informatie over cursussen is opgeslagen. Die tabel bestaat uit 6 records die elk informatie over één
cursus bevatten. Alle cursussen zijn verschillend, maar van elke cursus is dezelfde informatie
opgeslagen.
Voor het klantcontactsysteem dat we willen maken ligt het voor de hand dat we een klanttabel
maken. Hieronder staat een voorbeeld van een tabel met klantinformatie.
Hoe kun je in deze tabel een klant selecteren? Je zou kunnen zoeken op de voornaam. Dat is geen
goed idee, want naarmate het aantal klanten in de tabel groeit wordt de kans groter dat er nog een
klant komt die Jan heet en dan kun je niet meer met zekerheid de juiste Jan selecteren. Je zou
kunnen zoeken op een combinatie, bijvoorbeeld de voornaam en achternaam. Maar hoe lang zou het
duren voordat zich een tweede Jan Jansen aanmeldt als klant?
Om klanten uniek te kunnen identificeren moet elke klant gekoppeld zijn aan een uniek stukje
informatie, bijvoorbeeld een klantnummer. Deze unieke informatie wordt de primaire sleutel
(primary key) genoemd. Een van de belangrijkste regels van het relationeel model is dat alle rijen in
een tabel uniek te identificeren zijn door middel van de primaire sleutel. Het cursus_id uit het eerste
tabelvoorbeeld op deze pagina is zo'n primaire sleutel.
Er zijn tal van voorbeelden te bedenken van nummers en codes uit het dagelijks leven die
waarschijnlijk kunnen dienen als primaire sleutel in een database.
Een bestelnummer
Een rekeningnummer
Een sofinummer
Een factuurnummer
Een klantnummer
Een productnummer
Wat hebben al deze codes gemeen?


Ze zijn allemaal uniek. Jouw rekeningnummer bestaat altijd maar één keer, net als een
factuurnummer, je sofinummer, etc.
Ze werken allemaal als toegangsweg naar meer informatie. Aan een factuurnummer is een
datum, een bedrag, etc gekoppeld. Aan een productnummer kan een productbeschrijving,
een plaatje, etc gekoppeld zijn.
De primaire sleutel wordt dus gebruikt om rijen in tabellen uniek te identificeren en om gegevens in
verschillende tabellen aan elkaar te koppelen. Primaire sleutels zijn zoals gezegd altijd uniek en
Hoofdstuk: Relationele database






2
9
DATABASE ontwerpen
1 januari 2011
mogen daarom maar 1 keer voorkomen in de kolom. Het is in onderstaande tabel dus niet mogelijk
om een nieuwe rij met klantnummer 1 toe te voegen. Geef je aan dat het klantnummer de primaire
sleutel is, dan zal het databasesysteem er (voor zover ik weet altijd) automatisch voor zorgen dat
klantnummers in die kolom uniek zijn.
Hoofdstuk: Relationele database
Je kunt aan deze afbeelding overigens niet zien dat het klantnummer de primaire sleutel is. In de
ontwerpweergave van de tabel is dat wel te zien.
3
0
DATABASE ontwerpen
1 januari 2011
Gegevens koppelen
In de klanttabel slaan we klantgegevens op, maar we moeten voor het klantcontactsysteem ook
contactmomenten opslaan. Een contactmoment ontstaat wanneer een klant belt, e-mailt of een brief
schrijft.
Je zou misschien bedenken om de datum en een beschrijving van het contactmoment in de
klanttabel op te slaan bij de juiste klant. Dat kan echter niet. Het klantnummer moet uniek zijn in de
klantnummerkolom. Er mag dus altijd maar 1 rij per klant zijn in de klanttabel. Je zou nog alle
contactmomenten in 1 cel kunnen opslaan op dezelfde rij als de klantgegevens (als een soort flat file
in 1 cel), maar dat is absoluut niet wenselijk, omdat het dan heel moeilijk wordt om door de
contactmomenten te zoeken. (Nb. later in deze cursus databases worden de regels voor goed
database-ontwerp op een rij gezet).
Conclusie: we moeten een nieuwe tabel maken voor contactmomenten. Eerst bepalen we wat we
allemaal van een contactmoment willen opslaan.






contactmoment_id (primaire sleutel)
klantnummer (zodat het contactmoment aan één klant gekoppeld is)
Datum en tijd
Een beschrijving van het contactmoment (Inhoud telefoongesprek, inhoud e-mail, inhoud
brief, etc)
Nam het bedrijf contact op met de klant of andersom?: inkomend_uitgaand
Communicatietype (telefoon, e-mail, fax): com_type
Op elke rij van de contactmomententabel staat informatie over een uniek contactmoment. Elk
contactmoment is uniek identificeerbaar door de primaire sleutel, het contactmoment_id (eerste
kolom). Bovendien is elk contactmoment gekoppeld aan een klant uit de klanttabel door middel van
het klantnummer in de tweede kolom.
Met behulp van het klantnummer kunnen bij elke klant in de klanttabel de contactmomenten
opgezocht worden en andersom bij elk contactmoment de betreffende klant uit de klanttabel. Er is
hier sprake van een '1 op veel' relatie tussen de klant en zijn of haar contactmomenten.
Nu je een voorbeeld gezien hebt van een database is het tijd om in te gaan op de relaties die kunnen
bestaan tussen tabellen. Het voorbeeld van de klanttabel en de contactmomententabel is een 'één
Hoofdstuk: Relationele database
Hieronder staat een conceptversie van de contactmomententabel. Later in deze cursus database
ontwerpen bekijken we onderstaande tabel nog eens kritisch aan de hand van de ontwerpregels voor
relationele databases.
3
1
DATABASE ontwerpen
1 januari 2011
op veel relatie'. Voor elke klant (1) kunnen meerdere (veel) contactmomenten opgeslagen zijn. Bij
het ontwerpen van relationele databases onderscheiden we 3 soorten relaties tussen tabellen.



De één op veel relatie
De veel op veel relatie
De één op één relatie
De een op veel relatie
Bij de één op veel relatie is 1 ding gekoppeld aan 0, 1 of meer andere dingen. Je zag al een voorbeeld
met klanten en contactmomenten. 1 klant kan 0, 1 of meerdere contactmomenten hebben en een
contactmoment is altijd gekoppeld aan 1 klant.
Hetzelfde geldt voor de relatie tussen moeders en hun kinderen. Elk kind heeft maar 1 moeder, maar
een moeder kan geen, één of meerdere kinderen hebben. De één op veel relatie modelleer je in een
relationele database als twee tabellen. Elke rij in tabel A correspondeert met 0, 1, of meerdere rijen
uit tabel B. (zie afbeelding).
De klanttabel speelt de rol van tabel A en de contactmomententabel die van tabel B. Elke rij in tabel
A (ofwel, elke klant) is gekoppeld aan 0,1 of meerdere rijen (ofwel, contactmomenten) in tabel B.
Het klantnummer is de primaire sleutel in tabel A, het klantnummer in tabel B wordt de vreemde
sleutel genoemd. Een vreemde sleutel is een veld in een tabel dat verwijst naar de primaire sleutel
van een andere tabel. Het klantnummer in onze database is de primaire sleutel in de klanttabel en in
andere tabellen is het klantnummer een vreemde sleutel.
Klantnummer is de primaire sleutel (ps) in de klanttabel
Hoofdstuk: Relationele database
tabel klant
3
2
DATABASE ontwerpen
1 januari 2011
tabel contactmoment
Klantnummer is de vreemde sleutel (vs) in de contactmomententabel. Hij verwijst naar het
klantnummer in de klanttabel. Het contactmoment_id is de primaire sleutel (ps) in de
contactmomententabel.
Het kan van belang zijn of de een op veel relatie “0 of meer” is of dat hij “1 of meer is”. Hier moet in
het database ontwerp mee rekening gehouden worden.
De veel op veel relatie
Tabel A en tabel B zijn beide tabellen met een primaire sleutel. Tabel A_B verbindt records uit tabel A
en B en heet een 'koppeltabel'. Een koppeltabel bestaat uit maar twee kolommen die allebei een
vreemde sleutel bevatten.
Een “vreemde sleutel” is een waarde in een tabel (die geen sleutel in deze tabel is) die in een andere
tabel wel sleutel is. De vreemde sleutel in de linkerkolom verwijst naar de primaire sleutel uit tabel A
en die in de rechterkolom naar de primaire sleutel uit tabel B. De primaire sleutel in koppeltabel A_B
is samengesteld uit de twee vreemde sleutels. Je ziet in het voorbeeld dan ook dat de combinatie van
de twee velden uniek moet zijn in koppeltabel A_B. In het klantcontactsysteem komt (vooralsnog)
Hoofdstuk: Relationele database
De veel op veel relatie is een relatie waarbij meerdere rijen uit tabel A gekoppeld kunnen zijn aan
meerdere rijen uit tabel B. Een voorbeeld is een school, waarbij docenten les geven aan studenten.
Elke docent geeft les aan 0, 1 of meer studenten. Andersom kan elke student les krijgen van 0, 1 of
meerdere docenten. Een ander voorbeeld is de relatie tussen biermerken en leveranciers. Elke
leverancier levert meerdere biermerken, maar elk biermerk kan ook door meerdere leveranciers
geleverd worden. De veel op veel relatie modelleer je met drie tabellen. Twee brontabellen en één
koppeltabel.
3
3
DATABASE ontwerpen
1 januari 2011
geen veel op veel relatie voor, daarom staat hieronder een voorbeeld met bieren en hun
leveranciers.
Bovenstaande tabellen koppelen bieren en leveranciers in een veel op veel relatie. Eén bier kan door
0, 1 of meerdere leveranciers geleverd worden. Gentse Tripel (157) wordt bijvoorbeeld geleverd door
Horeca Import NL (157, AC001), Jansen Horeca (157, AB899) en Petersen Drankenhandel (157,
AC009). Andersom levert Petersen Drankenhandel 3 bieren uit de bierentabel, te weten Gentse
Tripel (157, AC009), Uilenspiegel (158, AC009) en Jupiler (163, AC009).
Een ander goed gebruik is om in databasemodellen relaties te benoemen. Je zou bij de hierboven
afgebeelde relatie in een model de opmerkingen "levert" kunnen zetten. Elke rij in de tabel zegt
namelijk "bier X wordt geleverd door leverancier Y", of "Leverancier Y levert bier X". Het benoemen
van relaties maakt een databasemodel leesbaarder. Deze benoeming komt niet terug in de eigenlijke
database of in de software die gebruik maakt van de database.
De een op een relatie
De één op één relatie tussen tabellen komt niet heel vaak voor. Bij de één op één relatie heeft elke rij
in tabel A 0 of 1 corresponderende rij in tabel B. Deze relatie wordt weleens gebruikt om de
tekortkomingen van een databasesysteem te omzeilen door bijvoorbeeld een tabel op te delen om
prestatiewinst te behalen.
Hoofdstuk: Relationele database
Merk op dat in bovenstaande tabellen de primaire sleutelvelden blauw en onderstreept zijn
weergegeven. In modellen van relationele databases worden primaire sleutels vaak onderstreept.
Zoals je ziet is de primaire sleutel van de koppeltabel 'bier_leverancier' samengesteld uit twee
velden. Elke rij in de koppeltabel bestaat uit de combinatie van een bier_id met een leverancier_id.
Deze tabel bestaat zogezegd uit een samengestelde primaire sleutel. Primaire sleutels moeten uniek
zijn, dus de combinaties moeten uniek zijn in de tabel.
3
4
DATABASE ontwerpen
1 januari 2011
Merk op dat elke individuele tabel vol zit met 1 op 1 relaties: de relatie tussen de primaire sleutel en
de rest van de gegevens op die rij is een 1 op 1 relatie, of laat ik zeggen zou dat moeten zijn als je het
relationeel model helemaal volgt. Een voorbeeldje: in de biertabel op de vorige pagina is Gentse
Tripel in een 1 op 1 relatie gekoppeld aan de primaire sleutel 157. Dit is precies de reden dat 1 op 1
relaties tussen tabellen niet vaak voorkomen.
Hoofdstuk: Relationele database
Een relationeel database-ontwerp is zoals je hebt gelezen een verzameling van tabeldefinities,
waarin gegevens in verschillende tabellen gekoppeld zijn in relaties. Voor het kiezen van de juiste
relaties tussen gegevens formuleert het relationeel model een aantal 'normaalvormen'. In het
volgende hoofdstuk ga ik in op het doel van normaliseren en de taken die hierbij horen.
3
5
DATABASE ontwerpen
1 januari 2011
Database normaliseren
De regels voor goed relationeel database-ontwerp zijn samengevat in 5 'normaalvormen', waarbij de
eerste normaalvorm de laagste en de vijfde de hoogste (meest genormaliseerd) is. Deze
normaalvormen zijn richtlijnen voor het juist ontwerpen van een relationele database.
Normaliseren heeft een aantal doelen.



Flexibiliteit. De genormaliseerde structuur van de database zorgt ervoor dat gegevens op
veel verschillende manieren opgevraagd en bijgewerkt kunnen worden.
Integriteit. In een genormaliseerde database ben je gegevens zeer betrouwbaar opslaan.
In een genormaliseerde database worden gegevens maar op 1 plek opgeslagen. Als je data
wil invoeren, aanpassen of verwijderen hoef je dat dus maar op 1 plek te doen.
Het normaliseren van een database schijnt voor veel mensen taaie materie te zijn. Ik heb zelf ook die
ervaring gehad, hoewel dat eigenlijk onterecht is. Het normaliseren van een database komt eigenlijk
neer op het nastreven van de volgende zaken en die zijn met een beetje oefening en puzzelen vaak
redelijk gemakkelijk te realiseren.




Het verdelen van gegevens in logische samenhangende groepen.
Het minimaliseren van de hoeveelheid data die dubbel opgeslagen is, ofwel het voorkomen
van 'redundancy'.
De gegevens zo organiseren dat het aanpassen of verwijderen van een gegeven altijd maar
op één pek hoeft te gebeuren.
Gegevens zo organiseren dat ze snel en efficiënt op te vragen zijn.
Hoofdstuk: Relationele database
De meeste applicaties gebruiken databases die zijn genormaliseerd tot de 1ste, de 2de of de 3de
normaalvorm. De 4de en 5de normaalvorm zie je zelden. In deze cursus databases bespreek ik
daarom alleen de eerste, tweede en derde normaalvorm.
3
6
DATABASE ontwerpen
1 januari 2011
De eerste normaalvorm (1NF)
De eerste normaalvorm is een set basale ontwerpregels die op elke database van toepassing moeten
zijn. Een tabel is de representatie van een 'ding' uit het systeem dat je maakt. Bijvoorbeeld
bestellingen, een klanten, contactmomenten, producten, etc. Elke rij in de tabel is een uniek
exemplaar van dat 'ding'. We noemen zo’n rij ook wel een “tupel”. Een rij vertegenwoordigt
bijvoorbeeld 1 bestelling, 1 klant, 1 contactmoment, 1 bestelling, etc.


Atomiciteit: elk veld bevat maar één waarde. Een adres bijvoorbeeld hoor je op te slaan in
aparte velden voor de straatnaam, het huisnummer en de huisnummerextensie.
Elke tabel heeft een primaire sleutel: een zo klein mogelijk aantal velden dat een rij (record)
uniek identificeert.
De volgorde van de rijen in de tabel is onbelangrijk (als je wil weten in welke volgorde
bestellingen zijn binnengekomen moet je hiervoor een datum en tijd veld maken. Hiervoor
de rijvolgorde, in de database, gebruiken is niet de bedoeling)
Hoofdstuk: Relationele database

3
7
DATABASE ontwerpen
1 januari 2011
De tweede normaalvorm (2NF)
De tweede normaalvorm: het verwijderen van redundante gegevens



De database voldoet aan alle regels van de eerste normaalvorm.
Zo min mogelijk gegevens worden dubbel opgeslagen in de database.
De velden die geen primaire sleutel zijn, zijn afhankelijk van de primaire sleutel.
Je moet bij de tweede normaalvorm je tabellen goed inspecteren op gegevens die dubbel opgeslagen
worden in een kolom. Gegevens die dubbel opgeslagen worden komen in aanmerking voor
afsplitsing in een aparte tabel. Een mooi voorbeeld hiervan is het com_type veld in de
contactmomententabel. In die kolom worden de waardes 'telefoon', 'email' en 'brief' telkens
herhaald. Daar worden gegevens dus dubbel opgeslagen (redundancy) Afsplitsen is het devies. We
maken een nieuwe tabel voor 'communicatietypes'.
Op deze manier hoeft een wijziging van de waarde 'telefoon' naar 'telefonisch' maar op 1 plek te
gebeuren. Voor de inkomend_uitgaand kolom geldt ook dat gegevens dubbel opgeslagen worden.
Hierin worden 'inkomend' en 'uitgaand' steeds herhaald. Wat is echter de kans dat er ooit een
waarde bijkomt? 0. Want met 'inkomend' en 'uitgaand' zijn alle mogelijkheden gedekt. Wat is de
kans dat je de waardes 'inkomend' en 'uitgaand' in de toekomst wil wijzigen? Klein. Vandaar dat we
de herhaling van waardes in de inkomend_uitgaand kolom toestaan.
Merk overigens op dat er altijd wel een beetje herhaling van gegevens is. Het klantnummer (vreemde
sleutel) in de contactmomententabel wordt steeds dubbel opgeslagen, maar dat is herhaling die niet
te voorkomen is. We willen immers wel dat elk contactmoment aan een klant gekoppeld is.
Hoofdstuk: Relationele database
Aan elk contactmoment is een communicatietype gekoppeld door het com_type veld. Dit veld is een
vreemde sleutel. Het verwijst naar de primaire sleutel (com_type_id) van de communicatietypen
tabel.
3
8
DATABASE ontwerpen
1 januari 2011
De derde normaalvorm (3NF)
De derde normaalvorm: transitieve afhankelijkheden, een moeilijke term voor iets vrij eenvoudigs.


De database voldoet aan alle regels van de tweede normaalvorm.
Van een tabel die voldoet aan de derde normaalvorm zijn alle velden die geen primaire
sleutel zijn uitsluitend afhankelijk van de primaire sleutel.
Zie de volgende klantentabel van een voetbalschoenenhandel.
In bovenstaande tabel zijn niet alle gegevens uitsluitend afhankelijk van de primaire sleutel. Er zijn
nog andere relaties tussen de gegevens in een record: uit de postcode is de plaatsnaam en de
provincie af te leiden. Er bestaat een 'transitieve relatie' tussen deze gegevens.
Welnu, afsplitsen is zeker mogelijk en wordt in de praktijk ook weleens gedaan. Je kunt in de
klantentabel voor elke klant alleen de (eerste 4 cijfers van de) postcode opslaan en de bijhorende
gegevens (provincie, plaatsnaam) in een aparte tabel stoppen. Deze aparte postcode-plaatsnaamprovincie tabel kun je kopen.
De relatie tussen het totaalbedrag exclusief BTW en het totaalbedrag inclusief BTW is duidelijk. Het
bedrag inclusief BTW is altijd 19% hoger dan het bedrag exclusief BTW. De waardes van de twee
prijskolommen zijn uit elkaar af te leiden. In dit geval zou je én van de twee kolommen moeten
verwijderen. Het omrekenen tussen exclusief en inclusief BTW laat je over aan het programma dat
van de database gebruik maakt. Kort gezegd: je hoort nooit gegevens op te slaan die af te leiden zijn
Hoofdstuk: Relationele database
Een ander voorbeeld van de toepassing van de derde normaal is deze (veel te) eenvoudige
bestellingentabel van een Nederlandse webwinkel.
3
9
DATABASE ontwerpen
1 januari 2011
Hoofdstuk: Relationele database
uit andere gegevens in de tabel. In de praktijk wordt zeker bij kleinere applicaties de derde
normaalvorm niet altijd toegepast.
4
0
DATABASE ontwerpen
1 januari 2011
Het definitieve database-ontwerp
We passen voor onze database de normalisatieregels losjes toe. Hieronder staan de tabellen en hun
onderlinge relaties afgebeeld. (Afbeelding komt uit MS Access 2003).
In de database zijn klanten gekoppeld aan contactmomenten door middel van het klantnummer. Je
ziet daarom in de afbeelding een verbindingslijn tussen het klantnummer in de klanttabel en het
klantnummer in de contactmomententabel. In de klantabel is klantnummer de primaire sleutel (dik
gedrukt) en in de contactmomententabel is het de vreemde sleutel. Dezelfde koppeling bestaat
tussen de contactmomententabel en de communicatietypentabel.
Een tweede aanmerking is dat de postcode in één veld opgeslagen is, terwijl je de cijfers nog van de
letters zou moeten scheiden als je streng bent (atomiciteit). Aan de hand van de eerste 4 cijfers kun
je de plaatsnaam, de gemeente en de provincie afleiden. Wil je een postcodetabel aan de database
hangen, dan is het dus handig om de postcode te verdelen over twee velden. Voor onze doeleinden
is dit echter niet nodig.
Hoofdstuk: Relationele database
Het soort relatie staat ook in de afbeelding. 1 klant correspondeert met 0 tot oneindig veel
contactmomenten. Oneindig wordt weergegeven als een ∞ teken. Hetzelfde geldt voor de relatie
tussen contactmomenten en communicatietypes. 1 communicatietype is gekoppeld aan 0 tot
oneindig veel contactmomenten. Er is nog wel iets aan te merken op deze database. Hij voldoet niet
aan de derde normaalvorm. Er bestaat er een transitieve relatie tussen de postcode en de
woonplaats. In Nederland zijn deze uit elkaar af te leiden. Om deze cursus niet nog langer te maken
heb ik besloten hiermee vrede te nemen. Ook is het voor een eenvoudige applicatie niet nodig om
het af te splitsen. Je zou dan ook een volledige postcodetabel nodig hebben. Deze is tegen kosten te
verkrijgen (en die kosten zijn niet mals, zeker als je de tabel up to date wilt houden:
abonnementskosten)
4
1
DATABASE ontwerpen
1 januari 2011
Nog een voorbeeld: webwinkel
Om deze cursus database ontwerpen af te sluiten ontwerp ik hier een iets complexere database voor
een webwinkel. Webwinkels zijn systemen die over het algemeen producten kunnen tonen,
bestellingen kunnen opnemen en klantgegevens kunnen bijhouden. Dat is natuurlijk nog geen
complete webwinkel, maar de essentie van het systeem is daarmee wel beschreven.
Enkele belangrijke spelers in dit systeem zijn dus de klant, het product en de bestelling. Welke
relaties bestaan er tussen deze zaken? Tussen klant en bestelling bestaat een één op veel relatie. Een
klant kan 0, 1 of meerdere bestellingen plaatsen en andersom is een bestelling altijd gekoppeld aan
precies 1 klant.
Tussen bestelling en product bestaat een veel op veel relatie. Elke bestelling bestaat uit 1 of meer
producten en elk product kan onderdeel zijn van 0,1 of meer bestellingen.
Microsoft Access 2003 geeft de relaties weer zoals hierboven is afgebeeld. De relatie tussen klant en
bestelling is een een op veel relatie. Tussen bestelling en product bestaat een veel op veel relatie. De
tabel bestelling_product is een koppeltabel die ervoor zorgt dat elk product aan meerdere
bestellingen gekoppeld kan zijn en andersom dat elke bestelling uit meerdere producten kan
bestaan. Merk op dat bestelling en product beide een één op veel relatie met de koppeltabel
hebben.
In de producttabel is alleen de prijs exclusief BTW opgenomen. Als je de prijs exclusief BTW kan
opvragen kun je daar in een programma makkelijk de prijs inclusief BTW uit berekenen. In de
producttabel is uitsluitend informatie opgeslagen die uniek bij een product (product_id) hoort.
Merk ook op dat nergens een totaalbedrag voor de bestelling is opgenomen. Deze informatie is
berekenbaar (af te leiden) en hoeft dus niet apart opgeslagen te worden. Het totaalbedrag vind je
natuurlijk eenvoudig door de prijzen van alle producten die deel uitmaken van de bestelling op te
tellen.
Conclusie
Een relationele database in mooi gereedschap voor het efficiënt opslaan en snel opvragen en
bewerken van gegevens. Het is niet voor niets dat de relationele database zo immens populair is.
Hoofdstuk: Relationele database
Let ook op de gegevens die zijn opgeslagen. In de klanttabel zijn (enkele) klantgegevens opgeslagen.
"Da's logisch", zou Johan Cruijff zeggen en dat is het ook. In de bestellingentabel is het klantnummer
opgenomen, zodat elke bestelling aan 1 klant gekoppeld is. Bovendien zijn de datum en tijd
opgenomen. Dat zijn eigenschappen die bij de gehele bestelling horen.
4
2
DATABASE ontwerpen
1 januari 2011
In deze cursus database ontwerpen heb ik me puur gericht op het ontwerp van de database. Wil je
echt met een database aan de slag dan zijn de volgende websites en artikelen zeker de moeite
waard.


In de categorie database van Leren.nl vind je een groot aantal database-gerelateerde
artikelen en cursussen
In de categorie SQL van Leren.nl kun je veel lezen over SQL, de 'Structured Query Language'.
SQL is de taal die gebruikt wordt om databases te bevragen en bewerken. Een onmisbare taal
als je in de praktijk met databases aan de slag wil!
Bij Wikipedia vind je uitgebreide informatie over de geschiedenis van de database,
verschillende database-modellen, de interne werking van databases en de technische
mogelijkheden van databases.
Hoofdstuk: Relationele database

4
3
DATABASE ontwerpen
1 januari 2011
Het ontwerp proces van een database.
Problemen, een slechte Database
Hier onder ziet u een database met drie tabellen. Deze database is slecht ontworpen. Elke tabel heeft
een aantal problemen.
Tabel Abonnement
Plaats
Naam
Krant
Gouda
HJ Nootenboom Automatisering Gids Stam
Gouda
H.J Nootenboom Computable
Zevenhoven S Peuskens
Uitgever
VNU
Computable
Stam
Problemen van de tabel Abonnement
De uitgever van het blad Computable is ambigu (voor meerdere uitleg vatbaar). Voor de ene
lezer is het Stam, voor andere de VNU.
Één en dezelfde lezer staat met twee verschillende spellingswijzen in de administratie.
Bezorg Adres
Naam
Postcode Krant
HJ Nootenboom 2803 DA
Adres
Autom. Gids Groenhovenweg 43
Problemen van de tabel Bezorg Adres
De postcode 12345ABC is fout, maar er is geen mogelijkheid om de juistheid van een
postcode te controleren.
Het adres van één lezer staat 2x vermeld. Dat is niet alleen lastig bij verhuizen (dubbel
bijwerken), maar het is ook onbekend wat nu de juiste versie is.
Voor het abonnement van S Peuskens op Computable ontbreken de adres gegevens.
Fakturering gegevens
Prijs Geboortedatum Naam
75,00 30 aug 1964
Postcode
Plaats
Henk Jan Nootenboom 00000 HHH Juinen
Hoofdstuk: Het ontwerp proces van een database.
H.J. Nootenboom 12345ABC Computable Groenh. weg 43-II
4
4
DATABASE ontwerpen
0,00 01-04-1572
Stefan Peuskens
1 januari 2011
2435xh
Z. Hoven
Problemen van de tabel Fakturering gegevens
Er is géén relatie te leggen tussen facturering gegevens en abonnement. Het is onduidelijk
welke prijs voor welke krant geldt. Iemand kan een factuur krijgen, zonder abonnement, of
andersom. Er is geen goede verwijzing foreign key.
De postcode en plaatsnaam van Henk Jan Nootenboom zijn onzin. De factuur zal nooit
aankomen. Het is voor de computer onmogelijk om de adresgegevens uit een andere tabel te
halen, door de net weer andere schrijfwijze van de naam.
Stefan Peuskens krijgt wél een factuur van 0 gulden, maar zal geen krant ontvangen. Het
bezorgadres is immers niet bekend. Of heeft die € 0,- een speciale betekenis en wordt er
daarom géén factuur verstuurd en ook geen krant bezorgd?
De kolom geboortedatum is niet relevant, valt buiten de scope. De datum 01-04-1572 is niet
betrouwbaar, vast expres onjuist opgegeven.
Een slecht ontworpen database kent de volgende problemen:
Bij elkaar horende data staat verspreid over diverse tabellen. Een wijziging moet op vele
plaatsen doorgevoerd worden. Het is mogelijk dat informatie maar half aanwezig is, in de
ene tabel wel en in de andere tabel niet.
Data is inconsistent of ambigu (voor meerdere uitleg vatbaar).
De database is nodeloos ingewikkeld, met veel Kunst & Vliegwerk in elkaar geprutst. De
database-ontwerper heeft moeilijk gedaan, terwijl het makkelijk kan.
De database is traag, inflexibel, lastig uit te breiden en kan niet alle praktijksituaties aan.
Het ontwikkel proces voor een “goede” database bestaat uit een viertal stappen die doorlopen
moeten worden:




Scope
Logisch Ontwerp
Technische Optimalisatie
Implementatie
We zullen nu per onderdeel bespreken wat er bij komt kijken.
Hoofdstuk: Het ontwerp proces van een database.
De database heeft 'verborgen' informatie, bijvoorbeeld door de volgorde van rijen in een
tabel.
4
5
DATABASE ontwerpen
1 januari 2011
Scope
Eerst bepalen we de scope



Wat komt wel en wat komt niet in de database?
Alléén wat bekend en goed te beheren is. Vermijd foute en misschien verouderde info. Maak
bijvoorbeeld een interface met een ander systeem, waar die gegevens wel binnen de scope
vallen.
Hou scope zo klein mogelijk. Dat is lastig, want gebruikers nemen liever het zekere voor het
onzekere. Ze willen alles, om maar niks te missen. Scopeloze projecten hebben een grote
kans op mislukken, sterven in schoonheid.
Logisch Ontwerp
Het doel van een logisch database-ontwerp is een ontwerp waarbij voor elke tabel de wet van Codd
geldt:
De waardes in een row zijn afhankelijk van
de sleutel,
de hele sleutel
en niets dan de sleutel.
Zo waarlijk helpe mij Codd.
Door het toepassen van de normalisatie stappen: het Normaliseren komen we altijd tot een logisch
ontwerp.
De normalisatiestappen bestaan uit de volgende stappen:
o
een papieren administratie,
o
bestaande schermen,
o
of een gewenst schermontwerp.
2. Zet elk data-element op een geel plakbriefje. Plak ze allemaal naast elkaar.
3. Hou parameters (vluchtige informatie) en afgeleide informatie apart. Laat ze voorlopig
buiten beschouwing. Later, tijdens de technische optimalisatie, heeft u ze weer nodig.
Hoofdstuk: Het ontwerp proces van een database.
0-de normaal vorm : Onderken alle data-elementen (scope)
1. Inventariseer data-elementen, bijvoorbeeld door waardes te highlighten op bronnen zoals:
4
6
DATABASE ontwerpen
1 januari 2011
Pas op
Vermijd dubbele gegevens.
Hou de definitie van elk data-element éénduidig. Vermijd
ingewikkelde constructies zoals:
Indien in element abc de code 123 staat, dan heeft data-element def een
ghi en anders een jkl of is leeg, hetgeen betekent...
1-de normaal vorm: Zoek de sleutel waarmee alle data op te zoeken is
Zoek een overkoepelende sleutel (key).



Wat is die sleutel? Welke data-elementen maken elke rij (row) uniek? Welke waarden moet
je weten om voor alle andere data-elementen één en slechts één waarde te kunnen vinden?
Kies een key waarvan de waarde nooit verandert. (Of maak een key zelf)
Hou de key zo klein mogelijk. Maak de key niet groter dan nodig.
Hang de key data-elementen voorop. Zet een streep onder die plakbriefjes.
Wie het sofi# en de krantnaam weet kan de rest opzoeken.
Je hebt nu een heel pril database-ontwerp, met één tabel, waarbij elke waarde afhankelijk is van de
sleutel.
2-de normaal vorm: Maak alle data afhankelijk van de gehele sleutel.
Verwijder part key dependencies
Zijn er data-elementen die afhankelijk zijn van een deel van de eerste normaalvorm sleutel?
1. Maak hiervoor een nieuwe tabel, boven de oude. Teken een verbindingslijn tussen de oude
en nieuwe tabel, een many to one relatie.
2. Merk de relatie aan de many kant met een rode hoofdletter I van Identificerend.
3. De nieuwe tabel krijgt een kleinere sleutel. Maak nieuwe plakbriefjes voor de nieuwe key.
Laat de key in de oude tabel hangen.
4. Verhuis de afhankelijke data naar de nieuwe tabel.
5. Herhaal deze stappen voor overige part-key dependencies.
Hoofdstuk: Het ontwerp proces van een database.

4
7
DATABASE ontwerpen
1 januari 2011
Koppeltabel
Noot: In de oude tabel blijft géén data over. Toch heeft de combinatie van keys betekenis. Zo'n
koppeltabel maakt een many to many relatie mogelijk:
Één lezer kan meerdere abonnementen hebben op diverse kranten.
Op één krant zijn meerdere lezers geabonneerd.
Dit is nu al een redelijk database ontwerp, met drie tabellen en twee one-to-many
relaties. Met behulp van de Keys kun je gerelateerde informatie in andere tabellen
opzoeken.
1. In abonnement staat het sofi#.
2. Met het sofi# kun je in "Lezer" de juiste rij vinden.
3. In de rij van Lezer staat o.a. het huisadres en huisnummer.
3-de normaal vorm:
Maak alle data afhankelijk van niets dan de sleutel.
Verwijder non-key dependencies
In het voorbeeld zijn Straat en Plaats transitief afhankelijk van Postcode. Bij een gegeven postcode
hoort maar één straat en plaats.
Maak een nieuwe tabel voor deze afhankelijkheid.
1. Kopieer de nieuwe Key naar de nieuwe
tabel.
Hoofdstuk: Het ontwerp proces van een database.
Zijn er transitieve afhankelijkheden in de data te vinden, los van de key? Is het ene data-element op
te zoeken als je een ander weet? Dit is vaak de lastigste stap van normaliseren.
4
8
DATABASE ontwerpen
1 januari 2011
2. Markeer de key in de oude tabel met een *, als foreign key. (Dit is handig voor technische
optimalisatie, als u indexen gaat ontwerpen.)
3. Teken een one-to-many relatie tussen de nieuwe en oude tabel.
4. Verhuis de afhankelijke data-elementen naar de nieuwe tabel.
Maak een ERD
Hoe maak je het ERD.
1. Elke rij met plakbriefjes wordt een tabel.
2. Gebruik één vel papier per tabel.
3. Voeg de kleine plakbriefjes met data-elementen toe.
4. Teken one-to-many relaties altijd van boven naar beneden.
De tabellen onderin hebben meestal data over de core business, in dit geval abonnement. Dit zijn
meestal ook de grootste tabellen, met de meeste rijen.
Hoofdstuk: Het ontwerp proces van een database.
Na normaliseren tot de derde normaal vorm is het nu heel eenvoudig om een ERD te maken (Entity
Relationship Diagram, entiteiten model, een logisch database-ontwerp, gegevensmodel, UML
conceptueel model of een Bachman diagram) met 4 tabellen:
4
9
DATABASE ontwerpen
1 januari 2011
Test het logisch model
Zijn alle functies die het systeem nodig heeft mogelijk met dit logisch model?
Doorloop alle functies, aan de hand van de bronnen voor de nulde normaalvorm, die het systeem
aan moet kunnen.
Heeft de database alle benodigde data (nulde normaalvorm check)?
Is het mogelijk om alle vereiste waarden op te zoeken (eerste normaalvorm check)?
Zijn de functies compleet? Check dit met een CRUD matrix. Is er voor elke tabel ten minste één
functie die
o een row aanmaakt (Create),
o leest (Read)
o en verwijdert (Delete)?
Een CRUD matrix
Een CRUD matrix (Create, Read, Update, Delete) is een handig hulpmiddel voor de
compleetheidscontrole. Zet Tabellen op de ene as en functies op de andere.
Oprichting
C
Prijsverhoging
U
Opheffing
D
Gebied
Abonnement
D
Nieuwbouw
C
Straatnaam wijziging
U
Sloop
D
Aanmelden
Lezer
R
C
C
Verhuizing
U
Opzeggen
D
D
R
R
Print route voor bezorger
R
R
Tip: Begin de matrix in te vullen met de C's, van create. U heeft dan al snel een goede
compleetheidscontrole. De CRUD matrix dwingt u tot nadenken. Het is een goede voorbereiding voor
de volgende stap: De technische optimalisatie.
Hoofdstuk: Het ontwerp proces van een database.
Krant
5
0
DATABASE ontwerpen
1 januari 2011
De Technische Optimalisatie:
Het doel
Het logisch ontwerp is een werkend model. Je zou het ontwerp kunnen implementeren en het werkt,
zij het mogelijk wat traag.
Technische optimalisatie (physiek database design) concentreert zich op
Efficiency
Technische optimalisatie zorgt ervoor dat de belangrijkste functies een goede performance hebben.
Eenvoud
Een volledig logisch model kan lastig zijn om mee te werken. SQL queries kunnen bijvoorbeeld
ingewikkeld worden op een volledig logische database.
Het logisch ontwerp was vooral geleid door regels. Bij technische optimalisatie komt het meer aan op
creativiteit, inventiviteit en technisch vernuft
Optimalisatiestappen
De stappen:
i.
ii.
iii.
iv.
v.
vi.
Werk met ranges
Denormaliseer
Combineer tabellen
Sla afgeleide gegevens op
Voeg indexen toe
Sorteer (clustered index)
Bekijk één tabel tegelijk, voor alle functies. Ga pas naar een bovenliggende tabel als je alle
onderliggende gehad hebt.
Maak steeds een kosten-baten analyse. Elke optimalisatie heeft z'n prijs. Elke optimalisatie moet per
saldo voordeel opleveren.
Hoofdstuk: De Technische Optimalisatie:
Bij elk van deze acties geldt:
Werk bottom-up. Begin optimalisatie bij de corebusiness, de tabellen voor de high frequency
functies. Dit zijn de tabellen onderaan het model.
5
1
DATABASE ontwerpen
1 januari 2011
Ranges
Het kan soms handig zijn om met ranges te werken.
Postcode
Straat
Plaats
2803 DA
Groenhovenweg
Gouda
2803 DB
Groenhovenweg
Gouda
2803 DC
Groenhovenweg
Gouda
...
...
...
2803 DL
Groenhovenweg
Gouda
Dit zou met een range kunnen.
Begin Postcode
Eind Postcode
Straat
Plaats
2803 DA
2803 DL
Groenhovenweg
Gouda
Pas op: Ranges maken de programmatuur ingewikkelder. Toevoegen van een extra postcode kan
ingewikkeld worden:
Hoofdstuk: De Technische Optimalisatie:
Niets doen, de postcode valt al in een bestaande range?
Een nieuwe range maken?
De begin postcode van een bestaande range verlagen?
De eind postcode van een bestaande range verhogen?
Een bestaande range splitsen en een nieuwe range tussenvoegen?
5
2
DATABASE ontwerpen
1 januari 2011
Denormaliseer
Kijk of je een dure join in een high frequency functie kunt vermijden door
kolommen uit een bovenliggende tabel te de-normaliseren, kopiëren naar een
lagere tabel.
Bijvoorbeeld: Kopieer straatnaam & plaats naar lezer.
Nadeel van denormaliseren: Als de gegevens in de one tabel wijzigen moet alle
kopieën in de many ook bijgewerkt worden.
Voorbeeld: Als de straatnaam wijzigt moeten alle kopieën van de lezers in die straat ook bijgewerkt
worden.
Denormaliseer vooral data die nauwelijks wijzigt, zoals straatnaam. Een straat wijzigt zeer
zelden van naam.
Kijk vooral naar high frequency functies die veel gegevens lezen uit diverse tabellen. (Een lijst
van abonnementen, inclusief adres gegevens bijvoorbeeld).
Pas op voor schijnoptimalisatie. Als je 9 elementen denormaliseert maar één essentiële niet,
blijft de join nodig.
Denormaliseer niet als:
het per saldo een nadeel oplevert
de software onacceptabel complex zou worden.
Combineer tabellen
Het kan zijn dat na denormalisatie een tabel geen
bestaansrecht meer heeft.
Check of de tabel echt weg kan. Pas op: De bovenste tabel, 'Gebied' kan nog wel bestaansrecht
hebben, om een aantal redenen:
1. als je een gebied kunt hebben zonder lezers (een one zonder manies). Bijvoorbeeld als input
ondersteuning, een lijst met alle gebieden tonen bij invoeren van een nieuwe lezer.
2. als een gebied nodig is ter validatie of input ondersteuning,
bijvoorbeeld een lijst met geldige postcodes.
3. Als de tabel nog nodig is voor andere functionaliteit.
Hoofdstuk: De Technische Optimalisatie:
Een voorbeeld: Alle elementen uit de tabel Gebied zijn
gekopieerd naar lezer.
5
3
DATABASE ontwerpen
1 januari 2011
Sla afgeleide gegevens op
Een mooi voorbeeld van een nuttig afgeleid gegeven is een banksaldo. Dat zou je kunnen afleiden
aan de hand van alle bij- en afschrijvingen, sinds het beginsaldo 0. Dit is echter niet praktisch.
In het logisch ontwerp, bij de UNF, Unnormalised Form heeft u de afgeleide gegevens apart
gehouden. Deze kunt u nu nalopen.
Een voorbeeld van afgeleide gegevens zijn totalen en statistieken, bijvoorbeeld het aantal lezers in
een gebied.
Pas op met opslaan van afgeleide gegevens. Als er iets aan de brongegevens
verandert, moet het afgeleide gegeven mee veranderen.
Bij dynamische brongegevens is het beter om elke keer af te leiden.
Voeg indexen toe
Nut van een index
Bij grote tabellen kan een index de performance verbeteren. Een index kan
1. rows uniek maken met enkelvoudige of compound keys
2. Zoekacties versnellen op
o data waarden of Keys
o foreign keys, die u in TNF met een sterretje gemerkt hebt. Dit soort indexen kan
vooral joins erg versnellen.
o een combinatie van data waarden, keys en foreignkeys.
3. een tabel sorteren




is gesorteerd op key waarden, (die niet hetzelfde hoeven te zijn als
die van de tabel)
is klein, heeft slechts enkele kolommen van de tabel.
verwijst voor een keywaarde naar het juiste blok binnen de tabel.
maakt het lezen van een row sneller, als je de juiste zoekargumenten weet.
Tips



Zet het meest unieke datelement voorop in de index, het element dat de meest verschillende
waardes heeft. De index kan dan sneller de juiste bladzijde vinden. Liever postcode-land dan
land-postcode.
Hou indexen klein. Liever een index op alleen postcode, dan op postcode-land. Hoe kleiner
de index des te beter de response tijd.
Voor hoogfrequente leesfuncties (duizenden keren per dag) kan het verstandig zijn om juist
een erg uitgebreide index te maken zodat het systeem voor de leesfunctie de tabel niet eens
nodig heeft.
Hoofdstuk: De Technische Optimalisatie:
Hoe werkt een index?
Een index
5
4
DATABASE ontwerpen



1 januari 2011
Voor kleine tabellen is een index nadelig. Het systeem kan dan voor iedere functie beter de
hele tabel doorlopen. Een index zou alleen maar ophouden.
Het heeft geen zin om een index te maken voor een functie die toch de hele tabel doorgaat.
Het is dan efficiënter om zonder index heel de tabel door te lopen. U spaart dan bovendien
de extra index processing uit bij toevoegen, wijzigen en verwijderen.
Maak voor elke index een kosten-baten analyse. Weegt de snellere leesfunctie op tegen de
tragere toevoegen/wijzigen/verwijderen?
Hou rekening met de frequentie en zwaarte van de functies. Een lichte leesfunctie met een
frequentie van 10.000x per dag heeft meer gewicht dan een zware verwijder functie van 1x
per maand.
Een index vertraagt toevoegen, wijzigen en verwijderen. Niet alleen de tabel,
maar ook de index moet bijgewerkt worden.
Leg dus bij voorkeur een index op waarden waarmee wel veel gezocht wordt,
maar die niet veel veranderen. Liever een index op bankrekeningnummer dan
op saldo.

Ongesorteerd, het systeem moet kris-kras de hele tabel door om de rows
te vinden die bij elkaar horen.

Gesorteerd. Het systeem hoeft maar één blok op te halen. De rows staan bij
elkaar.
Zoek in de documentatie van uw RDBMS op clustered index.
Hoofdstuk: De Technische Optimalisatie:
Sorteer
Sommige RDBMS-sen hebben de mogelijkheid om tabellen te sorteren (naast natuurlijk indexen).
5
5
DATABASE ontwerpen
1 januari 2011
Implementatie
Elk RDBMS heeft zo z'n eigen manier om een database in te richten. Op Internet staat een overvloed
aan documentatie. Zoek bijvoorbeeld met Google (www.google.com) op "Oracle create database
documentation".
In het volgende deel gaat u databases en tabellen maken in een MySQL database. Tevens leert u de
onderliggende SQL syntax, die voor bijna alle RDBMSsen hetzelfde is.
Maak tabel
SQL syntax
Met één SQL statement maakt u de tabel en alle kolommen aan:
(
)
Voorbeeld
CREATE TABLE abonnement
( krantNaam VARCHAR (35) not null, sofiNummer INT not null )
Tips
Zet velden met een vaste lengte vooraan.
Zet het grootste varchar veld achteraan.
Hou de kolommen een beetje in een logische volgorde.
Extra kolom
Voorbeeld
ALTER TABLE abonnement ADD
proefAbonnement CHAR (1) not null
Maak Index
Bij technische optimalisatie heeft u indexen ontworpen. Hier ziet u hoe u zo'n
index kunt maken, eventueel met de optie cluster om de tabel te sorteren.
Hoofdstuk: Implementatie
Een bestaande tabel kunt u makkelijk uitbreiden met een extra kolom:
5
6
DATABASE ontwerpen
1 januari 2011
SQL syntax
De opties ASC (ascending, van laag naar hoog) en DESC (descending, van hoog naar laag) geven de
sortering van de index aan. Deze optie kunt u meestal weglaten.
Hoofdstuk:
Voorbeeld
CREATE UNIQUE INDEX abonnement_ID ON abonnement ( sofiNummer, krantNaam )
Dit maakt een index met de naam "abonnement_ID" voor de tabel abonnement. De combinatie van
sofiNummer en krantNaam wordt uniek, mag niet dubbel voorkomen.
5
7
DATABASE ontwerpen
1 januari 2011
Verklarende woordenlijst
Column
In één kolom (data-element) staan gegevens van dezelfde soort, bijvoorbeeld de kolom
postcode.
Compound Key
Een compound key (samengestelde sleutel) is een key die uit meerdere kolommen bestaat, omdat
één kolom niet uniek genoeg is.
Voorbeeld van een compound key: postcode & huisnummer samen identificeren een adres.
Database
Een database is een verzameling tabellen, met onderling gerelateerde gegevens.
Foreign Key
Een foreign key (vreemde sleutel) is de verbindende schakel tussen twee tabellen.
Met een waarde uit een rij van de ene tabel kun je in een andere tabel de juiste rij met
gerelateerde gegevens opzoeken.
De ene tabel geeft als het ware de sleutel voor de andere, 'vreemde' tabel
High Frequency Functie
Index
Een index in een database lijkt op een index achter in een boek.
Met een zoekwoord kun je de juiste bladzijde nummers vinden van rijen, binnen
een tabel.
Join
Bij een join combineert u kolommen uit verschillende tabellen tot één geheel.
U maakt bijvoorbeeld een overzicht van lezers, met de naam van de kranten waar ze op
geabbonneerd zijn.
Hoofdstuk: Verklarende woordenlijst
Een high frequency functie is een functie die zeer vaak gebruikt wordt, honderden of zelfs duizenden
keren per dag.
5
8
DATABASE ontwerpen
1 januari 2011
Key
Een key (sleutel) bestaat uit één of meerdere kolommen.
Wanneer je de juiste key waarde weet kun je de juiste rij vinden met de gewenste informatie. De key
is als een sleutel waarmee je toegang krijgt tot de juiste rij.
Een key is uniek. Een key waarde mag niet dubbel voorkomen in een tabel. Met een key vind je dus
hooguit één rij.
Many to Many relatie
Een many to many relatie komt veel voor. Een krant heeft bijvoorbeeld vele lezers
en een lezer leest vele kranten.
Een many-to-many relatie is onduidelijk. Many-to-many relaties zijn vaak een teken dat
nog nadere analyse vereist is.
Meestal kan de relatie een stuk duidelijker, door er een koppel tabel tussen te zetten,
aan de 'boven' of aan de 'onder' kant.
Many to One relatie
Een Many to One relatie is hetzelfde als one-to-many, maar dan van een ander
gezichtspunt.
Vele lezers wonen in één gebied.
Vele abonnementen kunnen van één en dezelfde lezer zijn.
Vele abonnementen zijn op één en dezelfde krant.
One to Many relatie
De meeste relaties tussen tabellen zijn one-to-many.
In één gebied kunnen vele lezers wonen.
Één lezer kan vele abonnementen hebben.
Één krant kan vele abonnementen hebben.
One to One relatie
Een één op één relatie is uitzonderlijk in databases.
Het kàn voorkomen, maar vaak is het een teken dat het database-ontwerp nog voor verbetering
vatbaar is.
Hoofdstuk: Verklarende woordenlijst
Voorbeeld:
5
9
DATABASE ontwerpen
1 januari 2011
RDBMS
Een Relational DataBase Management Systeem is software die
U in staat stelt om een database te implementeren met tabellen, kolommen, en indexen.
De Referentiële Integriteit tussen rows van diverse tabellen garandeert.
Automatisch indexen bijwerkt.
Een SQL zoekopdracht interpreteert en informatie uit diverse tabellen kan combineren.
Redundantie
Dubbel opslaan van gegevens, 'overbodige' copieën om het systeem sneller te maken.
Welke gegevens u dubbel op kunt slaan komt aan bod in het hoofdstuk Denormaliseren.
Referential Integrity
Referentiële Integriteit zorgt ervoor dat een foreign key waarde altijd naar een
bestaande row verwijst.
Een "dode" verwijzing zoals in het plaatje kan dan niet meer voorkomen.
Er zijn een paar mogelijke maatregelen die referentiële integriteit afdwingen.
Bij het maken of wijzigen van een rij controleert het systeem of de foreign keys wel geldige
waarden hebben.
Daarnaast moet de database-ontwerper een keuze maken voor een delete:
Je mag een rij in de one tabel pas weggooien als er geen gerelateerde many rows meer zijn.
Bij het verwijderen van een row in de one tabel gooit het RDBMS automatisch alle
gerelateerde gegevens in de many tabel weg. Dit heet een cascaded delete.
Row
Een rij (= tuple, entry) zijn gegevens die bij elkaar horen, bijvoorbeeld de gegevens van één
abonnement.
In één rij kunnen géén lijstjes staan.
Hoofdstuk: Verklarende woordenlijst
Bij het verwijderen van de laatste 'many' gooit het RDBMS automatisch de gerelateerde 'one' row
weg.
6
0
DATABASE ontwerpen
1 januari 2011
Tabel
Website
Bedrijf
www.roc-teraa.nl
ROC ter AA Helmond
www.willemwever.com Willem Wever
www.bol.com
Bol.com
Een tabel is een matrix met gegevens. Een tabel in een database lijkt op een eenvoudige
spreadsheet.
Hoofdstuk: Verklarende woordenlijst
Bovenstaand voorbeeldje heeft 3 rijen (rows) en 2 kolommen (columns).
6
1
DATABASE ontwerpen
1 januari 2011
Vragen deel 1b
Op de volgende bladzijden vindt U een aantal orderformulieren, inschrijfformulieren.
De opgave is om deze formulieren om te zetten in een database in de derde normaalvorm.
1.
2.
3.
4.
5.
6.
Bepaal eerst de scope (Het bereik) van te maken database
Maak de “nulde” normaal vorm
Zet dan het geheel in de eerste normaal vorm
Daarna in de tweede normaal vorm
En als laatste in de derde normaal vorm.
Maak het ERD diagram voor de database
Zorg voor een duidelijke uitwerking. Geef aan welke stappen je hebt gebruikt om van de ene in
de andere normaal vorm te komen. Doe het ook als het veel werk is.
Vaak werkt het op papier of met papierstickers makkelijker als op een computer.
Hoofdstuk: Vragen deel 1b
Lever de opdrachten in zoals de docent het heeft aangegeven.
62
DATABASE ontwerpen
1 januari 2011
Hoofdstuk: Vragen deel 1b
Opgave 1-1.
63
DATABASE ontwerpen
1 januari 2011
Hoofdstuk: Vragen deel 1b
Opgave 1-2.
64
DATABASE ontwerpen
1 januari 2011
Hoofdstuk: Vragen deel 1b
Opgave 1-3.
65
DATABASE ontwerpen
1 januari 2011
Opgave 2-1
Hoofdstuk: Vragen deel 1b
Let op! Twee pagina’s
66
DATABASE ontwerpen
1 januari 2011
Vervolg opgave 2-1
Opgave 2-2
Op het volgende webadres vind je een inschrijf formulier gebruik dat voor je opgave moet
gebruiken.
Hoofdstuk:
http://www.skon.nl/inschrijven/inschrijfformulier
67
Download