Soit le modèle UML suivant :
L'héritage presque complet et
La classe mère est abstraite,
la meilleure solution est donc ici un héritage par les classes filles.
.
Document(#Titre:Chaîne, Auteur:Chaîne) avec Document AND (These OR Livre)
These(#Titre=>Document, Discipline:Chaîne)
Livre(#Titre=>Document, Editeur:Chaîne)
Il n'y a ni redondance ni valeur nulle inutile dans les relations These et Livre.
Il est relativement lourd de devoir créer un tuple dans Document pour chaque tuple dans These ou Livre
De plus la classe Document étant abstraite, il ne devra jamais y avoir de tuple dans document qui n'a pas de tuple correspondant dans Livre ou These
These(#Titre, Discipline:Chaîne, Auteur:Chaîne)
Livre(#Titre, Editeur:Chaîne, Auteur:Chaîne)
Il est plus simple que le précédent, puisque la représentation d'une thèse ou d'un livre ne nécessite plus que d'ajouter un seul tuple. Il évite donc les clés étrangères, toujours plus délicates à gérer d'un point de vue applicatif.
Si l'héritage est exclusif ce modèle n'a aucun inconvénient.
Document(#Titre, Discipline:Chaîne, Editeur:Chaîne, Auteur:Chaîne, Type:{These|Livre})
Il est plus simple que le premier, puisque la représentation d'une thèse ou d'un livre ne nécessite plus que d'ajouter un seul tuple. Il évite donc les clés étrangères..
Les tuples de Document contiendront systématiquement une valeur nulle soit pour l'éditeur soit pour la discipline.
Il faut vérifier l'adéquation entre la valeur de Type et le fait que Discipline ou Auteur n'est pas valué.