À l'école
[15 min]
Une école souhaite se doter d'une base de données pour suivre ses effectifs (élèves et professeurs) ainsi que les classes auxquelles ils sont rattachés. L'analyse des besoins est la suivante :
Les classes sont identifiées par un niveau et une lettre (6-A, 6-B, 5-A, ...).
Les classes peuvent avoir un programme adapté suivant un thème unique (sport-étude, bilingue anglais ou bilingue allemand).
Les classes ont un professeur principal et plusieurs professeurs intervenant dans leur spécialité.
Les classes accueillent des élèves.
Les élèves sont sous la responsabilité d'un parent (qui peut aussi être professeur, voire lui même élève).
Question
À partir du schéma UML proposé, réaliser le passage au modèle relationnel en justifiant les choix pour les deux héritages.
Solution
Gestion de l'héritage
Personne : La classe mère est abstraite, l'héritage est non exclusif et non complet, c'est donc un cas problématique. La meilleure solution est ici un choix d'héritage par référence, l'héritage par les classes filles introduirait de la redondance et l'héritage par la classe mère poserait des problèmes au niveau des associations.
Classe : La classe mère est non abstraite et l'héritage est complet, c'est un cas simple, on adopte un héritage par la classe mère.
personne (#num:entier,nom:chaîne, prénom:chaîne, date_de_naissance:date)
élève (#num=>personne, moyenne_générale:réel, responsable=>parent, classe=>classe)
parent (#num=>personne, profession:chaîne)
professeur (#num=>personne, matière:chaîne)
classe (#id:entier(1)-char(1), type{normal|sport_étude|bilingue_anglais|bilingue_allemand}, prof_principal=>professeur)
enseigne (#professeur=>professeur, #classe=>classe)
Question
Montrer que ce schéma n'est pas en première forme normale, et proposer une correction du schéma relationnel.
Solution
Le schéma n'est pas en première forme normale car l'attribut classe.id
n'est pas atomique. Ici il suffit de séparer cet attribut en deux sous-attributs :
classe (#niveau:entier(1), #lettre:char(1) ...)
élève (... classe.niv=>classe, classe.let=>classe)