Tutorials
welke tabellen heb ik nodig?
Als je een database nodig hebt, is het vaak de vraag: welke tabellen heb ik nodig? Volgens de regels van de normalisatie kun je dit bedenken, maar ik heb altijd een makkelijkere manier geleerd, en deze zal ik ook eens hier uitleggen. Of je deze manier gebruikt, mag je zelf weten. de basis van het relationele model. Je hoeft helemaal geen verstand te hebben van databases, php of welke taal dan ook, ik zal hier niet eens code behandelen! Maar een beetje logisch denken is dan wel weer nodig. Let wel op: dit is pas een opstapje tot een goed databasemodel. Je zult na deze methode alsnog goed moeten nadenken of het wel helemaal logisch is. Ik heb dan ook nog een pagina toegevoegd met een aantal aanvullingen
Pagina 1
Zinsontleden
Waarschijnlijk heb je aan dit woord een grote hekel, ik in ieder geval wel. Saaie lessen Nederlands. Maar hier is de eerste nuttige toepassing! Maar wel heel simpel. Het enige wat ik vraag is het verschil te kunnen ontdekken tussen een werkwoord een zelfstandig naamwoord. Wat waren dat ook alweer? Een werkwoord is een doe-woord, een zelfstandig naamwoord is een ding.
Voor je begint met de database ontwerpen zet je gewoon eens op papier wat het systeem allemaal moet kunnen. Ik zal in deze tutorial gebruik maken van een fictief school systeem. Een zin die al een functie heeft is:
'Klaas zit in V3B'
Klaas en V3B zijn beide namen, van respectievelijk Student en van Klas. Dus dat vervangen we even:
'Student zit in Klas'
Nu kunnen we gaan ontleden! Student en Klas zijn beide een zelfstandig naamwoord, en zit in komt van inzitten, en is een werkwoord. Het enige wat je vervolgens hoeft te onthouden is het volgende:
- een zelfstandig naamwoord wordt een entiteit
- een werkwoord wordt een relatie
Dan krijgt ons onbeduidend zinnetje opeens meer betekenis:
Student--------<zit in>--------Klas
De entiteit Student heeft een relatie met de entiteit Klas
Voor je begint met de database ontwerpen zet je gewoon eens op papier wat het systeem allemaal moet kunnen. Ik zal in deze tutorial gebruik maken van een fictief school systeem. Een zin die al een functie heeft is:
'Klaas zit in V3B'
Klaas en V3B zijn beide namen, van respectievelijk Student en van Klas. Dus dat vervangen we even:
'Student zit in Klas'
Nu kunnen we gaan ontleden! Student en Klas zijn beide een zelfstandig naamwoord, en zit in komt van inzitten, en is een werkwoord. Het enige wat je vervolgens hoeft te onthouden is het volgende:
- een zelfstandig naamwoord wordt een entiteit
- een werkwoord wordt een relatie
Dan krijgt ons onbeduidend zinnetje opeens meer betekenis:
Student--------<zit in>--------Klas
De entiteit Student heeft een relatie met de entiteit Klas
Pagina 2
cardinaliteit
Het volgende waar je dan aan moet denken is de cardinaliteit. Dit geeft aan wat de kwantische verhouding is tussen deze entiteiten. Kwantisch betekent hoeveelheid, dus dit heeft te maken hoe de relatie is in hoeveelheden. Beetje lastig uit te leggen, maar door een voorbeeld is het duidelijker:
'De Student kan maar in 1 Klas voorkomen, maar in de Klas kunnen meerdere Studenten zitten'
Oftewel: de relatie van de Student naar de Klas is 1 (aangegeven met 1), en de relatie van de Klas naar de Student is veel (aangegeven met n). de uiteindelijke uitkomst van ons zinnetje wordt dan:
Student----(1)----<zit in>----(n)----Klas
Dit wordt een relatie van 1 op veel genoemd, andersom is het een veel op 1 relatie.
Volgend voorbeeld
'Klaas volgt les van mr Janssen'
Dit wordt dan:
'Student volgt les van Docent'
Vervolgens:
Student--------<volgt les van>--------Docent
Maar als we nu de cardinaliteit willen toevoegen, wordt het lastiger! De Student kan van meerdere Docenten les hebben, maar de Docent kan meerdere Studenten hebben. Dit wordt dan de veel op veel relatie:
Student----(n)----<volgt les van>----(n)----Docent
De volgende stap is het daadwerkelijk omzetten naar een tabel structuur.
'De Student kan maar in 1 Klas voorkomen, maar in de Klas kunnen meerdere Studenten zitten'
Oftewel: de relatie van de Student naar de Klas is 1 (aangegeven met 1), en de relatie van de Klas naar de Student is veel (aangegeven met n). de uiteindelijke uitkomst van ons zinnetje wordt dan:
Student----(1)----<zit in>----(n)----Klas
Dit wordt een relatie van 1 op veel genoemd, andersom is het een veel op 1 relatie.
Volgend voorbeeld
'Klaas volgt les van mr Janssen'
Dit wordt dan:
'Student volgt les van Docent'
Vervolgens:
Student--------<volgt les van>--------Docent
Maar als we nu de cardinaliteit willen toevoegen, wordt het lastiger! De Student kan van meerdere Docenten les hebben, maar de Docent kan meerdere Studenten hebben. Dit wordt dan de veel op veel relatie:
Student----(n)----<volgt les van>----(n)----Docent
De volgende stap is het daadwerkelijk omzetten naar een tabel structuur.
Pagina 3
1 op veel en veel op 1
De 1 op veel relatie, of het omgekeerde, de veel op 1 relatie, gaan op dezelfde manier. Deze ga ik dan ook niet twee keer uitleggen, het is toch hetzelfde.
We hadden de volgende relatie:
Student----(1)----<zit in>----(n)----Klas
Het eerste wat we doen is elk van elk entiteit een tabel maken. Je voegt meteen aan elke tabel een primary key toe (de unieke waarde), ikzelf ben nogal een fan van id’s, dus dat doe ik hier ook:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Klas
Primary key: klas_id
Naam
Gemiddelde
Vervolgens nemen we de primary key van de tabel die het kenmerk veel had, en stoppen we die als foreign key in de tabel die het kenmerk 1 had. Dan krijg je dit dus:
Tabel Student
Primary key: student_id
Naam
Adres
Foreign key: klas_id
Tabel Klas
Primary key: klas_id
Naam
Aantal_leerlingen
En daar zijn je twee tabellen, compleet met relaties!
We hadden de volgende relatie:
Student----(1)----<zit in>----(n)----Klas
Het eerste wat we doen is elk van elk entiteit een tabel maken. Je voegt meteen aan elke tabel een primary key toe (de unieke waarde), ikzelf ben nogal een fan van id’s, dus dat doe ik hier ook:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Klas
Primary key: klas_id
Naam
Gemiddelde
Vervolgens nemen we de primary key van de tabel die het kenmerk veel had, en stoppen we die als foreign key in de tabel die het kenmerk 1 had. Dan krijg je dit dus:
Tabel Student
Primary key: student_id
Naam
Adres
Foreign key: klas_id
Tabel Klas
Primary key: klas_id
Naam
Aantal_leerlingen
En daar zijn je twee tabellen, compleet met relaties!
Pagina 4
veel op veel
Dan de veel op veel relatie. We hadden deze relatie:
Student----(n)----<volgt les van>----(n)----Docent
Het eerste wat we doen is weer voor iedere entiteit een aparte tabel maken, en daar een primary key aan toeveogen. Dat word dit dan:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Docent
Primary key: docent_id
Naam
adres
Wat dan komt is het verschil: je maakt een nieuwe tabel, een zogenoemde koppeltabel. De primary keys van beide veel-tabellen worden als foreign key in een derde tabel geplaatst. Deze noem ik Les. De primary key is dan wel wat logisch nadenken. In eerste instantie had ik hier een id aan toegevoegd, maar naar de reacties heb ik dat verwijderd. Een leraar-leerling relatie is uniek, dus is deze beide een primary key. Wat krijg je dan:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Docent
Primary key: docent_id
Naam
adres
Tabel Les
Foreign key: student_id \samengevoegd de primary key
Foreign key: docent_id /
En ook hier weer mooie tabellen met goede relaties.
Student----(n)----<volgt les van>----(n)----Docent
Het eerste wat we doen is weer voor iedere entiteit een aparte tabel maken, en daar een primary key aan toeveogen. Dat word dit dan:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Docent
Primary key: docent_id
Naam
adres
Wat dan komt is het verschil: je maakt een nieuwe tabel, een zogenoemde koppeltabel. De primary keys van beide veel-tabellen worden als foreign key in een derde tabel geplaatst. Deze noem ik Les. De primary key is dan wel wat logisch nadenken. In eerste instantie had ik hier een id aan toegevoegd, maar naar de reacties heb ik dat verwijderd. Een leraar-leerling relatie is uniek, dus is deze beide een primary key. Wat krijg je dan:
Tabel Student
Primary key: student_id
Naam
Adres
Tabel Docent
Primary key: docent_id
Naam
adres
Tabel Les
Foreign key: student_id \samengevoegd de primary key
Foreign key: docent_id /
En ook hier weer mooie tabellen met goede relaties.
Pagina 5
Opmerkingen
Zoals je misschien al gemerkt had, geeft deze tabellen altijd nette tabellen, maar zijn ze niet altijd even logisch. Ook hier weer naar de reacties zijn er nog een aantal tips.
Probeer te catagoriseren. Zowel een Student als een Docent zijn personen. Je zou dus een tabel Persoon aan kunnen maken, met een kolom waarin staat wat de functie van die persoon is. Hierdoor wordt je database kleiner, en dus makkelijker te beheren.
Gebruik de jusite kolommen. je zou in de tabel Klas een kolom aantal_leerlingen kunnen opnemen. Maar dit kun je ook verkrijgen met een count functie in je query. Lees normalisatie nog even door voor al dit soort zaken.
Probeer te catagoriseren. Zowel een Student als een Docent zijn personen. Je zou dus een tabel Persoon aan kunnen maken, met een kolom waarin staat wat de functie van die persoon is. Hierdoor wordt je database kleiner, en dus makkelijker te beheren.
Gebruik de jusite kolommen. je zou in de tabel Klas een kolom aantal_leerlingen kunnen opnemen. Maar dit kun je ook verkrijgen met een count functie in je query. Lees normalisatie nog even door voor al dit soort zaken.
Pagina 6
Slotwoord
Nou dat was het dan. Een introductie tot een mooie database. Zelf heb ik dit op school geleerd, en vind ik het een fijne manier om een relationele database op te zetten. Maar als je normaliseren makkelijker vindt, gebruik die dan. Als je het goed doet, kom je op beide manier op hetzelfde uit.
let wel, na het opzetten van deze relaties moet je goed gaan nadenken over de functionaliteit van je database. hebben sommige tabellen dezelfde functie? voeg die dan samen. over de velden van een tabel heb ik het niet gehad, maar hier zijn genoeg tutorials over, zoals de normalisatie methode
Jeroen
let wel, na het opzetten van deze relaties moet je goed gaan nadenken over de functionaliteit van je database. hebben sommige tabellen dezelfde functie? voeg die dan samen. over de velden van een tabel heb ik het niet gehad, maar hier zijn genoeg tutorials over, zoals de normalisatie methode
Jeroen
Reacties
0