Un investimento in conoscenza paga il miglior interesse.
Benjamin Franklin
Nel mondo moderno, l'istruzione è onnipresente. Ora più che mai, svolge un ruolo importante nella nostra società. È così importante, infatti, che molti di noi continuino la propria istruzione anche dopo aver terminato la scuola o l'università.
Tutti abbiamo sentito parlare di apprendimento permanente, educazione non formale e laboratori per tutte le età. Questi metodi differiscono in molti modi dall'istruzione formale, ma hanno anche cose in comune. Ci sono classi, lezioni, insegnanti e studenti. E proprio come in un ambiente tradizionale, vorremo tenere traccia del programma delle lezioni, dei dati sulle presenze e dei risultati dell'insegnante o degli studenti. Come possiamo progettare un database per soddisfare queste esigenze? Questo è ciò di cui parleremo in questo articolo.
Presentazione del nostro modello di database sull'istruzione
Il modello presentato in questo articolo ci consente di memorizzare dati su:
- lezioni/lezioni
- docenti/docenti
- studenti
- frequenza alle lezioni
- Risultati di studenti / docenti
Potremmo anche utilizzare questo modello come orario scolastico, per altre attività di gruppo (lezioni di nuoto, laboratori di danza) o anche per attività individuali come il tutoraggio. C'è ancora molto spazio per miglioramenti, come la memorizzazione dei dati sulla posizione della classe o la durata del workshop; li tratteremo nei prossimi articoli.
Iniziamo con i nostri elementi base del database Education:le tabelle.
I tre grandi:studenti, insegnanti e tabelle di classe
Lo student
, instructor
e class
le tabelle costituiscono il cuore del nostro database.
Lo student
la tabella, mostrata sopra, viene utilizzata per memorizzare i dati di base sugli studenti, ma può essere ampliata in base alle esigenze specifiche. Ad eccezione dei tre attributi di contatto, tutti gli attributi nella tabella sono obbligatori:
first_name
– il nome dello studentelast_name
– il cognome dello studentebirth_date
– la data di nascita dello studentecontact_phone
– il numero di telefono dello studentecontact_mobile
– il numero di cellulare dello studentecontact_mail
– l'indirizzo email dello studentecategory_id
– è un riferimento allacategory
Catalogare. Con questa struttura, siamo limitati a una sola categoria per studente. Funziona nella maggior parte dei casi, ma in alcune situazioni potrebbe essere necessario spazio per elencare più categorie. Come puoi vedere, aggiungendo una relazione molti-a-molti che collega lostudent
tabella con lacategory
dizionario risolve questo problema. In questo scenario, tuttavia, dovremo scrivere query piuttosto complesse per gestire i nostri dati.
Visto che ne abbiamo parlato, andiamo avanti e discutiamo della category
tabella qui.
Questa tabella è un dizionario utilizzato per raggruppare gli studenti in base a determinati criteri. Il first_name
l'attributo è l'unico dato nella tabella (oltre a id
, la chiave primaria) ed è obbligatorio. Un insieme di valori che possono essere memorizzati qui è lo stato occupazionale dello studente:"studente", "occupato", "disoccupato" e "pensionato". Potremmo anche utilizzare altri set in base ad alcuni criteri molto specifici, come "ama lo yoga", "ama l'escursionismo", "ama andare in bicicletta" e "non gli piace niente".
Il instructor
la tabella contiene l'elenco di tutti gli istruttori/docenti nell'organizzazione. Gli attributi nella tabella sono:
first_name
– il nome dell'istruttorelast_name
– il cognome dell'istruttoretitle
– il titolo dell'istruttore (se presente)birth_date
– la data di nascita dell'istruttorecontact_phone
– il numero di telefono dell'istruttorecontact_mobile
– il numero di cellulare dell'insegnantecontact_mail
– l'indirizzo email dell'insegnante
Il title
e tutti e tre i contact
gli attributi non sono obbligatori.
Lo student
tavolo e instructor
table condividono una struttura simile, ma c'è un'altra possibilità per organizzare queste informazioni. Un secondo approccio sarebbe quello di avere una person
tabella (che memorizza tutti i dati di dipendenti e studenti) e ha una relazione molti-a-molti che ci dice tutti i ruoli assegnati a quella persona. Il vantaggio più importante del secondo approccio è che memorizzeremo i dati solo una volta. Se qualcuno è un istruttore in una classe e uno studente in un'altra, apparirà solo una volta nel database, ma con entrambi i ruoli definiti.
Perché abbiamo selezionato l'approccio a due tabelle per il nostro modello di database educativo? In generale, studenti e docenti si comportano in modo diverso, sia nella vita reale che nel nostro database. Per questo motivo, potrebbe essere saggio archiviare i propri dati separatamente. Possiamo trovare altri modi per unire le informazioni sulla stessa persona che appaiono in entrambe le tabelle (ad es. coppia di query di inserimento/aggiornamento basate su un ID esterno, come un numero di previdenza sociale o una partita IVA).
La class
table è un catalogo che contiene dettagli su tutte le classi. Possiamo avere più istanze di ogni tipo di classe. Gli attributi nella tabella sono i seguenti (tutti obbligatori tranne end_date
):
class_type_id
– è un riferimento alclass_type
dizionario.first_name
– è un nome breve della classe.description
– questa descrizione è più specifica di quella nelclass_type
tabella.start_date
– la data di inizio del corso.end_date
– la data di fine della lezione. Non è obbligatorio perché potremmo non conoscere sempre in anticipo la data di fine esatta di ogni lezione.completed
– è un valore booleano che indica se tutte le attività di classe pianificate sono terminate. Questo è utile quando abbiamo raggiunto ilend_time
pianificato per una classe ma altre attività della classe devono ancora essere completate.
Il class_type
table è un semplice catalogo, destinato a memorizzare le informazioni di base sulle lezioni o lezioni offerte agli studenti. Potrebbe contenere valori come "Lingua inglese (gruppo)", "Lingua polacca (gruppo)", "Lingua croata (gruppo)", "Lingua inglese (di persona)" o "Lezioni di ballo". Ha solo due attributi obbligatori:name
e description
, entrambi non necessitano di ulteriori spiegazioni.
Il class_schedule
la tabella contiene orari specifici per lezioni e lezioni. Tutti gli attributi nella tabella sono obbligatori. Il class_id
l'attributo è un riferimento alla class
tabella, mentre start_time
e end_time
sono gli orari di inizio e fine di quella specifica lezione.
Chi c'è qui? Tavoli relativi alle presenze
Il attend
la tabella memorizza le informazioni su quale studente ha frequentato quale classe e il risultato finale. Gli attributi nella tabella sono:
student_id
– è un riferimento allostudent
tabellaclass_id
– è un riferimento allaclass
tabellaclass_enrollment_date
– è la data in cui lo studente ha iniziato a frequentare quel corsoclass_drop_date
– la data in cui lo studente ha lasciato la classe. Questo attributo avrà valore solo se lo studente ha abbandonato la lezione prima della data di fine della lezione. In tal caso, ildrop_class_reason_id
anche il valore dell'attributo deve essere impostato.drop_class_reason_id
– è un riferimento aldrop_class_reason
tabellaattendance_outcome_id
– è un riferimento alattendance_outcome
tabella
Tutti i dati tranne class_drop_date
e drop_class_reason_id
è obbligatorio. Questi due verranno riempiti se e solo se uno studente abbandona la classe.
Il drop_attendance_reason
table è un dizionario che contiene i vari motivi per cui uno studente potrebbe abbandonare un corso. Ha un solo attributo, reason_text
, ed è obbligatorio. Un esempio di insieme di valori potrebbe includere:"malattia", "interesse perso", "non ha abbastanza tempo" e "altri motivi".
Il attendance_outcome
la tabella contiene le descrizioni dell'attività degli studenti in un determinato corso. Il outcome_text
è l'unico attributo nella tabella ed è obbligatorio. Un insieme di valori possibili è:"in corso", "completato con successo", "completato parzialmente" e "classe non completata".
Chi comanda? Tabelle relative alla didattica
Il teach
, drop_teach_reason
e teach_outcome
le tabelle utilizzano la stessa logica di attend
, drop_attendance_reason
e attendance_outcome
tavoli. Tutte queste tabelle memorizzano i dati sulle attività relative al corso degli istruttori.
Il teach
La tabella viene utilizzata per memorizzare informazioni su quale istruttore sta insegnando a quale classe. Gli attributi nella tabella sono:
instructor_id
– è un riferimento alinstructor
tabella.class_id
– è un riferimento allaclass
tabella.start_date
– è la data in cui l'insegnante ha iniziato a lavorare su quella classe.end_date
– è la data in cui l'istruttore ha smesso di lavorare su quella classe. Non è obbligatorio perché non possiamo sapere in anticipo se l'insegnante insegnerà fino alla data di fine della lezione.drop_teach_reason_id
– è un riferimento aldrop_teach_reason
tavolo. Non è obbligatorio perché l'insegnante non può abbandonare il corso.teach_outcome_id
– è un riferimento alteach_outcome_reason
tabella.
Il drop_teach_reason
table è un semplice dizionario. Contiene una serie di possibili spiegazioni del motivo per cui l'istruttore ha terminato l'insegnamento prima della data di fine. C'è un solo attributo obbligatorio:reason_text
. Potrebbe trattarsi di "malattia", "trasferito a un altro progetto/lavoro", "abbandono" o "altro motivo".
Il teach_outcome
la tabella descrive il successo dell'istruttore in un particolare corso. Il outcome_text
è l'unico attributo della tabella ed è obbligatorio. Possibili valori per questa tabella potrebbero essere:"in corso", "completato con successo", "completato parzialmente" e "non ha completato la lezione di insegnamento".
La student_presence
La tabella viene utilizzata per memorizzare i dati sulla presenza degli studenti per una lezione specifica. Si può presumere che per ogni lezione il docente annoti la presenza e/o l'assenza per tutti gli studenti. Gli attributi nella tabella sono:
student_id
– è un riferimento allostudent
tabellaclass_schedule_id
– è un riferimento alclass_schedule
tabellapresent
– è un contrassegno booleano indipendentemente dal fatto che lo studente sia presente o meno a lezione
Potremmo monitorare la presenza degli studenti in una classe specifica con una query come quella che segue (supponendo che @id_class contenga l'ID classe che vogliamo).
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_outcome FROM ( 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_outcome FROM class INNER JOIN attend ON class.id = attend.class_id INNER JOIN student ON attend.student_id = student.id LEFT JOIN class_schedule ON class_schedule.class_id = class.id LEFT JOIN student_presence ON student_presence.student_id = student.id AND student_presence.class_schedule_id = class_schedule.id LEFT JOIN attendance_outcome ON attendance_outcome.id = attend.attendance_outcome_id WHERE class.id = @id_class GROUP BY student.id, student.first_name, student.last_name, attendance_outcome.outcome_text ) a
La tabella “instructor_presence” utilizza la stessa logica della tabella “student_presence”, ma qui vogliamo concentrarci sugli istruttori. Gli attributi nella tabella sono:
instructor_id
– è un riferimento alinstructor
tabellaclass_schedule_id
– è un riferimento alclass_schedule
tabellapresent
– è un valore booleano che rappresenta se l'insegnante è presente a lezione o meno
Potremmo utilizzare la query seguente per monitorare l'attività dell'insegnante in classe:
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_outcome FROM ( 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_outcome FROM 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 = class.id LEFT JOIN instructor_presence ON instructor_presence.instructor_id = instructor.id AND instructor_presence.class_schedule_id = class_schedule.id LEFT JOIN teach_outcome ON teach_outcome.id = teach.teach_outcome_id WHERE class.id = @id_class GROUP BY instructor.id, instructor.first_name, instructor.last_name, teach_outcome.outcome_text ) a
Ora, concludiamo discutendo le tabelle dei referenti.
Chi possiamo chiamare? Tabelle dei referenti
Nella maggior parte dei casi, non è necessario memorizzare le informazioni di contatto di emergenza (ad esempio, in caso di emergenza, contattare questa persona). Tuttavia, questo cambia quando insegniamo ai bambini. Per legge o per consuetudine, dobbiamo avere un referente per ogni bambino a cui insegniamo. Nelle nostre tabelle modello – contact_person
, contact_person_type
e contact_person_student
– dimostriamo come è possibile farlo.
Il contact_person
la tabella è un elenco di persone che sono legate agli studenti. Naturalmente, non è necessario elencare tutti i parenti; per lo più avremo uno o due contatti per studente. Questo è un buon modo per trovare "chi chiamerai" quando lo studente ha bisogno o vuole partire presto. Gli attributi nella tabella sono:
first_name
– è il nome della persona di contattolast_name
– è il cognome della personacontact_phone
– è il numero di telefono della personacontact_mobile
– è il numero di cellulare della personacontact_mail
– è l'indirizzo email della persona
I recapiti non sono obbligatori, sebbene siano molto utili.
Il contact_person_type
table è un dizionario con un unico attributo obbligatorio:type_name
. Esempi di valori memorizzati in questa tabella sono:"madre", "padre", "fratello", "sorella" o "zio".
Il contact_person_student
table è una relazione molti-a-molti che collega le persone di contatto e il loro tipo con gli studenti. Gli attributi nella tabella sono (tutti obbligatori):
contact_person_id
– è un riferimento alcontact_person
tabellastudent_id
– è un riferimento allostudent
tabellacontact_person_type_id
– è un riferimento alcontact_person_type
tabella
Vale la pena ricordare che questa relazione molti-a-molti collega tre tabelle insieme. La coppia di attributi contact_person_id
e student_id
viene utilizzato come chiave alternativa (UNICA). In questo modo, disabiliteremo le voci duplicate che collegano i singoli studenti con la stessa persona di contatto. L'attributo contact_person_type_id
non fa parte della chiave alternativa. Se è così, potremmo avere più relazioni per la stessa persona di contatto e lo stesso studente (usando diversi tipi di relazione), e questo non ha senso nelle situazioni della vita reale.
Il modello presentato in questo articolo dovrebbe essere in grado di coprire le esigenze più comuni. Tuttavia, parti del modello potrebbero essere escluse in alcuni casi, ad es. probabilmente non avremmo bisogno dell'intero segmento delle persone di contatto se i nostri studenti fossero adulti. Come ho detto prima, aggiungeremo miglioramenti a questo in tempo. Sentiti libero di aggiungere suggerimenti e condividere la tua esperienza nelle sezioni di discussione.