Un investissement dans la connaissance rapporte le meilleur intérêt.
Benjamin Franklin
Dans le monde moderne, l'éducation est omniprésente. Aujourd'hui plus que jamais, elle joue un rôle important dans notre société. C'est tellement important, en fait, que beaucoup d'entre nous poursuivent leurs études bien après avoir terminé leurs études ou leurs études collégiales.
Nous avons tous entendu parler de l'apprentissage tout au long de la vie, de l'éducation non formelle et des ateliers pour tous les âges. Ces méthodes diffèrent de l'éducation formelle à bien des égards, mais elles ont aussi des points communs. Il y a des classes, des leçons, des professeurs et des étudiants. Et tout comme dans un cadre traditionnel, nous voudrons suivre l'horaire des cours, les données de présence et les résultats des instructeurs ou des élèves. Comment concevoir une base de données pour répondre à ces besoins ? C'est ce que nous allons couvrir dans cet article.
Présentation de notre modèle de base de données sur l'éducation
Le modèle présenté dans cet article nous permet de stocker des données sur :
- cours/conférences
- instructeurs/conférenciers
- étudiants
- participation aux conférences
- réussite des étudiants/enseignants
Nous pourrions également utiliser ce modèle comme emploi du temps scolaire, pour d'autres activités de groupe (cours de natation, ateliers de danse) ou même pour des activités individuelles comme le tutorat. Il reste encore beaucoup de place pour des améliorations, telles que le stockage des données de localisation des cours ou la durée des ateliers ; nous les couvrirons dans les prochains articles.
Commençons par les éléments de base de notre base de données Education :les tables.
Les trois grands :tableaux des étudiants, des enseignants et des classes
L'student
, instructor
, et class
les tables constituent le cœur de notre base de données.
L'student
La table ci-dessus est utilisée pour stocker des données de base sur les étudiants, mais elle peut être étendue en fonction de besoins spécifiques. À l'exception des trois attributs de contact, tous les attributs du tableau sont obligatoires :
first_name
– le nom de l'élèvelast_name
– le nom de famille de l'élèvebirth_date
– la date de naissance de l'élèvecontact_phone
– le numéro de téléphone de l'élèvecontact_mobile
– le numéro de téléphone portable de l'élèvecontact_mail
– l'adresse e-mail de l'étudiantcategory_id
– est une référence à lacategory
catalogue. Avec cette structure, nous sommes limités à une seule catégorie par étudiant. Cela fonctionne dans la plupart des cas, mais dans certaines situations, nous pouvons avoir besoin d'espace pour répertorier plusieurs catégories. Comme vous pouvez le voir, l'ajout d'une relation plusieurs-à-plusieurs qui relie lestudent
tableau avec lacategory
dictionnaire résout ce problème. Dans ce scénario, cependant, nous devrons écrire des requêtes plus complexes pour gérer nos données.
Puisque nous l'avons mentionné, allons-y et discutons de la category
tableau ici.
Ce tableau est un dictionnaire utilisé pour regrouper les élèves en fonction de certains critères. Le name
l'attribut est la seule donnée de la table (en plus de id
, la clé primaire) et c'est obligatoire. Un ensemble de valeurs pouvant être stockées ici est le statut d'emploi de l'étudiant :« étudiant », « employé », « sans emploi » et « retraité ». Nous pourrions également utiliser d'autres ensembles basés sur des critères très spécifiques, tels que « aime le yoga », « aime la randonnée », « aime le vélo » et « n'aime rien ».
Le instructor
le tableau contient la liste de tous les instructeurs/conférenciers de l'organisation. Les attributs du tableau sont :
first_name
– le nom de l'instructeurlast_name
– le nom de famille de l'instructeurtitle
– le titre de l'instructeur (le cas échéant)birth_date
– la date de naissance du moniteurcontact_phone
– le numéro de téléphone du moniteurcontact_mobile
– le numéro de téléphone portable du moniteurcontact_mail
– l'adresse e-mail de l'instructeur
Le title
et les trois contact
les attributs ne sont pas obligatoires.
L'student
table et instructor
table partagent une structure similaire, mais il existe une autre possibilité pour organiser ces informations. Une deuxième approche serait d'avoir une person
table (qui stocke toutes les données des employés et des étudiants) et a une relation plusieurs à plusieurs qui nous indique tous les rôles attribués à cette personne. L'avantage le plus important de la deuxième approche est que nous ne stockerons les données qu'une seule fois. Si quelqu'un est instructeur dans une classe et étudiant dans une autre, il n'apparaîtra qu'une seule fois dans la base de données, mais avec les deux rôles définis.
Pourquoi avons-nous choisi l'approche à deux tables pour notre modèle de base de données pédagogique ? Généralement, les étudiants et les instructeurs se comportent différemment, à la fois dans la vraie vie et dans notre base de données. Pour cette raison, il pourrait être judicieux de stocker leurs données séparément. Nous pouvons trouver d'autres moyens de fusionner les informations d'une même personne qui apparaissent dans les deux tableaux (par exemple, une paire de requêtes d'insertion/mise à jour basées sur un identifiant externe, tel qu'un numéro de sécurité sociale ou un numéro de TVA).
La class
table est un catalogue qui contient des détails sur toutes les classes. Nous pouvons avoir plusieurs instances de chaque type de classe. Les attributs du tableau sont les suivants (tous sont obligatoires sauf end_date
):
class_type_id
– est une référence auclass_type
dictionnaire.name
– est un nom abrégé de la classe.description
– cette description est plus précise que celle duclass_type
tableau.start_date
– la date de début du cours.end_date
– la date de fin du cours. Ce n'est pas obligatoire car nous ne connaissons pas toujours à l'avance la date de fin exacte de chaque cours.completed
– est une valeur booléenne qui indique si toutes les activités de classe planifiées sont terminées. C'est pratique lorsque nous avons atteint leend_time
prévu pour une classe, mais d'autres activités de classe doivent encore être terminées.
Le class_type
table est un simple catalogue, destiné à stocker des informations de base sur les conférences ou les cours proposés aux étudiants. Il peut contenir des valeurs telles que "Langue anglaise (groupe)", "Langue polonaise (groupe)", "Langue croate (groupe)", "Langue anglaise (en personne)" ou "Cours de danse". Il n'a que deux attributs obligatoires - name
et description
, qui n'ont pas besoin d'explications supplémentaires.
Le class_schedule
le tableau contient des horaires spécifiques pour les conférences et les cours. Tous les attributs du tableau sont obligatoires. Le class_id
l'attribut est une référence à la class
table, tandis que start_time
et end_time
sont les heures de début et de fin de cette session spécifique.
Qui est là ? Tableaux relatifs aux présences
Le attend
La table stocke des informations concernant quel élève a assisté à quelle classe et le résultat final. Les attributs du tableau sont :
student_id
– est une référence austudent
tableauclass_id
– est une référence à laclass
tableauclass_enrollment_date
– est la date à laquelle l'élève a commencé à assister à ce coursclass_drop_date
– la date à laquelle l'élève a quitté la classe. Cet attribut n'aura de valeur que si l'élève a abandonné le cours avant la date de fin du cours. Dans ce cas, ledrop_class_reason_id
la valeur de l'attribut doit également être définie.drop_class_reason_id
– est une référence audrop_class_reason
tableauattendance_outcome_id
– est une référence auattendance_outcome
tableau
Toutes les données sauf class_drop_date
et drop_class_reason_id
est requis. Ces deux seront pourvus si et seulement si un élève abandonne le cours.
Le drop_attendance_reason
table est un dictionnaire contenant les différentes raisons pour lesquelles un étudiant peut abandonner un cours. Il n'a qu'un seul attribut, reason_text
, et c'est obligatoire. Un exemple d'ensemble de valeurs pourrait inclure :"maladie", "perte d'intérêt", "n'a pas assez de temps" et "autres raisons".
Le attendance_outcome
Le tableau contient des descriptions de l'activité des étudiants dans un cours donné. Le outcome_text
est le seul attribut de la table et il est obligatoire. Un ensemble de valeurs possibles est :"en cours", "complété avec succès", "complété partiellement" et "n'a pas terminé la classe".
Qui est responsable ? Tableaux liés à l'enseignement
Le teach
, drop_teach_reason
et teach_outcome
les tables utilisent la même logique que le attend
, drop_attendance_reason
et attendance_outcome
les tables. Toutes ces tables stockent des données sur les activités liées aux cours des instructeurs.
Le teach
table est utilisée pour stocker des informations sur quel instructeur enseigne quelle classe. Les attributs du tableau sont :
instructor_id
– est une référence auinstructor
tableau.class_id
– est une référence à laclass
tableau.start_date
– est la date à laquelle l'instructeur a commencé à travailler sur ce cours.end_date
– est la date à laquelle l'instructeur a cessé de travailler sur cette classe. Ce n'est pas obligatoire car nous ne pouvons pas savoir à l'avance si l'instructeur enseignera jusqu'à la date de fin du cours.drop_teach_reason_id
– est une référence audrop_teach_reason
table. Ce n'est pas obligatoire car l'instructeur ne peut pas abandonner le cours.teach_outcome_id
– est une référence auteach_outcome_reason
tableau.
Le drop_teach_reason
table est un simple dictionnaire. Il contient un ensemble d'explications possibles pour lesquelles l'instructeur a terminé l'enseignement du cours avant sa date de fin. Il n'y a qu'un seul attribut obligatoire :reason_text
. Cela peut être « maladie », « passé à un autre projet/emploi », « démissionner » ou « autre raison ».
Le teach_outcome
tableau décrit le succès de l'instructeur sur un cours particulier. Le outcome_text
est le seul attribut de la table et il est obligatoire. Les valeurs possibles pour ce tableau pourraient être :"en cours", "réalisé avec succès", "réalisé partiellement" et "n'a pas terminé la classe d'enseignement".
La student_presence
La table est utilisée pour stocker des données sur la présence des étudiants pour une session spécifique. Nous pouvons supposer que pour chaque conférence, l'instructeur notera la présence et/ou l'absence de tous les étudiants. Les attributs du tableau sont :
student_id
– est une référence austudent
tableauclass_schedule_id
– est une référence auclass_schedule
tableaupresent
– est un marquage booléen indiquant si l'étudiant est présent ou non en cours
Nous pourrions surveiller la présence des étudiants dans une classe spécifique avec une requête comme celle qui suit (en supposant que @id_class contient l'identifiant de classe que nous voulons).
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 table "instructor_presence" utilise la même logique que la table "student_presence", mais ici nous voulons nous concentrer sur les instructeurs. Les attributs du tableau sont :
instructor_id
– est une référence auinstructor
tableauclass_schedule_id
– est une référence auclass_schedule
tableaupresent
– est une valeur booléenne indiquant si l'instructeur est présent ou non en cours
Nous pourrions utiliser la requête ci-dessous pour surveiller l'activité de l'instructeur en 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
Terminons maintenant en abordant les tableaux des personnes de contact.
Qui pouvons-nous appeler ? Tableaux des personnes à contacter
Dans la plupart des cas, nous n'avons pas besoin de stocker les informations de contact d'urgence (c'est-à-dire qu'en cas d'urgence, contactez cette personne). Cependant, cela change lorsque nous enseignons aux enfants. Selon la loi ou la coutume, nous devons avoir une personne de contact pour chaque enfant que nous enseignons. Dans nos tableaux modèles – contact_person
, contact_person_type
et contact_person_student
– nous montrons comment cela peut être fait.
Le contact_person
table est la liste des personnes liées aux étudiants. Bien sûr, nous n'avons pas besoin d'énumérer tous les parents; la plupart du temps, nous aurons un ou deux contacts par étudiant. C'est un bon moyen de trouver « qui vous allez appeler » lorsque l'étudiant doit ou veut partir plus tôt. Les attributs du tableau sont :
first_name
– est le nom de la personne à contacterlast_name
– est le nom de famille de la personnecontact_phone
– est le numéro de téléphone de la personnecontact_mobile
– est le numéro de téléphone portable de la personnecontact_mail
– est l'adresse e-mail de la personne
Les coordonnées ne sont pas obligatoires, bien qu'elles soient très utiles.
Le contact_person_type
table est un dictionnaire avec un seul attribut obligatoire :type_name
. Des exemples de valeurs stockées dans cette table sont :"mère", "père", "frère", "sœur" ou "oncle".
Le contact_person_student
table est une relation plusieurs-à-plusieurs qui relie les personnes de contact et leur type aux étudiants. Les attributs du tableau sont (tous sont obligatoires) :
contact_person_id
– est une référence aucontact_person
tableaustudent_id
– est une référence austudent
tableaucontact_person_type_id
– est une référence aucontact_person_type
tableau
Il peut être utile de mentionner que cette relation plusieurs-à-plusieurs relie trois tables ensemble. La paire d'attributs contact_person_id
et student_id
est utilisée comme clé alternative (UNIQUE). De cette façon, nous désactiverons les entrées en double qui relient des étudiants individuels à la même personne de contact. L'attribut contact_person_type_id
ne fait pas partie de la clé alternative. Si tel est le cas, nous pourrions avoir plusieurs relations pour la même personne de contact et le même élève (en utilisant différents types de relations), ce qui n'a aucun sens dans des situations réelles.
Le modèle présenté dans cet article devrait pouvoir couvrir les besoins les plus courants. Néanmoins, des parties du modèle pourraient être exclues dans certains cas, par ex. nous n'aurions probablement pas besoin de tout le segment des personnes-ressources si nos élèves sont des adultes. Comme je l'ai déjà dit, nous y ajouterons des améliorations en temps voulu. N'hésitez pas à ajouter des suggestions et à partager votre expérience dans les sections de discussion.