Transformation de la relation d'héritage par la classe mère
Méthode :
Seule la classe mère est représentée par une relation (ses classes filles ne sont pas représentées par des relations).
Tous les attributs de chaque classe fille sont réintégrés au niveau de la classe mère.
La clé primaire de la classe mère est utilisée pour identifier la relation.
Un attribut supplémentaire de discrimination
t
(pour "type"), est ajouté à la classe mère, afin de distinguer les tuples.Cet attribut est de type énumération et a pour valeurs possibles les noms de la classe mère ou des différents classes filles.
Classe1(#a,b,c,d,e,f,t:{1,2,3})
avec c UNIQUE et e UNIQUE
Remarque :
Si une classe fille a une clé primaire propre, cette clé sera réintégrée à la classe mère, au même titre qu'un autre attribut, mais elle n'officiera pas en tant que clé candidate car elle pourra contenir des valeurs nulles (elle sera néanmoins unique).
Conseil : Classe mère non abstraite
Cette solution est particulièrement adaptée lorsque la classe mère n'est pas abstraite, car cela en autorise l'instanciation naturellement. Lorsque la classe mère est abstraite il est moins naturel de disposer d'une table associée à cette classe.
Conseil : Héritage complet
Cette solution est optimum dans le cas d'un héritage complet, c'est à dire si les classes filles ne définissent pas d'attributs autre que ceux hérités. Dans le cas contraire cela engendre des valeurs null
.
En pratique l'héritage complet est rare, mais nombre d'héritages le sont presque et pourront alors être raisonnablement gérés selon cette approche, a fortiori si la classe mère n'est pas abstraite.
Complément : Héritage non exclusif
afin de gérer l'héritage non exclusif (un objet peut être de plusieurs classes filles à la fois), le domaine de l'attribut de discrimination, peut être étendu à des combinaisons de noms des différentes classes filles.
Classe1(#a,b,c,d,e,f,t:{1,2,3,23})
Complément : Représentation de la discrimination par des booléens
Si l'héritage concerne un nombre élevé de classes filles et qu'il est principalement non exclusif alors le domaine de l'attribut de discrimination peut impliquer une combinatoire importante de valeurs. Pour contourner cette lourdeur il est possible d'utiliser, en remplacement, un attribut de domaine booléen pour chaque classe fille spécifiant si un tuple est un objet de cette classe.
Classe1(#a,b,c,d,e,f,t:{1,2,3})
équivaut à :
Classe1(#a,b,c,d,e,f,t2:boolean:,t3:boolean)
Contraintes :
avec t2 X t3
si l'héritage est exclusifavec t2 XOR t3
si l'héritage est exclusif et la classe mère abstraite