Le système d’éducation supérieure dans le monde a beaucoup évolué dans les dernières décennies à cause de plusieurs facteurs, notamment l’ouverture à l’international et les développements en technologie.
Dans le monde d’aujourd’hui, les établissements d’enseignement supérieur s’ouvrent de plus en plus à d’autres pays à travers des programmes d’échanges académiques et des projets en collaboration.
De plus, la technologie est de plus en plus présente dans l’éducation. Grâce à Internet, ils existent aujourd’hui des opportunités d’éducation en ligne, ce qui a donné naissance à des plateformes d’enseignement offrant des programmes diplômant.
Par conséquent, il a fallu développer des systèmes communs d’évaluation de compétences académiques. La solution adoptée par la majorités des établissements d’enseignement supérieur est le crédit académique qui est une unité de mesure de compétences obtenues liée au nombres d’heures passées pour acquérir ces compétences.
Ce système a permit les écoles et les universités de donner plus de libertés aux étudiants dans leurs parcours académiques.
Bien que ce système soit plus libre et démocratique, il est certainement plus complexe à mettre en place et nécessite un modèle bien défini.
Ce projet vise donc à modéliser une base de données relationnelles pour un établissement d’éducation supérieur libre, la base de données conçue est utilisable par un établissement scolaire réel ou une plateforme d’éducation complète. Ce modèle n’existe pas encore, mais s’inspire beaucoup du système existant adopté dans beaucoup de pays.
La philosophie principale de l’établissement est la liberté de l’éducation; dans le sens où les étudiants ont la possibilité de choisir leurs matières en toute liberté. L’établissement offre des formations en domaines différents (sciences de la nature et sciences sociales/humaines). La question qui se pose donc : comment obtenir un diplôme?
Les règles suivantes répondent à cette question :
Trimestre : Cette entité correspond à une période scolaire identifiée par une clé composée de 2 attributs : année + période. La période est l’une des trois : l’automne, le prinstemps ou l’été, il est possible d’associer une valeur numérique où un code à chaque période afin de minimiser la taille de stockage. Un trimestre est décrit par sa date de début et sa date de fin.
Cours : L’entité cours représente une instance concrète d’une Matière. Elle est identifié par la clé unique idCours et contient les attributs quota et dateExamen.
Professeur : Un professeur a un identifiant unique (idProfesseur) et ses informations de contact en tant qu’attributs.
Domaine : Un domaine est identifié par son nom car il est forcément unique (logiquement, si les domaines sont bien appelés ils portent des noms distinctes).
Matière : L’entité Matière a un identifiant unique et un certain nombre de crédits.
Diplôme : Un diplôme est identifié par la clé idDiplome et est caractérisé par les attributs titreDiplome, creditsEssentiels, et creditsEnrichissement.
Etudiant : Identifié par la clé idEtudiant et caractérisé par ses information de contact.
Conseiller : Identifié par la clé idConseiller et caractérisé par ses information de contact.
Relations binaires
Se dérouler pendant : Un cours se déroule pendant un trimestre définitivement, plusieurs cours se déroule pendant un trimestre.
Enseigner : Un cours est enseigné par un professeur, un professeur peut enseigné plusieurs cours. Il est possible qu’un professeur n’enseigne pas des cours s’il est responsable académique.
Spécialiser : Un professeur est spécialisé dans un ou plusieurs domaines, dans un domaine spécifique il y a un ou plusieurs professeurs spécialisés.
Être responsable : Un professeur peut être le responsable académique dans un de ces domaines de spécialité, le domaine a un professeur comme responsable académique.
Appartenir : Une matière appartient a un domaine académique, et un domaine contient au moins une matière.
Prérequire : Une matière peut avoir une ou plusieurs matières prérequises, et une matière peut être prérequise par une ou plusieure matières.
Être instance de : Un cours est une instance d’une maitère sur un trimestre, une matière peut être instanciée plusieurs par plusieurs cours.
Suivre : Un étudiant suit un ou plusieurs cours et obtient une note dans chaque cours. Un cours peut être est suivi par un ou plusieurs étudiants.
Se préinscrire : Un ou plusieurs étudiants se pré-inscrivent dans un cours, et en fonction d’une note de priorité en respectant le quota du cours un ou plusieurs étudiants suivent le cours. La liste de pré-inscrits peut contenir un ou plusieurs étudiants, s’il n’y a pas de pré-inscrits le cours ne s’ouvre pas.
Donner conseils : Un conseiller donne des conseils à un ou plusieurs étudiants concernant leur choix des matières, chaque étudiant est prend des conseils d’un conseiller.
Relation ternaire
Préparer :
On passe aux schéma relationnel à partir de notre modèle Entité/Association.
Associations binaires 1..n
Associations binaires n..n
Association ternaire
On est tempté de supprimer la relation Conseiller car elle est une entité faible et n’est reliée qu’à l’entité Etudiant. Néanmoins, il est très important d’avoir un tableau existant dans la base de donnée pour les personnes (Etudiants, Professeurs, Conseillers) sans avoir à faire des requêtes pour obtenir tel liste, je fais donc le choix de garder cette relation.
Quand j’ai commencé la deuxième partie du projet, j’ai reconsidéré les choix que j’avais effectué, j’expliquerais brièvement les changements que j’ai effectué:
Pour des raisons de portabilité, j’ai sauvegardé les scripts SQL permettant de créer la base de donnée, et la populer par les tableau, des données aléatoires pour tester et les requêtes dans ce rapport (repertoire: db).
Pour faciliter la connection, j’ai créé des scripts shell qui lancent les requêtes SQL à partir du terminal (repertoire: bin).
Les tableaux dans ce rapport sont compilé en directe à l’aide des libraries R knitr et DBI.
Le code source du projet y compris ce rapport est disponible sur: github.com/rand-asswad/gm4_bdd_univ
Cette section est plus visible en format HTML: rand-asswad.github.io/gm4_bdd_univ/rapport/index.html
Connection à la base de données:
library(DBI)
univ <- dbConnect(RMariaDB::MariaDB(), dbname="univ", username="root")
Les tableaux de la base de données permettent d’obtenir toutes les informations nécessaires par des requêtes, il n’y a donc aucun besoin de d’avoir d’autres tableaux. En revanche, il est certainement pratique d’avoir des vues qu’on utilisera souvent dans nos requêtes, par exemple une liste des matières validés (par étudiant).
DROP VIEW IF EXISTS Valide;
CREATE VIEW Valide AS
SELECT Etudiant.id as etudiant, Cours.matiere
FROM InscriptionCours
INNER JOIN Cours ON InscriptionCours.cours = Cours.code
INNER JOIN Etudiant ON InscriptionCours.etudiant = Etudiant.id
WHERE noteObtenue >= 10;
En rajoutant quelques colonnes à cette vue, on obtient:
SELECT Etudiant.nom, Etudiant.prenom, Matiere.code, Matiere.nom, Matiere.credits
FROM Valide
INNER JOIN Etudiant ON Valide.etudiant = Etudiant.id
INNER JOIN Matiere ON Valide.matiere = Matiere.code
nom | prenom | code | nom..4 | credits |
---|---|---|---|---|
Jacquet | Anaëlle | Comb2 | Optimisation combinatoire | 4 |
Jacquet | Anaëlle | Elec0 | Electromagnétisme et courant alternatif | 2 |
Jacquet | Anaëlle | EnB22 | Anglais niveau B2.2 | 1 |
Jacquet | Anaëlle | LinAlg2 | Algèbre Linéaire – approfondissement | 3 |
Jacquet | Anaëlle | Mesure0 | Théorie des ensembles | 1 |
Jacquet | Anaëlle | Proba0 | Initiation à la probablité (discrète) | 1 |
Jacquet | Anaëlle | Techno1 | Systèmes d’exploitations, logiciels (culture générale) | 1 |
Jacquet | Anaëlle | Thermo1 | Modèles thermodynamiques | 2 |
Jacquet | Anaëlle | Ana0 | Analyse (suites et fonctions de variables réelles en dimension 1) | 1 |
Jacquet | Anaëlle | Complex1 | Analyse complexe | 3 |
Voici une vue de diplômes et le nombre de matières qu’elles contiennent.
DROP View IF EXISTS matieresDiplome;
CREATE VIEW matieresDiplome AS
SELECT Diplome.id, COUNT(*) AS nbMatieres
FROM Contenir
INNER JOIN Diplome on Contenir.diplome = Diplome.id
GROUP BY Contenir.diplome;
Afin de mieux visualiser cette vue, on rajoutes quelques colonnes du tableau Diplome.
SELECT Diplome.titre, Diplome.niveau, matieresDiplome.nbMatieres, Diplome.creditsEssentiels
FROM matieresDiplome
INNER JOIN Diplome ON matieresDiplome.id = Diplome.id;
titre | niveau | nbMatieres | creditsEssentiels |
---|---|---|---|
Mathématiques fondamentales et appliquées | BSc | 56 | 150 |
Mathématiques et sciences de données | BSc | 57 | 150 |
Informatique | BSc | 57 | 150 |
Ingénierie de logiciel | BSc | 59 | 150 |
Mathématiques et sciences de données | BSc | 59 | 150 |
Physiques appliquées | BSc | 58 | 150 |
Génie éléctronique | BEng | 57 | 150 |
Génie énergétique | BEng | 55 | 150 |
Génie généraliste | BEng | 58 | 150 |
Analyse de signal | MEng | 41 | 105 |
Les séléctions sont spécifiques à une ligne d’un tableau, donc dans le code source j’ai créé des procédures qui prennent la clé primaire en entrée pour effectuer ces requêtes.
Dans ce rapport, j’ai testé avec les valeurs suivantes:
idEtudiant <- 1
idDiplome <- 5
domaine <- "Combinatoires"
codeCours <- "AUT18Ana01"
On séléctionnent les matières qu’un étudiant pourra prendre. C’est-à-dire, les matières que l’étudiant n’a pas encore validées et il/elle a déjà validé ses matières requises.
SELECT Matiere.code, Matiere.nom, Matiere.credits
FROM Matiere
INNER JOIN PreRequisition ON Matiere.code = PreRequisition.matiere
WHERE Matiere.code NOT IN (SELECT matiere
FROM Valide
WHERE Valide.etudiant = ?idEtudiant)
AND PreRequisition.matiereRequise = ANY (SELECT matiere
FROM Valide
WHERE Valide.etudiant = ?idEtudiant);
code | nom | credits |
---|---|---|
Ana1 | Analyse (suites et fonctions de variables réelles en dimension n) | 2 |
Complex2 | Analyse complexe – approfondissement | 4 |
Data3 | Big data – avancé | 4 |
DevWeb0 | Créations de sites pour les non informaticiens | 1 |
Elec1 | Electromagnétisme avancé | 3 |
Fluid2 | Turbulances, dyphasique, etc | 4 |
Fourier1 | La famille de transformations de fourier | 3 |
Fourier2 | Approfondissement dans l’analyse de fourier | 4 |
Meca0 | Physique Newtonienne (base de mécanique du point + applications) | 1 |
Mesure1 | Théorie de la mesure | 3 |
On séléctionnent les cours qu’un étudiant peut prendre pendant l’année courante.
SELECT Cours.code, Cours.matiere, Matiere.nom, Matiere.credits, Cours.trimestre, Cours.enseignant
FROM Cours
INNER JOIN Matiere ON Cours.matiere = Matiere.code
INNER JOIN PreRequisition ON Cours.matiere = PreRequisition.matiere
WHERE Matiere.code NOT IN (SELECT matiere
FROM Valide
WHERE Valide.etudiant = ?idEtudiant)
AND PreRequisition.matiereRequise = ANY (SELECT matiere
FROM Valide
WHERE Valide.etudiant = ?idEtudiant)
AND Cours.annee = Year(curdate());
code | matiere | nom | credits | trimestre | enseignant |
---|---|---|---|---|---|
ETE18Elec11 | Elec1 | Electromagnétisme avancé | 3 | ETE | 43 |
PRN18Optique11 | Optique1 | Optique ondulatoires | 3 | PRN | 55 |
AUT18Fourier21 | Fourier2 | Approfondissement dans l’analyse de fourier | 4 | AUT | 24 |
ETE18Fourier21 | Fourier2 | Approfondissement dans l’analyse de fourier | 4 | ETE | 24 |
AUT18Mesure11 | Mesure1 | Théorie de la mesure | 3 | AUT | 13 |
PRN18Mesure11 | Mesure1 | Théorie de la mesure | 3 | PRN | 13 |
AUT18Topo01 | Topo0 | Initiation à la topologie (générale et algébrique) | 2 | AUT | 10 |
ETE18Topo01 | Topo0 | Initiation à la topologie (générale et algébrique) | 2 | ETE | 10 |
PRN18Topo01 | Topo0 | Initiation à la topologie (générale et algébrique) | 2 | PRN | 10 |
AUT18Proba11 | Proba1 | Probabilité discrète et continue, var aléatoires, loi des grandes nombres | 2 | AUT | 12 |
Compter le nombre de matières validées par diplômes pour un étudiant, et les afficher dans l’ordre décroissant.
SELECT Diplome.titre, Diplome.niveau, COUNT(1) as nbValide,
matieresDiplome.nbMatieres as nbTotal
FROM Contenir
INNER JOIN Diplome ON Contenir.diplome = Diplome.id
INNER JOIN Matiere ON Contenir.matiere = Matiere.code
INNER JOIN Valide ON Matiere.code = Valide.matiere
INNER JOIN matieresDiplome ON Diplome.id = matieresDiplome.id
WHERE Valide.etudiant = ?idEtudiant
GROUP BY Contenir.diplome
ORDER BY nbValide DESC;
titre | niveau | nbValide | nbTotal |
---|---|---|---|
Génie généraliste | BEng | 18 | 58 |
Technicien en informatique | Tech | 17 | 39 |
Mathématiques et sciences de données | BSc | 16 | 59 |
Génie de modélisation et calculs | MEng | 13 | 41 |
Mathématiques fondamentales et appliquées | BSc | 13 | 56 |
Mathématiques fondamentales et appliquées | MSc | 13 | 42 |
Génie éléctronique | BEng | 12 | 57 |
Mathématiques et sciences de données | BSc | 12 | 57 |
Analyse de signal | MEng | 12 | 41 |
Informatique | BSc | 11 | 57 |
Compter le nombre matières restant pour un étudiant afin de valider un diplôme.
SELECT Matiere.code, Matiere.nom, Matiere.credits
FROM Contenir
INNER JOIN Matiere ON Contenir.matiere = Matiere.code
WHERE Matiere.code NOT IN (SELECT Valide.matiere
FROM Valide
WHERE Valide.etudiant = ?idEtudiant)
AND Contenir.diplome = ?idDiplome;
code | nom | credits |
---|---|---|
Ana1 | Analyse (suites et fonctions de variables réelles en dimension n) | 2 |
Ana2 | Equation différentielles ordinaires | 3 |
Comb1 | Combinatoires avancées | 3 |
Comp0 | Automates, langages, regex | 4 |
Comp1 | Langages et compilateurs | 4 |
Comp2 | Compilateurs et assembleur | 4 |
Control1 | Théorie de contrôle | 3 |
Control2 | Système dynamiques, théorie de contrôle | 3 |
Data0 | Base de données et SQL | 2 |
Data1 | Base de données avancé | 3 |
Donner la liste d’inscrits dans un cours, et les ordonner par la note donnée par le conseiller.q On test pour cours=“AUT18Ana01”.
SELECT Etudiant.id, Etudiant.prenom, Etudiant.nom,
InscriptionCours.noteConseiller, InscriptionCours.suivreCours
FROM InscriptionCours
INNER JOIN Etudiant ON InscriptionCours.etudiant = Etudiant.id
WHERE InscriptionCours.cours = ?codeCours
ORDER BY InscriptionCours.noteConseiller DESC;
id | prenom | nom | noteConseiller | suivreCours |
---|---|---|---|---|
92 | Diego | Chevalier | 9 | 1 |
77 | Alexia | Rousseau | 8 | 1 |
74 | Françoise | Olivier | 8 | 1 |
45 | Constant | Laurent | 8 | 1 |
40 | Kylian | Meunier | 7 | 1 |
65 | Mélissa | Pierre | 7 | 0 |
37 | Baptiste | Garcia | 6 | 0 |
88 | Alexis | Rolland | 6 | 0 |
68 | Constant | Le goff | 6 | 1 |
13 | Félix | Renaud | 5 | 0 |
Donner la liste de enseignant dans un domain (domain=“Combinatoires”).
SELECT DISTINCT Professeur.id, Professeur.nom, Professeur.prenom
FROM Cours
INNER JOIN Professeur ON Cours.enseignant = Professeur.id
INNER JOIN Matiere ON Cours.matiere = Matiere.code
WHERE Matiere.nomDomaine = ?domaine;
id | nom | prenom |
---|---|---|
18 | Humbert | Capucine |
17 | Noel | Lauriane |
16 | Roger | Élouan |
15 | Guillot | Antoine |
Ce projet n’a pas été ma première expérience dans la conception de base de données. En revanche, cela m’a permis de m’entrainer sur la conception et la manipulation des bases de données.
En effet, j’aurais préféré pouvoir aller plus loin dans ce projet en définissant plus de routines/requêtes qui permettent de répondre à toutes les questions possibles concernant le choix des matières, tel qui pourra être adopté par un intranet d’un établissement d’un modèle compatible. Mais étant seul à travailler sur ce projet, j’ai dû me contenter des résultats actuels.