En investering i kunskap ger bäst ränta.
Benjamin Franklin
I den moderna världen är utbildning allestädes närvarande. Nu mer än någonsin tidigare spelar den en viktig roll i vårt samhälle. Det är faktiskt så viktigt att många av oss fortsätter vår utbildning väl efter att ha avslutat skolan eller college.
Vi har alla hört talas om livslångt lärande, icke-formell utbildning och workshops för alla åldrar. Dessa metoder skiljer sig från formell utbildning på många sätt, men de har också saker gemensamt. Det finns klasser, lektioner, lärare och elever. Och precis som i en traditionell miljö vill vi hålla reda på klassschemat, närvarodata och instruktörens eller elevernas prestationer. Hur kan vi designa en databas för att möta dessa behov? Det är vad vi kommer att ta upp i den här artikeln.
Vi presenterar vår utbildningsdatabasmodell
Modellen som presenteras i den här artikeln gör det möjligt för oss att lagra data om:
- klasser/föreläsningar
- instruktörer/föreläsare
- studenter
- föreläsningsnärvaro
- studenternas/föreläsarnas prestationer
Vi skulle också kunna använda den här modellen som ett schema för skolan, för andra gruppaktiviteter (simlektioner, dansverkstäder) eller till och med för en-mot-en-aktiviteter som handledning. Det finns fortfarande mycket utrymme för förbättringar, som att lagra klassplatsdata eller workshopens varaktighet; vi kommer att täcka dessa i kommande artiklar.
Låt oss komma igång med våra grundläggande utbildningsdatabaselement:tabellerna.
De tre stora:elev-, instruktörs- och klassbord
student
, instructor
och class
tabeller utgör kärnan i vår databas.
student
Tabellen, som visas ovan, används för att lagra grundläggande data om elever, men den kan utökas efter specifika behov. Med undantag för de tre kontaktattributen krävs alla attribut i tabellen:
first_name
– elevens namnlast_name
– elevens efternamnbirth_date
– elevens födelsedatumcontact_phone
– elevens telefonnummercontact_mobile
– elevens mobiltelefonnummercontact_mail
– elevens e-postadresscategory_id
– är en referens tillcategory
katalog. Med den här strukturen är vi begränsade till endast en kategori per elev. Det fungerar i de flesta fall, men i vissa situationer kan vi behöva utrymme för att lista flera kategorier. Som du kan se lägger du till en många-till-många-relation som förbinderstudent
tabell medcategory
ordbok löser detta problem. I det här scenariot måste vi dock skriva mer komplexa frågor för att hantera vår data.
Eftersom vi har nämnt det, låt oss gå vidare och diskutera category
tabell här.
Den här tabellen är en ordbok som används för att gruppera elever utifrån vissa kriterier. name
attribut är den enda informationen i tabellen (förutom id
, primärnyckeln) och det är obligatoriskt. En uppsättning värden som skulle kunna lagras här är studentens anställningsstatus:"student", "anställd", "arbetslös" och "pensionerad". Vi skulle också kunna använda andra uppsättningar baserat på några mycket specifika kriterier, som "gillar yoga", "gillar att vandra", "gillar att cykla" och "tycker inte om någonting".
instructor
Tabellen innehåller en lista över alla instruktörer/föreläsare i organisationen. Attributen i tabellen är:
first_name
– instruktörens namnlast_name
– instruktörens efternamntitle
– instruktörens titel (om någon)birth_date
– instruktörens födelsedatumcontact_phone
– instruktörens telefonnummercontact_mobile
– instruktörens mobiltelefonnummercontact_mail
– instruktörens e-postadress
title
och alla tre contact
attribut är inte obligatoriska.
student
tabell och instructor
tabell delar en liknande struktur, men det finns en annan möjlighet att organisera denna information. Ett andra tillvägagångssätt skulle vara att ha en person
tabell (som lagrar all personal- och studentdata) och har en många-till-många-relation som talar om för oss alla roller som tilldelats den personen. Den viktigaste fördelen med det andra tillvägagångssättet är att vi bara lagrar data en gång. Om någon är lärare i en klass och elev i en annan, visas de bara en gång i databasen, men med båda rollerna definierade.
Varför valde vi tvåtabellsmetoden för vår utbildningsdatabasmodell? Generellt sett beter sig studenter och instruktörer olika, både i verkligheten och i vår databas. På grund av det kan det vara klokt att lagra deras data separat. Vi kan hitta andra sätt att slå samman informationen om samma person som visas i båda tabellerna (t.ex. ett par infoga/uppdateringsfrågor baserat på ett externt ID, till exempel ett personnummer eller VAT-nummer).
class
table är en katalog som innehåller information om alla klasser. Vi kan ha flera instanser av varje klasstyp. Attributen i tabellen är följande (alla är obligatoriska utom end_date
). ):
class_type_id
– är en referens tillclass_type
ordbok.name
– är ett kort namn på klassen.description
– den här beskrivningen är mer specifik än den iclass_type
tabell.start_date
– klassens startdatum.end_date
– slutdatumet för klassen. Det är inte obligatoriskt eftersom vi kanske inte alltid vet det exakta slutdatumet för varje klass i förväg.completed
– är ett booleskt värde som anger om alla planerade klassaktiviteter är avslutade. Detta är praktiskt när vi har nått den planeradeend_time
för en klass men andra klassaktiviteter har ännu inte slutförts.
class_type
table är en enkel katalog, avsedd att lagra grundläggande information om föreläsningar eller klasser som erbjuds studenter. Det kan innehålla värden som "engelska språket (grupp)", "polska språket (grupp)", "kroatiska språket (grupp)", "engelska språket (personligt)" eller "danslektioner". Den har bara två obligatoriska attribut – name
och description
, båda behöver ingen ytterligare förklaring.
class_schedule
Tabellen innehåller specifika tider för föreläsningar och klasser. Alla attribut i tabellen är obligatoriska. class_id
attribut är en referens till class
tabell, medan start_time
och end_time
är start- och sluttiderna för den specifika föreläsningen.
Vem är här? Närvarorelaterade tabeller
attend
Tabellen lagrar information om vilken elev som deltog i vilken klass och det slutliga resultatet. Attributen i tabellen är:
student_id
– är en referens tillstudent
tabellclass_id
– är en referens tillclass
tabellclass_enrollment_date
– är det datum då eleven började gå den klassenclass_drop_date
– det datum då eleven slutade klassen. Det här attributet ska endast ha ett värde om eleven hoppade av klassen före klassens slutdatum. I så fall,drop_class_reason_id
attributvärdet måste också anges.drop_class_reason_id
– är en referens tilldrop_class_reason
tabellattendance_outcome_id
– är en referens tillattendance_outcome
tabell
All data utom class_drop_date
och drop_class_reason_id
krävs. Dessa två kommer att fyllas i om och endast om en elev hoppar av klassen.
drop_attendance_reason
tabellen är en ordbok som innehåller de olika anledningarna till varför en student kan hoppa av en kurs. Den har bara ett attribut, reason_text
, och det är obligatoriskt. Ett exempel på värden kan vara:"sjukdom", "tappat intresse", "har inte tillräckligt med tid" och "andra orsaker".
attendance_outcome
Tabellen innehåller beskrivningar av studentaktivitet i en viss kurs. outcome_text
är det enda attributet i tabellen och det är obligatoriskt. En uppsättning möjliga värden är:"pågår", "slutfört framgångsrikt", "avslutat delvis" och "har inte slutfört klassen".
Vem bestämmer? Undervisningsrelaterade tabeller
teach
, drop_teach_reason
och teach_outcome
tabeller använder samma logik som attend
, drop_attendance_reason
och attendance_outcome
tabeller. Alla dessa tabeller lagrar data om lärares kursrelaterade aktiviteter.
teach
Tabell används för att lagra information om vilken lärare som undervisar i vilken klass. Attributen i tabellen är:
instructor_id
– är en referens tillinstructor
tabell.class_id
– är en referens tillclass
tabell.start_date
– är det datum då instruktören började arbeta på den klassen.end_date
– är det datum då instruktören slutade arbeta på den klassen. Det är inte obligatoriskt eftersom vi inte kan veta i förväg om instruktören kommer att undervisa till klassens slutdatum.drop_teach_reason_id
– är en referens tilldrop_teach_reason
tabell. Det är inte obligatoriskt eftersom instruktören kanske inte hoppar av klassen.teach_outcome_id
– är en referens tillteach_outcome_reason
tabell.
drop_teach_reason
tabellen är en enkel ordbok. Den innehåller en uppsättning möjliga förklaringar till varför instruktören avslutade undervisningen före slutdatumet. Det finns bara ett obligatoriskt attribut:reason_text
. Detta kan vara "sjukdom", "flyttad till annat projekt/jobb", "sluta" eller "annan anledning".
teach_outcome
Tabellen beskriver instruktörens framgång på en viss kurs. outcome_text
är tabellens enda attribut och det är obligatoriskt. Möjliga värden för den här tabellen kan vara:"pågår", "slutfört framgångsrikt", "avslutat delvis" och "har inte slutfört undervisningsklassen".
student_presence
Tabell används för att lagra data om studentnärvaro för en specifik föreläsning. Vi kan anta att läraren för varje föreläsning noterar närvaro och/eller frånvaro för alla studenter. Attributen i tabellen är:
student_id
– är en referens tillstudent
tabellclass_schedule_id
– är en referens tillclass_schedule
tabellpresent
– är en boolesk markering om studenten är närvarande på föreläsningen eller inte
Vi skulle kunna övervaka elevernas närvaro i en specifik klass med en fråga som den som följer (förutsatt att @id_class innehåller det klass-id vi vill ha).
SELECT a.id, CONCAT(a.first_name, ' ', a.efter_name) AS student_name, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') AS procent, 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, attendance_outcome.outcome_text AS attendance_outcomeFROM class INNER JOIN attend ON class.id =attend.class_id INNER JOIN student ON attend.student_id =student.id VÄNSTER JOIN class_schedule PÅ class_schedule.class_id =student_presenceIN ON =student_presenceIN .id OCH student_presence.class_schedule_id =class_schedule.id VÄNSTER JOIN attendance_outcome ON attendance_outcome.id =attend.attendance_outcome_idWHERE class.id =@id_classGROUP BY student.id, student.first_name, student.come_outcome, attendanceout_outcome.
Tabellen "instructor_närvaro" använder samma logik som tabellen "student_närvaro", men här vill vi fokusera på instruktörerna. Attributen i tabellen är:
instructor_id
– är en referens tillinstructor
tabellclass_schedule_id
– är en referens tillclass_schedule
tabellpresent
– är ett booleskt värde som representerar om läraren är närvarande på föreläsningen eller inte
Vi kan använda frågan nedan för att övervaka instruktörens aktivitet i klassen:
SELECT a.id, CONCAT(a.first_name, ' ', a.efter_name) AS instructor_name, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') SOM procent, 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 antal_total, teach_outcome.outcome_text AS teach_outcomeFROM class INNER JOIN teach ON class.id =teach.class_id INNER JOIN instructor ON teach.instructor_id =instructor.id LEFT JOIN class_schedule ON class_schedule.class_id =JO_preference instructorinstruct. .id OCH instructor_presence.class_schedule_id =class_schedule.id VÄNSTER JOIN teach_outcome PÅ teach_outcome.id =teach.teach_outcome_idWHERE class.id =@id_classGROUP BY instructor.id, instructor.first_name, instructor.com_last_name, instructor.com_lastNu, låt oss avsluta med att diskutera kontaktpersonstabellerna.
Vem kan vi ringa? Kontaktpersonstabeller
I de flesta fall behöver vi inte lagra kontaktinformation för nödsituationer (dvs. kontakta den här personen i händelse av en nödsituation). Men detta förändras när vi undervisar barn. Enligt lag eller sedvänja måste vi ha en kontaktperson för varje barn vi undervisar. I våra modelltabeller –
contact_person
,contact_person_type
ochcontact_person_student
– vi visar hur detta kan göras.
contact_person
tabellen är en lista över personer som är relaterade till studenter. Naturligtvis behöver vi inte lista alla släktingar; oftast kommer vi att ha en eller två kontakter per elev. Det här är ett bra sätt att hitta "vem du ska ringa" när eleven behöver eller vill gå tidigt. Attributen i tabellen är:
first_name
– är kontaktpersonens namnlast_name
– är personens efternamncontact_phone
– är personens telefonnummercontact_mobile
– är personens mobiltelefonnummercontact_mail
– är personens e-postadress
Kontaktuppgifter är inte obligatoriska, även om de är mycket användbara.
contact_person_type
table är en ordbok med ett enda, obligatoriskt attribut:type_name
. Exempel på värden som lagras i denna tabell är:"mamma", "far", "bror", "syster" eller "farbror".
contact_person_student
tabell är en många-till-många-relation som förbinder kontaktpersoner och deras typ med studenter. Attributen i tabellen är (alla är obligatoriska):
contact_person_id
– är en referens tillcontact_person
tabellstudent_id
– är en referens tillstudent
tabellcontact_person_type_id
– är en referens tillcontact_person_type
tabell
Det kan vara värt att nämna att denna många-till-många-relation kopplar samman tre tabeller. Attributparet contact_person_id
och student_id
används som alternativ (UNIK) tangent. På så sätt inaktiverar vi dubbletter av poster som förbinder enskilda elever med samma kontaktperson. Attributet contact_person_type_id
är inte en del av den alternativa nyckeln. Om så är fallet skulle vi kunna ha flera relationer för samma kontaktperson och samma student (med olika typer av relationer), och det är ingen mening i verkliga situationer.
Modellen som presenteras i denna artikel bör kunna täcka de flesta vanliga behov. Ändå skulle delar av modellen kunna uteslutas i vissa fall, t.ex. vi skulle förmodligen inte behöva hela kontaktpersonssegmentet om våra elever är vuxna. Som jag sa tidigare kommer vi att lägga till förbättringar till detta med tiden. Lägg gärna till förslag och dela dina erfarenheter i diskussionssektionerna.