Een investering in kennis levert het meeste op.
Benjamin Franklin
In de moderne wereld is onderwijs alomtegenwoordig. Nu meer dan ooit speelt het een belangrijke rol in onze samenleving. Het is zelfs zo belangrijk dat velen van ons onze opleiding lang voortzetten nadat ze hun school of universiteit hebben afgerond.
We hebben allemaal gehoord van levenslang leren, niet-formeel onderwijs en workshops voor alle leeftijden. Deze methoden verschillen in veel opzichten van het formele onderwijs, maar ze hebben ook dingen gemeen. Er zijn klassen, lessen, docenten en studenten. En net als in een traditionele omgeving, willen we het lesrooster, de aanwezigheidsgegevens en de prestaties van de instructeur of leerling bijhouden. Hoe kunnen we een database ontwerpen om aan deze behoeften te voldoen? Dat is wat we in dit artikel zullen behandelen.
Introductie van ons onderwijsdatabasemodel
Met het model dat in dit artikel wordt gepresenteerd, kunnen we gegevens opslaan over:
- lessen/lezingen
- instructeurs/docenten
- studenten
- aanwezigheid lezing
- prestaties van studenten / docenten
We zouden dit model ook kunnen gebruiken als schoolrooster, voor andere groepsactiviteiten (zwemlessen, dansworkshops) of zelfs voor één-op-één activiteiten zoals bijles. Er is nog veel ruimte voor verbeteringen, zoals het opslaan van leslocatiegegevens of workshopduur; we zullen deze behandelen in komende artikelen.
Laten we beginnen met onze basis Education database-elementen:de tabellen.
De grote drie:leerling-, instructeur- en klastafels
De student
, instructor
, en class
tabellen vormen de kern van onze database.
De student
tabel, hierboven weergegeven, wordt gebruikt om basisgegevens over studenten op te slaan, maar kan worden uitgebreid volgens specifieke behoeften. Met uitzondering van de drie contactattributen zijn alle attributen in de tabel vereist:
first_name
– de naam van de leerlinglast_name
– de achternaam van de studentbirth_date
– de geboortedatum van de studentcontact_phone
– het telefoonnummer van de studentcontact_mobile
– het mobiele telefoonnummer van de leerlingcontact_mail
– het e-mailadres van de studentcategory_id
– is een verwijzing naar decategory
catalogus. Met deze structuur zijn we beperkt tot slechts één categorie per student. Dat werkt in de meeste gevallen, maar in sommige situaties hebben we misschien ruimte nodig om meerdere categorieën op te sommen. Zoals je kunt zien, voeg je een veel-op-veel-relatie toe die destudent
tabel met decategory
woordenboek lost dit probleem op. In dit scenario moeten we echter complexere query's schrijven om onze gegevens te verwerken.
Aangezien we het hebben genoemd, gaan we verder en bespreken we de category
tafel hier.
Deze tabel is een woordenboek dat wordt gebruikt om studenten te groeperen op basis van bepaalde criteria. De name
attribuut is de enige data in de tabel (naast id
, de primaire sleutel) en het is verplicht. Een reeks waarden die hier kan worden opgeslagen, is de arbeidsstatus van de student:"student", "in dienst", "werkloos" en "gepensioneerd". We kunnen ook andere sets gebruiken op basis van een aantal zeer specifieke criteria, zoals 'houdt van yoga', 'houdt van wandelen', 'houdt van fietsen' en 'vind niets leuks'.
De instructor
tabel bevat een lijst van alle instructeurs/docenten in de organisatie. De attributen in de tabel zijn:
first_name
– de naam van de instructeurlast_name
– de achternaam van de instructeurtitle
– de titel van de instructeur (indien van toepassing)birth_date
– de geboortedatum van de instructeurcontact_phone
– het telefoonnummer van de instructeurcontact_mobile
– het mobiele telefoonnummer van de instructeurcontact_mail
– het e-mailadres van de instructeur
De title
en alle drie contact
attributen zijn niet verplicht.
De student
table en instructor
tabel delen een vergelijkbare structuur, maar er is een andere mogelijkheid om deze informatie te organiseren. Een tweede benadering zou zijn om een person
tabel (die alle werknemers- en studentgegevens opslaat) en heeft een veel-op-veel-relatie die ons alle rollen vertelt die aan die persoon zijn toegewezen. Het belangrijkste voordeel van de tweede benadering is dat we gegevens maar één keer opslaan. Als iemand een instructeur is in de ene klas en een student in een andere, wordt hij slechts één keer in de database weergegeven, maar met beide rollen gedefinieerd.
Waarom hebben we voor ons educatieve databasemodel gekozen voor de tweetabellenbenadering? Over het algemeen gedragen studenten en docenten zich anders, zowel in het echte leven als in onze database. Daarom kan het verstandig zijn om hun gegevens apart op te slaan. We kunnen andere manieren vinden om de informatie over dezelfde persoon die in beide tabellen wordt weergegeven, samen te voegen (bijvoorbeeld een paar invoeg-/bijwerkquery's op basis van een externe id, zoals een burgerservicenummer of btw-nummer).
De class
table is een catalogus die details over alle klassen bevat. We kunnen meerdere instanties van elk klassetype hebben. De attributen in de tabel zijn als volgt (alle zijn verplicht behalve end_date
):
class_type_id
– is een verwijzing naar declass_type
woordenboek.name
– is een korte naam van de klas.description
– deze beschrijving is specifieker dan die in declass_type
tafel.start_date
– de startdatum van de les.end_date
– de einddatum van de les. Het is niet verplicht omdat we misschien niet altijd de exacte einddatum voor elke les van tevoren weten.completed
– is een Booleaanse waarde die aangeeft of alle geplande klasactiviteiten zijn voltooid. Dit is handig als we de geplandeend_time
hebben bereikt voor een klas, maar andere klasactiviteiten moeten nog worden voltooid.
De class_type
table is een eenvoudige catalogus, bedoeld om basisinformatie op te slaan over de colleges of lessen die aan studenten worden aangeboden. Het kan waarden bevatten zoals "Engelse taal (groep)", "Poolse taal (groep)", "Kroatische taal (groep)", "Engelse taal (in persoon)" of "Danslessen". Het heeft slechts twee verplichte attributen – name
en description
, die beide geen verdere uitleg behoeven.
De class_schedule
tabel bevat specifieke tijden voor lezingen en lessen. Alle attributen in de tabel zijn verplicht. De class_id
attribuut is een verwijzing naar de class
tabel, terwijl start_time
en end_time
zijn de begin- en eindtijden van die specifieke lezing.
Wie is hier? Aanwezigheidsgerelateerde tabellen
De attend
tabel bevat informatie over welke student welke les heeft bijgewoond en het eindresultaat. De attributen in de tabel zijn:
student_id
– is een verwijzing naar destudent
tafelclass_id
– is een verwijzing naar declass
tafelclass_enrollment_date
– is de datum waarop de leerling die les begon te volgenclass_drop_date
– de datum waarop de leerling de klas verlaat. Dit kenmerk heeft alleen waarde als de leerling de les heeft laten vallen vóór de einddatum van de les. In dat geval wordt dedrop_class_reason_id
attribuutwaarde moet ook worden ingesteld.drop_class_reason_id
– is een verwijzing naar dedrop_class_reason
tafelattendance_outcome_id
– is een verwijzing naar deattendance_outcome
tafel
Alle gegevens behalve class_drop_date
en drop_class_reason_id
Is benodigd. Deze twee worden alleen ingevuld als en alleen als een leerling de klas verlaat.
De drop_attendance_reason
table is een woordenboek met de verschillende redenen waarom een student een cursus zou kunnen laten vallen. Het heeft maar één attribuut, reason_text
, en het is verplicht. Een voorbeeld van een reeks waarden kan zijn:"ziekte", "verloren interesse", "heeft niet genoeg tijd" en "andere redenen".
De attendance_outcome
tabel bevat beschrijvingen over de activiteiten van studenten in een bepaalde cursus. De outcome_text
is het enige attribuut in de tabel en het is vereist. Een reeks mogelijke waarden is:"in uitvoering", "met succes voltooid", "gedeeltelijk voltooid" en "klas niet voltooid".
Wie heeft de leiding? Lesgerelateerde tabellen
De teach
, drop_teach_reason
en teach_outcome
tabellen gebruiken dezelfde logica als de attend
, drop_attendance_reason
en attendance_outcome
tafels. Al deze tabellen bevatten gegevens over cursusgerelateerde activiteiten van instructeurs.
De teach
tabel wordt gebruikt om informatie op te slaan over welke instructeur welke klas lesgeeft. De attributen in de tabel zijn:
instructor_id
– is een verwijzing naar deinstructor
tafel.class_id
– is een verwijzing naar declass
tafel.start_date
– is de datum waarop de instructeur aan die les begon te werken.end_date
- is de datum waarop de instructeur stopte met werken aan die klas. Het is niet verplicht omdat we niet van tevoren kunnen weten of de instructeur les zal geven tot de einddatum van de les.drop_teach_reason_id
– is een verwijzing naar dedrop_teach_reason
tafel. Het is niet verplicht omdat de instructeur de les niet mag laten vallen.teach_outcome_id
– is een verwijzing naar deteach_outcome_reason
tafel.
De drop_teach_reason
tabel is een eenvoudig woordenboek. Het bevat een reeks mogelijke verklaringen waarom de instructeur de les voor de einddatum heeft beëindigd. Er is slechts één verplicht attribuut:reason_text
. Dit kan "ziekte", "verplaatst naar een ander project/andere baan", "stoppen" of "andere reden" zijn.
De teach_outcome
tabel beschrijft het succes van de instructeur op een bepaalde cursus. De outcome_text
is het enige kenmerk van de tabel en is vereist. Mogelijke waarden voor deze tabel kunnen zijn:"in uitvoering", "met succes voltooid", "gedeeltelijk voltooid" en "heeft de lesgroep niet voltooid".
De student_presence
tabel wordt gebruikt om gegevens over de aanwezigheid van studenten voor een specifiek college op te slaan. We kunnen ervan uitgaan dat de docent voor elk college de aan- en/of afwezigheid van alle studenten noteert. De attributen in de tabel zijn:
student_id
– is een verwijzing naar destudent
tafelclass_schedule_id
– is een verwijzing naar declass_schedule
tafelpresent
– is een Booleaanse markering of de student bij het college aanwezig is of niet
We kunnen de aanwezigheid van leerlingen in een specifieke klas volgen met een zoekopdracht zoals de volgende (ervan uitgaande dat @id_class de klas-ID bevat die we willen).
SELECT a.id, CONCAT(a.first_name, ' ', a.last_name) AS student_name, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') AS percentage, a.attendance_outcomeFROM(SELECT student.id, student.first_name, student.last_name, SUM(CASE WHEN student_presence.present =True THEN 1 ELSE 0 END) AS number_present, COUNT(DISTINCT class_schedule.id) AS number_total, presence_outcome.outcome_text AS presence_outcomeFROM class INNER WORD LID aanwezig OP class.id =attend.class_id INNER WORD LID student AAN attend.student_id =student.id LEFT DOE MEE class_schedule ON class_schedule.class_id =class.id LEFT JOIN student_presence ON student_presence =student.student .id AND student_presence.class_schedule_id =class_schedule.id LEFT JOIN presentielijst AAN Attend_outcome.id =attend.attendance_outcome_idWHERE class.id =@id_classGROUP BY student.id, student.first_name, student.last_name, presence_outcome.outcome>aDe tabel "instructor_presence" gebruikt dezelfde logica als de tabel "student_presence", maar hier willen we ons concentreren op de instructeurs. De attributen in de tabel zijn:
instructor_id
– is een verwijzing naar deinstructor
tafelclass_schedule_id
– is een verwijzing naar declass_schedule
tafelpresent
– is een Booleaanse waarde die aangeeft of de instructeur aanwezig is bij de lezing of niet
We kunnen de onderstaande vraag gebruiken om de activiteit van de instructeur in de klas te volgen:
SELECT a.id, CONCAT(a.first_name, ' ', a.last_name) AS instructor_name, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') AS percentage, a.teach_outcomeFROM(SELECT instructor.id, instructor.first_name, instructor.last_name, SUM(CASE WHEN instructor_presence.present =True THEN 1 ELSE 0 END) AS number_present, COUNT(DISTINCT class_schedule.id) AS number_total, teach_outcome.outcome_text AS teach_outcomeFROM class INNER WORD LID VAN teach ON class.id =teach.class_id INNER WORD LID VAN instructeur AAN teach.instructor_id =instructor.id LEFT WORD LID VAN class_schedule ON class_schedule.class_id =class.id LEFT DOE IN instructor_presence.in instructor_presence.in instructor_presid .id AND instructor_presence.class_schedule_id =class_schedule.id LEFT DOE MEE teach_outcome ON teach_outcome.id =teach.teach_outcome_idWHERE class.id =@id_classGROUP BY instructor.id, instructor.first_name, instructor.last_name, teach_outcome.outcome_text)Laten we eindigen met het bespreken van de tabellen met contactpersonen.
Wie kunnen we bellen? Tabellen met contactpersonen
In de meeste gevallen hoeven we geen contactgegevens voor noodgevallen op te slaan (d.w.z. neem in geval van nood contact op met deze persoon). Dit verandert echter wanneer we kinderen lesgeven. Volgens de wet of gewoonte moeten we een contactpersoon hebben voor elk kind dat we lesgeven. In onze modeltabellen –
contact_person
,contact_person_type
encontact_person_student
– we demonstreren hoe dit kan.
De
contact_person
tabel is een lijst van mensen die verwant zijn aan studenten. Natuurlijk hoeven we niet alle familieleden op te sommen; meestal hebben we één of twee contacten per student. Dit is een goede manier om te vinden "wie je gaat bellen" wanneer de student eerder moet of wil vertrekken. De attributen in de tabel zijn:
first_name
– is de naam van de contactpersoonlast_name
– is de achternaam van de persooncontact_phone
– is het telefoonnummer van de persooncontact_mobile
– is het mobiele telefoonnummer van de persooncontact_mail
– is het e-mailadres van de persoon
Contactgegevens zijn niet verplicht, hoewel ze erg handig zijn.
De contact_person_type
table is een woordenboek met een enkel, vereist attribuut:type_name
. Voorbeelden van waarden die in deze tabel zijn opgeslagen zijn:"moeder", "vader", "broer", "zus" of "oom".
De contact_person_student
table is een veel-op-veel relatie die contactpersonen en hun type verbindt met studenten. De attributen in de tabel zijn (allemaal verplicht):
contact_person_id
– is een verwijzing naar decontact_person
tafelstudent_id
– is een verwijzing naar destudent
tafelcontact_person_type_id
– is een verwijzing naar decontact_person_type
tafel
Het is misschien de moeite waard om te vermelden dat deze veel-op-veel-relatie drie tabellen met elkaar verbindt. Het attributenpaar contact_person_id
en student_id
wordt gebruikt als alternatieve (UNIEKE) sleutel. Op die manier schakelen we dubbele vermeldingen uit die individuele studenten verbinden met dezelfde contactpersoon. Het kenmerk contact_person_type_id
maakt geen deel uit van de alternatieve sleutel. Als dat zo is, kunnen we meerdere relaties hebben voor dezelfde contactpersoon en dezelfde student (met verschillende soorten relaties), en dat heeft in het echte leven geen zin.
Het model dat in dit artikel wordt gepresenteerd, moet de meest voorkomende behoeften kunnen dekken. Toch kunnen in sommige gevallen delen van het model worden uitgesloten, b.v. we zouden waarschijnlijk niet het hele contactpersonensegment nodig hebben als onze studenten volwassen zijn. Zoals ik al eerder zei, zullen we hier op termijn verbeteringen aan toevoegen. Voel je vrij om suggesties toe te voegen en je ervaringen te delen in de discussiesecties.