Hoofdstuk 10. Relationele databases; gegevens invoeren
10.1 Sleutels en verwijzingen
Elke tabel in een database heeft een kolom, of een combinatie van kolommen, die uniek is.
Daarmee wordt bedoeld dat elk woord of getal
in die kolom (of de combinatie van de woorden en/of getallen in die kolommen) maar één keer
voorkomt.
Die kolom, of combinatie van kolommen, noemen we de (primaire) sleutel van de tabel (in het engels primary key).
Voor een primaire steutel geldt:
-
In elke rij moet in de sleutelkolom(men) iets zijn ingevuld.
-
Deze waarden (of combinaties van waarden) zijn verschillend voor alle rijen.
Bij de tabellen van de database tennisvereniging, die in het vorige hoofdstuk beschreven is, heb je ook primaire sleutels.
Bij de tabel leden is het sleutelveld de kolom lidnr.
Als je het lidnr weet dan weet je precies welk lid er bedoeld wordt.
Als je de naam als sleutelveld kiest dan heb je een probleem als er twee tennisleden met dezelfde naam zijn.
Wel zou je de naam + de geboortedatum als sleutel kunnen kiezen, want twee leden met dezelfde naam en ook nog dezelfde
geboortedatum zullen niet voorkomen. Als er verschillende mogelijkheden zijn om een sleutel te kiezen dan noem je dat
kandidaat-sleutels.
Meestal kies je als primaire sleutel de eenvoudigste kandidaat-sleutel; het liefst één kolom, en
vaak wordt er daarom een extra kolom toegevoegd met een nummer, die dan als sleutelveld dienstdoet.
De tabellen van de database tennisvereniging staan niet los van elkaar, er bestaat een bepaald verband tussen, ze hebben een relatie.
In de tabel competitiesoort staat in de eerste rij in de kolom soort HD, dat staat voor "heren dubbel".
Verder zie je in de laatste kolom dat de aanvoerder nummer 11 is.
Als je wilt weten wie daarmee bedoeld wordt moet je naar de leden-tabel kijken; daar zie je dat lidnummer 11 Kees uit
Veenklooster is.
Zo'verband tussen de gegevens in de ene tabel en die in een andere tabel noem je een verwijzing of referentie-sleutel, in het
engels foreign key.
Verwijzingen kunnen door een RDBMS worden gecontroleerd. Als je bij een competitiesoort als nummer van de aanvoerder een nummer
invult, dat niet voorkomt bij de leden, dan kan het programma een foutmelding geven. Tenminste als in het programma
is aangegeven dat die relatie er is.
Het controleren van de verwijzingen noemen we het bewaken van de referentiële integriteit.
Het strokendiagram.
Een overzicht van de tabellen, met de kolommen, sleutels en verwijzingen, wordt vaak weergegeven in een strokendiagram.
Dat is een schema waarin de tabellen als stroken verschijnen, met daarin de namen van de kolommen.
- Het sleutelveld wordt aangegeven met een dubbele pijl, die onder de betreffende kolom(men) staat.
- En de verwijzingen worden ook met pijlen aangegeven.
- Verder zie je onder sommige veldnamen NL staan. Dat is de afkorting van
Niet Leeg.
Dat betekent dat die kolom beslist moet worden ingevuld. Als je een nieuwe rij invoert en je vult in die kolom niets in, dan zal
het programma een foutmelding geven Tenminste als in het programma
is aangegeven dat het een niet-leeg-kolom is.
In Access kun je ook een overzicht van de tabellen, met de kolommen, sleutels en verwijzingen, te zien krijgen.
Klik in de menubalk op Extra → Relaties, dan verschijnt het volgende venster (als je de database tennisvereniging
hebt geopend.
(In Access 2007 klik je in het menu op het tabblad "Hulpmiddelen voor databases", en dan op "Relaties")
- De sleutelvelden worden hier vet afgedrukt.
- De verwijzingen worden aangegeven m.b.v. lijnen.
En er staat een 1 bij het sleutelveld waarnaar verwezen wordt, want van elk
exemplaar uit die kolom is er maar één. Bij het andere uiteinde van de lijn staat het
teken voor oneindig,
want van elk exemplaar uit de kolom, die daarbij hoort, kunnen er meer zijn.
- De niet-leeg velden worden niet op een speciale manier weergegeven.
10.2 Nieuwe tabellen invoeren in Access
Als je access een nieuwe tabel wilt invoeren, dan klik je op Tabellen
(in het linker venster), dan op
Nieuw en dan op Ontwerpweergave.
(In Access 2007 klik je in het menu op het tabblad "Maken", en dan op "Tabelontwerp")
Dan verschijnt er een nieuw venster, en dan kun je de veldnamen enz. invoeren.
Als je dit venster wilt zien van een al ingevoerde tabel, dan moet je op de naam van de tabel klikken, en dan
op Ontwerpen.
Het gegevenstype
Als je de veldnaam hebt ingevuld, dan moet je het gegevenstype invoeren.
(In Access 2007 moet je dat later doen, rechts-klik dan op de tabel en kies voor "Ontwerpweergave")
Als je klikt op het pijltje in die kolom verschijnt er een pull-down-menu. En dan kun je o.a. kiezen uit
Tekst, numeriek, datum/tijd
Als je numeriek hebt uitgekozen (dat betekent dat er een getal in de kolom moet worden ingevuld), dan kun je nog preciezer aangeven
wat voor soort getal het moet zijn.
In het onderste deel van het venster staan de eigenschappen van het veld, waarmee je bezig bent.
En als je daar klikt op het pijltje in het invulvenstertje achter Veldlengte, dan blijkt dat
je kunt kiezen uit zeven soorten getallen.
Als je zelf geen keuze maakt dan kiest het programma voor jou, en dan wordt het: lange integer. Dan kun je hele grote getallen
invoeren. Als je integer kiest kunnen die getallen niet heel groot zijn (tot ongeveer 32000), maar meestal voldoet dat ook wel.
Als je komma-getallen wilt gebruiken dan moet je
Enkele precisie of Dubbele precisie uitkiezen.
Als je als gegevenstype Tekst hebt uitgekozen, dan kun je ook nog aangeven uit hoeveel tekens die tekst maximaal mag bestaan.
Hieronder zie je dat de veldlengte 20 is en dat betekent dat het niet lukt een naam in te typen
die bestaat uit meer dan 20 tekens.
Verder zie je achter Vereist: Ja. Dat betekent dat de naam beslist moet worden ingevuld, anders volgt er een foutmelding.
Dit is een zogenaamde niet-leeg-kolom, in het strokendiagram staat bij die kolom NL
Validatieregel
Het veld geslacht is toegevoegd. Het is van het type Tekst. Onderaan zie je de veldeigenschappen van Geslacht.
Je ziet dat er achter Validatieregel
="m" or ="v" staat.
Dat heeft tot gevolg dat het programma controleert of daar wel een m of een v wordt ingevoerd.
En als dat niet het geval is dan verschijnt er een foutmelding met de tekst:
Vul een m of v in!!
De tekst van die foutmelding kun je ook zelf regelen want die staat achter Validatietekst.
We hebben nu drie typen gehad: numeriek, tekst, datum/tijd.
Er zijn nog meer typen. Je kunt als gegevenstype ook nog kunt kiezen uit:
- Memo
Dat is bedoeld voor opmerkingen, maximaal 64000 tekens. Een gewoon tekstveld kan uit maximaal 255 tekens bestaan
- Valuta
Je kunt er bijv. voor zorgen dat het euroteken er automatisch voor komt
- Autonummering
Elk record krijgt dan automatisch een ID-getal om het te kunnen identificeren. Dit getal kan niet veranderd worden.
- Ja/Nee
Een veld waarin alleen Ja of Nee ingevuld kan worden
- OLE-Object
Aan zo'n veld kan een object gekoppeld worden, bijv. een foto
- Hyperlink
- Wizard opzoeken
Je kunt er dan voor zorgen dat er gekozen kan worden uit een andere tabel of een lijst met waarden
Het sleutelveld
Je kunt in het ontwerpvenster ook aangeven wat het sleutelveld moet zijn.
Je ziet een sleuteltje voor het lidnummer.
Als er nog geen sleutelveld is aangegeven, of je wilt een ander sleutelveld uitkiezen, dan klik je op het
betreffende veld en dan op het
sleuteltje in de werkbalk, en klaar is kees!
Maar als je al gegevens hebt ingevoerd, of als er verwijzingen naar het veld zijn, dan lukt het niet zonder meer om achteraf de sleutel
te wijzigen.
De verwijzingen
De verwijzingen kun je aangeven in het relatievenster.
Als je een relatie wilt verwijderen, dan klik je met de rechter muisknop op de lijn van die relatie, en dan klik je op Verwijderen.
Als je een relatie wilt aanbrengen, bijvoorbeeld de verwijzing van aanvoerder naar lidnr, dan sleep je met de muis van aanvoerder
naar lidnr (altijd slepen naar het sleutelveld!). Dan verschijnt onderstaand venster.
Zet een vinkje voor Referentiële integriteit afdwingen, en klik op OK.
10.3. Een tabel toevoegen of verwijderen m.b.v. SQL
In de vorige paragraaf heb je gezien hoe je in Access via het menu een tabel kunt toevoegen.
Je kunt dat ook op een heel andere manier doen, namelijk met behulp van SQL.
CREATE
Met het commando CREATE kun je een tabel aanmaken. De basis syntax is:
CREATE TABLE tabelnaam
(
naam_kolom1 type van kolom1 ,
naam_kolom2 type van kolom2 ,
naam_kolom3 type van kolom3 ,
enz.
PRIMARY KEY (kolomnaam)
);
De query om de leden-tabel in de database Tennisvereniging te maken is als volgt:
CREATE TABLE leden
(
lidnr INT
NOT NULL AUTO_INCREMENT ,
naam VARCHAR(30) NOT NULL ,
woonplaats VARCHAR(20) NOT NULL ,
geboren DATE NOT NULL ,
leeftijd INT NOT NULL ,
lidsoort VARCHAR(20) ,
score INT ,
PRIMARY KEY ( lidnr )
);
Je kunt o.a. kiezen uit de volgende gegevenstypen:-
VARCHAR: Tekst met een bepaalde maximale lengte. Bijv. VARCHAR(15)
- SMALLINT: kleine getallen.
- INT: grote getallen.
- DECIMAL: kommagetallen; je moet het maximale aantal cijfers voor en achter de komma aangeven, bijv. DECIMAL (8,2)
- FLOAT & REAL: dit zijn ook kommagetallen.
- DATE: datum
Verder kun je nog aangeven dat een kolom niet-leeg mag zijn: NOT NULL,
wat de primaire sleutel is: PRIMARY KEY.
En als de kolom numeriek is kun je aangeven dat het AUTO_INCREMENT is, dan wordt er bij elke nieuwe rij automatisch het eerstvolgende
getal genomen.
DROP
Met het commando DROP kun je een tabel verwijderen. De basis syntax is:
DROP TABLE tabelnaam ;
De query om de leden-tabel te verwijderen is als volgt:
DROP TABLE leden;
10.4. Toevoegen en bewerken met INSERT, UPDATE, DELETE
In Access kun je gemakkelijk gegevens veranderen.-
Je opent de tabel, en als je iets wilt wijzigen ga je naar het te wijzigen woord,
en dan wijzig je dat.
- Als je een rij wilt verwijderen dan selecteer je die rij,
en dan druk je op Delete.
- En als je een nieuwe rij wilt toevoegen, dan ga je helemaal naar beneden in de tabel.
Op de onderste rij staat altijd een lege
regel, en daar kun je nieuwe gegevens invoeren.
Maar als je dat m.b.v. SQL wilt doen dan gaat het heel anders. Je hebt daarvoor de commando's Insert, Update en Delete.
In Access 2007 verschijnt er bij een query met insert, update of delete
(dat wordt wel een actie-query genoemd) soms op de statusbalk:
De actie of gebeurtenis is geblokkeerd door de modus Uitgeschakeld.
Dan moet je het volgende doen:
- Klik in de berichtenbalk achter Beveiligingswaarschuwing op Opties.
Dan verschijnt er een venster met Microsoft Office-beveiligingsopties
- Klik op Deze inhoud inschakelen en klik vervolgens op OK. Dan moet het daarna goed gaan.
Als je geen beveiligingswaarschuwing op de berichtenbalk ziet met een knop Opties, dan doe je het volgende:
- Klik op de Office-knop linksboven.
- In het venster dat verschijnt klik je (onderaan) op Opties voor Access
- In het volgende venster kies je in het linkermenu Vertrouwenscentrum uit.
- Daarna klik je (rechts) op Instellingen voor het Vertrouwenscentrum ...
- In het volgende venster kies je in het linkermenu Instellingen voor macro's uit.
- Vervolgens klik je op het rondje voor Alle macro's inschakelen
- Na (twee keer) een klik op OK sluit je Access af, en daarna start je het opnieuw op, en dan is het klaar.
INSERT
Met INSERT voegen we gegevens toe aan een tabel. De basis syntax is:
INSERT INTO tabel
(kolommen )
VALUES ('waarden') ;
Als je een nieuw lid wilt toevoegen aan de tabel leden, dan kan dat met de volgende query:
INSERT INTO leden (
lidnr, naam, woonplaats, geboren, leeftijd, lidsoort, score)
VALUES (15,'Rienk',
'Buitenpost','1961-09-12',
'45','senior',
0) ;
Als je deze uit laat voeren wordt er een rij aan de tabel leden toegevoegd.
Een andere manier is dit:
INSERT INTO leden
VALUES (15,'Rienk',
'Buitenpost','1961-09-12',
'45','senior',
0) ;
Je ziet dat nu de kolomnamen zijn weggelaten en alleen de waarden worden beschreven. Dan moet wel aan elke kolom een waarde worden
gegeven, en in de goede volgorde!
Bij de eerste manier hoef je niet elke kolom een waarde te geven.
Bij MySQL bestaat het commando auto_increment, dat betekent dat die kolom automatisch met één wordt opgehoogd.
Als de kolom lidnr van de tabel leden in MySQL auto_increment is, dan heeft het geen zin die kolom zelf een waarde te geven.
Verder zal er bij een nieuw lid nog geen score zijn, en heeft het geen zin die score in te voeren.
De query kan in dat geval ook als volgt:
INSERT INTO leden (
naam, woonplaats, geboren, leeftijd, lidsoort)
VALUES ('Rienk',
'Buitenpost','1961-09-12',
'45','senior') ;
UPDATE
Het wijzigen van gegevens gebeurt met het commando UPDATE. De basis syntax is:
UPDATE tabel
SET kolom1 =
'waarde1', kolom2 =
'waarde2', kolom3 =
'waarde3', enz
WHERE voorwaarden ;
Stel dat je de tabel leden wilt aanpassen omdat Annie verhuisd is van Buitenpost naar Kollum, en haar score is gestegen van 2075
naar 3000. Haar lidnr is 1
Deze wijziging wordt ingevoerd m.b.v. de query:
UPDATE leden
SET woonplaats =
'Kollum', score =
3000
WHERE lidnr =
1 ;
Als je de laatste regel weglaat (dus WHERE
lidnr = 1 )
dan worden de woonplaatsen van alle leden gewijzigd in Kollum, en alle scores in 3000. En dat is natuurlijk niet de bedoeling.
Let er daarom op dat je zoveel mogelijk de unieke waarde (of primairy key), in dit geval dus het lidnr, neemt als voorwaarde
voor een enkele rij met UPDATE.
Stel je voor dat bij alle senior-leden de score met 100 verhoogd moet worden, dan kan dat met de volgende query:
UPDATE leden
SET score = score
+ 100
WHERE lidsoort =
'senior' ;
DELETE
Het verwijderen van rijen uit een tabel gebeurt met het commando DELETE. De basis syntax is:
DELETE FROM tabel
WHERE voorwaarden ;
Dit commando verwijdert hele rijen tegelijk, het is dus heel belangrijk om duidelijk aan te geven aan welke voorwaarden de
te verwijderen rijen moeten voldoen om niet de verkeerde gegevens te verwijderen. Als je de voorwaarden weg laat dan worden alle
rijen uit de tabel verwijderd!
Stel dat Femke uit Drogeham (lidnr 14) haar lidmaatschap van de tennisvereniging heeft opgezegd, dan kan ze uit de tabel worden
verwijderd.
De query wordt dan:
DELETE FROM leden
WHERE lidnr =
14 ;
Net zoals bij UPDATE maken we bij de voorwaarden bij DELETE
zoveel mogelijk gebruik van de unieke waarde (of primairy key), hier dus het lidnr.
Zouden we de volgende query gebruiken:
DELETE FROM leden
WHERE naam =
'Femke' ;
dan zouden alle rijen met de naam 'Femke' worden verwijderd. In ons voorbeeld zijn dat twee rijen!
10.5. Beveiliging van databases; privacy
Databases bevatten vaak gegevens waarvan de eigenaar niet wil dat iedereen dat zomaar kan bekijken.
Daarom worden databases vaak beveiligd m.b.v. gebruikersnamen en wachtwoorden.
Er is altijd iemand die de eindverantwoordelijkheid heeft, die het systeem beheert, die wordt in databasetermen
database administrator
(DBA) genoemd (in Access: Admin).
De DBA kan gebruikers toegang geven tot bepaalde tabellen, en daarbij kan hij of zij ook nog aangeven of hij die tabellen
alleen mag bekijken of ook mag wijzigen of eventueel iets verwijderen.
In SQL kun je een tabel met gebruikers aanmaken. En die gebruikers geef je bevoegdheden met behulp van de GRANT-instructie.
Als je SQL-opdrachten wilt uitvoeren op zo'n systeem dan zul je eerst moeten inloggen met je gebruikersnaam en wachtwoord.
En aan die gebruikersnaam en dat wachtwoord zijn dan bepaalde rechten gekoppeld.
GRANT
Met het commando GRANT kun je een gebruiker de bevoegdheid geven om gegevens van een tabel
te raadplegen, te wijzigen, toe te voegen, en of te verwijderen. De basis syntax is:
GRANT SELECT, UPDATE, INSERT, DELETE
ON 'tabelnaam '
TO 'gebruikersnaam';
De query om de gebruiker lcleerling de bevoegdheid te geven om gegevens van de tabel leden
te raadplegen en te wijzigen is als volgt:
GRANT SELECT, UPDATE
ON 'leden '
TO 'lcleerling';
Deze gebruiker mag dan geen rijen toevoegen aan de tabel leden(INSERT) en hij of zij mag ook geen rijen verwijderen (DELETE).
Je kunt bevoegdheden intrekken met de REVOKE-instructie, die er verder net zo uitziet als de GRANT-instructie.
In Access
In Access ken je bevoegdheden toe via Extra → Beveiliging
→ Machtiging van gebruikers en groepen.
Je kunt ook de complete database beschermen met een wachtwoord via Extra
→ Beveiliging → Databasewachtwoord instellen
(In Access 2007 klik je in het menu op het tabblad "Hulpmiddelen voor databases", en dan
op "Databasewachtwoord instellen")
Bescherming van de privacy
Op steeds meer plaatsen worden gegevens over personen bijgehouden, zoals gegevens over opleiding,
verzekeringen, financiën, medisch dossier, enz.
De instanties, die die gegevens beheren, mogen niet zomaar alles wat ze willen met die gegevens doen. Ze moeten zich aan
bepaalde regels houden.
In Nederland regelt de Wet Bescherming Persoonsgegevens (WBP) wat wel en niet mag bij het beheer van gegevens.
Het College Bescherming Persoonsgegevens (CBP) is de instantie die over de uitvoering van de wet waakt.
Informatie over het CBP vind je op hun website (www.cbpweb.nl).
De Wet Bescherming Persoonsgegevens (WBP) is op 1 september 2001 in werking getreden.
Een paar belangrijke punten uit die wet:
-
Over het recht op inzage in de gegevens.
In de wet staat m.b.t. degene die de gegevens beheert:
Een persoon van wie u de persoonsgegevens gebruikt (de betrokkene), heeft recht op inzage in zijn persoonsgegevens.
De betrokkene hoeft niet aan te geven waarom hij inzage wil.
U bent verplicht hierop binnen vier weken schriftelijk of per e-mail te reageren.
Als de betrokkene om inzage verzoekt, moet u hem op een duidelijke en begrijpelijke manier informeren of en zo ja,
welke gegevens gebruikt worden, wat het doel is van het gebruik van deze gegevens en aan wie de gegevens eventueel zijn verstrekt.
Ook moet u de betrokkene informeren over de herkomst van zijn gegevens, als deze bekend is.
- Over het recht om correctie te vragen, dat omvat verbetering, aanvulling, verwijdering of afscherming van persoonsgegevens.
Een betrokkene kan correctie verzoeken in drie gevallen:
- zijn persoonsgegevens zijn feitelijk onjuist;
- zijn persoonsgegevens zijn voor het doel waarvoor u ze hebt verzameld, onvolledig of niet ter zake dienend;
- u gebruikt de persoonsgegevens op een andere manier in strijd met een wet.
De betrokkene moet bij het indienen van een correctieverzoek aangeven welke wijzigingen hij wenst.
Er moet binnen vier weken worden gereageerd op het verzoek van de betrokkene.
- Over het recht persoonsgegevens aan anderen te verstrekken.
In het algemeen geldt dat het verstrekken van persoonsgegevens verenigbaar moet zijn met het doel van het verzamelen daarvan.
Als de betrokkene zelf toestemming geeft kunnen persoonsgegevens verstrekt worden aan een bedrijf of instelling.
U mag personeelsgegevens verstrekken aan derden met name als het noodzakelijk is voor de uitvoering van een overeenkomst die u met
de werknemer hebt of gaat afsluiten, bijvoorbeeld indien de werknemer een
lease-auto krijgt, dan worden zijn gegevens verstrekt aan de leasemaatschappij.
U mag personeelsgegevens ook verstrekken als u gegevens moet verstrekken op grond van een wettelijk voorschrift verplicht,
u bent bijvoorbeeld verplicht om de fiscus te voorzien van alle gegevens die van belang kunnen zijn voor de belastingheffing.
10.6. Een index op een kolom; performance
Er zijn veel instellingen en bedrijven die met werken met databases die bestaan uit miljoenen records.
En er zijn meestal heel veel mensen, die die database tegelijk raadplegen.
Dan is het wel belangrijk dat het niet te lang duurt voordat je iets gevonden hebt in die database.
De snelheid van verwerken noem je de performance.
Bij het opzetten van een database kun je maatregelen nemen om ervoor te zorgen dat de performance zo hoog mogelijk is.
Er zijn verschillende manieren om iets op te zoeken in een database.
Sequentieel zoeken.
Sequentieel zoeken betekent: op de rij af zoeken.
We leggen het uit aan de hand van een eenvoudig voorbeeldje.
- Stel je hebt 15 getallen in een rij: 5 12 9 15 2 7 12 5 6 14 4 23 10 8 37.
- En stel dat je in deze rij op zoek moet naar het getal 4.
- Als je gewoon op de rij afgaat dan is het de 11-de keer raak, want het 11-de getal is 4.
- Maar als je in deze rij op zoek gaat naar het getal 3, en je gaat gewoon de rij af, dan moeten er 15 getallen vergeleken worden.
- En dan kom je na de 15-de keer tot de ontdekking dat het getal 3 helemaal niet voorkomt in de rij.
Nu is dat bij een aantal van 15 niet zo erg, maar als een computer in 10 miljoen records bijvoorbeeld naar een bepaald telefoonnummer
moet zoeken dan kan dat wel even duren als het gewoon op de rij af gaat.
Er zijn veel handiger manieren van zoeken.
Maar dan moeten de gegevens wel gesorteerd zijn.
Bij zoeken in gesorteerde rijen moet je een zogenaamde
halveringsalgoritme gebruiken.
Dat wordt dan binair zoeken genoemd.
Binair zoeken
We nemen dezelfde getallen als zonet, maar nu zijn ze gesorteerd, ze staan van klein naar groot:
2 4 5 5 6 7 8 9 10 12 12 15 14 23 37.
Stel dat we weer naar het getal 4 willen zoeken.-
We kijken eerst naar het achtste getal (15 / 2 = 7,5 afgerond 8)
- Dat is 9. Dat is te groot, en dus moet het getal 4 ervoor zitten. We kunnen de zoektocht voortzetten in de eerste helft.
- We kijken nu naar het vierde getal (8 / 2 = 4)
- Dat is 5. Dat is te groot, en dus moet het getal 4 ervoor zitten. Weer is het aantal waarin we moeten zoeken gehalveerd.
- We bekijken het tweede getal (4 / 2 = 2)
- Dat is 4. We zijn er! En nu in drie keer.
Stel dat we ook weer naar het getal 3 willen zoeken.-
We kijken eerst naar het achtste getal.
Dat is 9. Dat is te groot, en dus moet het getal 3 ervoor zitten.
- We kijken nu naar het vierde getal (8 / 2 = 4)
Dat is 5. Dat is te groot, en dus moet het getal 3 ervoor zitten.
- We bekijken het tweede getal (4 / 2 = 2)
Dat is 4. Dat is te groot, en dus moet het getal 3 ervoor zitten.
- We bekijken het eerste getal (2 / 2 = 1)
Dat is 2. Dat is te klein, en dus moet het getal 3 erna komen, als het er is.
- Het zou dus tussen het eerste en tweede getal moeten zitten, maar daar zitten geen getallen tussen en dus zit het getal 3 er niet bij.
Dat hebben we nu in 4 stappen ontdekt.
Bij deze strategie halveer je steeds het aantal overgebleven mogelijkheden.
Als je bijvoorbeeld zoekt in 1000 records begin je met record nummer 500.
Als je record nr. 500 bekeken hebt weet je of je verder moet zoeken in record 1 t/m 499 of in record 501 t/m 1000.
Je bent dus van 1000 naar 500 mogelijkheden gegaan.
Daarna moet je nog zoeken in 250 records, dan 125, dan 63, 32, 16, 8, 4, 2, 1.
Na tien pogingen ben je er zeker van of het gezochte er is of niet.
Je zou ook andersom kunnen rekenen. Beginnen aan het uiteinde (één mogelijkheid over) en steeds verdubbelen: 1, 2, 4, 8,
16, 32, 64, 128, 256, 512, 1024.
Je krijgt dan machten van 2, en bij 2 tot de tiende zit je boven de 1000, tien records bekijken is dus genoeg.
In wiskundige termen: Het maximale aantal records dat je bekijkt is de 2-logaritme van het totaal aantal records.
Dit werkt natuurlijk alleen als de rij gesorteerd is.
Daarom wordt er in een tabel vaak verschillende sorteringen bijgehouden. Als je de tabel in beeld hebt dan kan hij maar op één
manier gesorteerd zijn. Maar vaak is er een extra bestand waarin de sorteervolgorde op een ander veld is vastgelegd.
Dat wordt een index genoemd.
Een index maakt dat je snel kunt zoeken in een tabel. Maar het betekent wel dat die index moet worden bijgehouden, elke keer als
er iets in de database wordt gewijzigd moet de index worden bijgewerkt.
Je kunt in Access bij de eigenschappen van een tabel in het ontwerpvenster aangeven of er een index op een veld is of niet.
Je kunt ook m.b.v. SQL een index maken.
De opdracht om een index bij te houden op het veld scores van de tabel leden van de tennisvereniging-database is:
CREATE INDEX scoreindex ON leden (scores)
10.7. Locking; Commit; Rollback
Bij grote databases moet je er rekening mee houden dat twee personen tegelijk iets willen veranderen.
Dat wordt Concurrency genoemd, je hebt dan concurrente processen.
Dit kan bijvoorbeeld voorkomen als een reisbureau een boeking verricht.
Op het moment dat het ene reisbureau een vliegtuigstoel reserveert moet voor een ander reisbureau
de toegang tot dit record geblokkeerd zijn, totdat de transactie van de eerste is afgerond.
Anders kan het gebeuren dat een stoel dubbel gereserveerd wordt.
Het DBMS voorkomt dubbele boekingen door locking toe te passen. De toegang tot het record,
waar iets mee gebeurt, wordt geblokkeerd als het wordt gewijzigd.
Een ander voorbeeld is het overboeken van geld bij een bank.
Als iemand € 100,- over wil boeken van rekening 1 naar rekening 2, dan wordt er eerst 100,- van rekening 1 afgeschreven.
Voordat dat gebeurt wordt er eerst een lock aangevraagd op rekening 1.
Pas als het systeem de rekening voor anderen op slot
heeft gezet wordt de 100,- van rekening 1 afgeschreven.
Dan moet er nog 100,- op rekening 2 worden bijgeschreven.
Er wordt dan een lock aangevraagd op rekening 2, rekening 1 blijft nog op slot voor anderen.
Als rekening 2 voor anderen op slot is gezet wordt de 100,- op rekening 2 bijgeschreven.
En daarna worden rekening 1 en rekening 2 weer vrijgegeven, het lock wordt opgeheven.
Maar deze oplossing kan ook weer problemen opleveren.
Stel je voor dat iemand € 100,- over wil boeken van rekening 1 naar rekening 2, en dat heel toevallig iemand anders
op precies hetzelfde moment € 75,- over wil boeken van rekening 2 naar rekening 1.
Persoon nr. 1 doet de eerste boeking. Er wordt een lock op rekening 1 gezet en de 100,- wordt van rekening 1 afgeschreven.
Dan moet er nog 100,- op rekening 2 worden bijgeschreven.
Tegelijkertijd doet persoon nr. 2 de tweede boeking. Er wordt een lock op rekening 2 gezet en de 75,- wordt van rekening 2 afgeschreven.
Dan moet er nog 75,- op rekening 1 worden bijgeschreven.
Door het proces van persoon nr. 1 wordt er een lock aangevraagd op rekening 2, maar die rekening wordt niet vrijgegeven want
het proces van persoon nr. 2 is daar nog bezig.
Door het proces van persoon nr. 2 wordt er een lock aangevraagd op rekening 1, maar die rekening wordt niet vrijgegeven want
het proces van persoon nr. 1 is daar nog bezig.
Ze wachten dus op elkaar, dat wordt een deadlock genoemd.
Als er geen rekening met een deadlock gehouden zou worden dan zou het kunnen gebeuren dat
processen eeuwig op elkaar blijven wachten.
Een DBMS houdt een logboek bij met alle transactieactiviteiten.
Voordat een transactie de database mag wijzigen
wordt deze eerst opgeslagen in het logboek.
Het punt waarop alle stappen van een transactie in het logboek zijn opgeslagen wordt het commitpunt genoemd.
Op dit punt heeft het DBMS alle informatie die het nodig kan hebben om de transactie te kunnen reconstrueren als dat nodig zou zijn.
Het DBMS is dan klaar om zich als het ware over te geven (engels: commit).
Bij de SQL-opdracht Commit wordt ervoor gezorgd dat een transactie daadwerkelijk word uitgevoerd.
Bij een storing kan de database hersteld worden door alle onvolledige transacties terug te draaien. Dit wordt aangeduid met de
engelse term rollback.
Niet alleen bij een storing gebeurt dat, een transactie kan ook worden afgebroken doordat het systeem de toegang tot bepaalde
informatie weigert. Of wanneer er een deadlock is opgetreden, waarbij twee transacties op elkaar wachten.
Bij het werken met Access zul je hier niets van merken; als er toch maar één gebruiker tegelijk toegang tot
de database heeft dan zijn al die voorzorgsmaatregelen niet nodig. Elke SQL-query wordt dan direkt uitgevoerd en er wordt geen
logboek bijgehouden. Dit kan bij de meeste DBMS'en geregeld worden door bij de instellingen AUTOCOMMIT op ON te zetten, het
kan ook met de SQL-opdracht: SET AUTOCOMMIT ON
|