Wat is een database
Een database (of databank in het Nederlands) is een plek waar je gegevens bewaart.Voorbeelden van databases zijn dus:
- schrijfblokken
- kasboeken
- agenda's
- e.d.
Toepassingen van databases
- Bankrekenening (rekeninghouder, rekeningnummer, saldo, transacties)
- Adressen (voornaam, achternaam, straat, plaats, telefoonnummer)
- Forums (users, berichten)
- Projectadministratie (offertes, uren, kosten)
- Content Management System (teksten, afbeeldingen)
- Reserveringssystemen (vluchtnummer, vertrek en aankomsttijd)
- Product catalogus (artikel nummer, artikel naam, prijs, voorraad)
Waarom databases?
- Gegevens worden centraal opgeslagen (dus niet iedereen heeft zijn eigen Rolodex op zijn bureau staan, dus een adreswijziging wordt in een database op slechts 1 plaats opgeslagen).
- De gegevens worden gestructureerd opgeslagen, zodoende kun je de gegevens hergebruiken.
- Je kunt verschillende gegevens bestanden koppelen, zodat je een dynamisch overzicht krijgt, bijvoorbeeld van inkoop en verkoop.
- Je kunt vorm, inhoud en techniek van elkaar loskoppelen.
- Je kunt bepaalde gegevens afschermen voor gebruikers (bijvoorbeeld: een receptioniste die alleen telefoonnummers nodig heeft, hoeft geen inzicht te hebben in financiele gegevens, dat is meer iets voor het management).
Ontstaan van de database
Het grote probleem met bewaren is het zo te bewaren dat je later het bewaarde weer terug kunt vinden. Daar is in de loop van de geschiedenis de huidige database zoals wij de kennen uit ontstaan.
In de loop der jaren verschillende systemen bedacht om informatie zo slim mogelijk te bewaren. Doel is telkens om te zorgen dat gebruikers snel benodigde informatie kunnen terugvinden in een grote berg van andere informatie.
In een hierarchische database (v.a. jaren 60) worden gegevens opgeslagen in een groot document, dat hierarchisch is opgebouwd.
bijvoorbeeld:
- School
- Klas1
- Leerling Jan Klaasen
- Leerling Piet van Dam
- Leerling Klaas de Boer
- etc
- Klas2
- Leerling Clark Kent
- Leerling Lois Lane
- Leerling Peter Pan
- etc.
- etc.
Waar zou je een docent het beste in de boom kunnen plaatsen?
In een netwerk database ( v.a. jaren 70) is het bovenstaande concept als het ware uitgebreid met hyperlinks. Hierdoor kan dezelfde informatie op meerdere plaatsen tegelijk in de boom voorkomen en zijn complexe gegevensstructuren mogelijk. De structuur van de database werd keurig vastgelegd in een "schema". Alleen was het erg veel programmeerwerk om gegevens uit de database te halen.
Tegenwoordig worden beide bovenstaande type database systemen nog maar weinig gebruikt.
Voor speciale doeleinden zijn er:
- XML databases voor opslag van XML documenten.
- Object-oriented databases voor opslag van objecten uit object-georienteerde talen.
Maar verreweg het populairst zijn zogenaamde relationele database (r-mds). Dit de database die ik jullie ga uitleggen.
Hoe zit een relationele database in elkaar?
In een relationele database worden lijsten bijgehouden van bij elkaar horende gegevens: de tabellen. Een database is een verzameling van één of meerder tabellen. Een school database zou kunnen bestaan uit een tabel met gegevens over studenten, een tabel met gegevens over leraren, een tabel met klassen, een tabel met lessen, een tabel met cijfers, en dergelijke.
Tabel
In een database kun je de gegevens origaniseren in thema's. Zo'n thema heet een tabel. Een tabel kun je vergelijken met een Excel bestand (in feite is het ook een tabel). Omdat een Excel bestand een gestructureerd bestand is kun je het vaak uitwisselen met andere programma's of database applicaties (doormiddel van formaten als TSV, CSV of XML).
In een tabel staan bij elkaar horende gegevens op één regel. Een rij in een database tabel wordt een record genoemd. De gegevens van één student vormen dus één record. Een record bestaat uit verschillende velden. Als je een tabel ontwerpt moet je voor ieder veld aangeven wat de veldnaam is en wat voor soort gegevens er in komen: text, integers, datums, e.d.
Tabel: rij
Een rij wordt ookwel een 'tuple' of 'record' genoemd.
Tabel: kolom
Een kolom wordt ookwel een 'attribuut' of 'veld' genoemd.
Modeleren
Wat is modeleren
- Een database is eigenlijk een model van de realiteit.
- Modeleren is structuur aanbrengen in de realiteit.
- Je moet dus goed analytisch kunnen denken om de realiteit te abstraheren naar entiteiten, attributen en relaties
- Modeleren is eigenlijk puzzelen.
Met modeleren optimaliseer je je gegevensstructuur.
- Je voorkomt dubbele gegevens (ookwel redunantie genoemd)
- Je houdt de omvang van de database beperkt en optimaliseert zodoende de performance
- Het geheel blijft overzichtelijk omdat je de realiteit in onderwerpen (entiteiten) opdeelt.
Een voorbeeld
Stel je wilt een bestand maken met daarin de telefoonnummers van je vrienden. In de tabel hieronder (Tabel 01) zie je een kolom voor de voor- en achternaam. En tevens diversie kolommen voor de telefoonnummers. Er zijn altijd wel vrienden met meerdere telefoonnummers. Kijk maar naar Ivan Hoe, die heeft wel drie telefoonnummers. Er ontstaat echter een probleem als Ivan Hoe nog een vierde (of zelfs vijfde) telefoonnummer krijgt. Dan dien je een nieuwe kolom aan te maken.
Tabel 01: friends
Je zou de tabel ook als volgt in kunnen richten. Indien Ivan Hoe een extra telefoonnummer krijgt, dan hoef je in ieder geval geen nieuwe kolom aan te maken.
Tabel 02: friends
Het probleem echter met deze tabel is, dat wanneer je per ongeluk de naam van Ivan Hoe verkeerd getypt hebt, en je wilt deze veranderen. Je dus 3 keer de naam moet veranderen. Stel je verandert de naam in Ivanhoe Knight. Als je één van de records vergeet te veranderen, dan heb je een probleem als je op de achternaam 'Knight' zoekt.
Tabel 03: friends
Het is daarom beter om de tabel 'friends' verder uit te splitsen in 'friends' en 'phonenumbers'. Indien je dus de naam van één je vrienden wilt veranderen, hoef je dat maar één keer te doen. Wat wel noodzakelijk is dat je de juiste naam aan het juiste telefoonummer koppelt. Je gebruikt hiervoor een sleutelveld (in dit geval 'id'). In beide tabellen, dien je dit sleutelveld te gebruiken, zodat je een link kunt maken. Let er wel op wat voor soort id je gebruikt in dit geval zijn volgnummers gebruikt. Indien je bijvoorbeeld de initialen gebruikt van je vrienden, 'ck' voor Clark Kent en je verandert de naam Clark Kent in Clarky Supermannetje, dan krijg je een probleem als je het id ook verandert in 'cs'. Je dient dan immers ook het id in je tabel phonenumbers te veranderen.
Tabel 04: friends
Tabel 05: phonenumbers
Primairy Key
Om gegevens later beter terug te kunnen vinden krijgt ieder record een veld met een unieke sleutel: de primary key. Deze primary key is uniek voor het hele record en met de primary key op zak kun je dus alle bijbehorende gegevens vinden. Er mogen nooit twee records voorkomen met dezelfde primary key. De velden voornaam, achternaam en geboortedatum zijn niet geschikt als primary key, omdat er meerdere studenten kunnen zijn met dezelfde voornaam, met dezelfde achternaam of met dezelfde geboortedatum. Primary keys zijn bij voorkeur betekenisloze nummertjes (ID's), die (op verzoek) door het database systeem kunnen worden aangemaakt zodra je een record toevoegt. Voorbeelden zijn je studentennummer, je sofi-nummer of een productcode.
Waarom is het beter als een primary key geen betekenis heeft?
In een relationele database worden de gegevens in verschillende tabellen ook aan elkaar gekoppeld door gebruik te maken van deze primary key. In een van de tabellen maak je een veld dat verwijst naar de primary key uit de andere tabel. In het bovenstaande voorbeeld is het veld 'class' waarschijnlijk een verwijzing naar de primary key van de 'classes' tabel. Als je wil weten wie de mentor is van een bepaalde student, dan kijk je eerst in het veld 'class' en zoek je vervolgens in de tabel 'classes' naar het record met als primary key "CMD1K". Het verwijzende veld wordt een foreign key genoemd.
SQL
Alle relationele database systemen hebben met elkaar gemeen dat ze SQL (Structured Query Language) begrijpen. SQL is een standaard taaltje, waarmee je
- gegevens uit de database kan halen (Query the database): SELECT
- gegevens in de database kunt wijzigen: INSERT, UPDATE, DELETE
- de database kunt aanpassen: CREATE, ALTER
Op het gebruik van SQL komen in een andere les op terug.
Verschillende systemen
Er zijn verschillende relationele database systemen (server programma's) op de markt:
MS Access | Onderdeel van MS Office. Alleen voor beperkt gebruik. |
MySql | Open source database systeem voor algemeen gebruik. |
MS SqlServer | Professioneel en duur database systeem. |
Oracle | Zeer duur database systeem voor zeer grote databases. |
Bij de keuze voor een bepaalde database systeem wordt gelet op:
- performance (hoe snel kun je een speld in een hooiberg vinden)
- beveiliging (hoe zorg je dat een gebruiker alleen de gegevens kan zien of wijzigen die deze gebruiker mag zien)
- transacties (hoe zorg je dat je gegevens blijven kloppen als er halverwege een wijziging iets fout gaat)
- prijs
PHPmyAdmin
Er staat al een hele beschrijving van phpmyadmin online maar hier een overzicht van hoe je dit programma in het algemeen moet gebruiken.
Er zijn een heleboel verschillende programma's die je visueel ondersteunen bij het maken van een database. Hierbij kan je denken aan acces van microsoft, maar ook aan phpmyadmin. Dit is een gratis programma waarmee je je database ontwikkelen via internet of via apache op je eigen computer.
In phpmyadmin kan je met behulp van SQL een database maken, maar ook door gewoon te klikken. We gaan beiden uitproberen. Iedereen die online werkt heeft al een database, deze heeft de naam van je student nummer. Je kan niet nog een database maken, het enige wat je kan doen is tabellen aanmaken.
Wanneer je een tabel hebt opgegeven, moet je alle velden een naam geven een de parameters instellen. Hieronder een rijtje met de betekenis van de verschillende parameters:
type | parameter |
tekst | varchar, text |
foto, mp3 | blob |
getal | int |
lijst | enum |
Al deze parameters bestaan in verschillende varianten, groter en kleiner (tiny, medium, large). Dit heeft te maken met hoeveel ruimte je denkt nodig te hebben, de databases reserveert een bepaalde hoeveelheid ruimte op je harde schijf voor de eventuele data.
varChar
De enige
uitzondering is varchar. Deze is voor een variabele tekst. Bijvoorbeeld
een naam of een straat. Je moet aangeven hoeveel tekens dit woord
maximaal lang is. Dit is dus niet voor tekst maar meer voor variabelen.
Length
Van elke parameter moet je aangeven wat de length is. Dit is
bij bijna allemaal al voor gedefieneerd, en dit hoef je dan ook niet
in te vullen. Alleen bij varchar en enum moet dit wel altijd.
Attributen
Atributen zijn alleen belangrijk bij het gebruik van een blob.
Hier zal je meestal kiezen voor binairy. Anders laat je dit veld altijd
leeg.
Null
Moet het database veld als het bestaat altijd gevuld zijn? Is het schadelijk
voor de database als het veld leegblijft. Wanneer dit niet het geval
is kan je voor null kiezen, kies anders voor not null. Standaard
waarde heeft hier direct mee te maken, als je kiest voor not null
kan je een standaard waarde aangeven, die wordt ingevuld wanneer
er niets wordt opgeven.
Extra
Extra gebruik je vooral bij je id. Deze is vaak ook je primairy key en
moet automatisch doornummeren. Hier kies je dan voor 'auto_increment'.
Deze optie zorgt dat dit veld bij elke nieuwe record automatisch
doornummert.
Primary key
In het laatste rijtje kan je aangeven of dit veld een primairy key ontvangt.
Dit is de eerste radiobutton van de drie. De andere staan voor het
indexeren van het veld of dat de waarde in het veld verplicht uniek
moet zijn. Deze komen later ter sprake.
SQL in phpmyAdmin
Op elk scherm in phpmyadmin kan je SQL queries loslaten op je database. Zo kan je goed testen welke resultaten je terug krijgt en of je queries goed zijn. Hier onder een plaatje waar dat kan:
Wanneer je een query hebt opgegeven kan je op de button start klikken
om de query te activeren. Het resultaat is een tabel met alle gegevens
uit de tabel Docenten waar het id 1 is. Dus refererent naar de tabel
boven is het resultaat het volgende:
1 | Marije | Smits | CMD |
Wanneer je bovenstaande query vanuit php verstuurd, krijg je binnen php dezelfde gegevens terug. Vervolgens kan je met html deze gegevens op maken. Meer hierover in de volgende les.