Modélisation par héritageDate de publication : 29/11/2003
Par
SQLPro (autres articles) (CV) niveau : intermédiaire Les modèles par héritage possèdent de nombreux avantages. Parmis ceux-ci, l'économie en volume de données stocké, la standardisation des types et formats de données. Cet article fait le point sur la modélisation des entités par héritage afin de vous permettre de l'implémenter au sein de vos applications, et cela, en toute sérénité. 1. Modélisation sans héritage 2. Modélisation d'un héritage de personnes 3. Un héritage induit 4. Transposition en modèle physique 5. Héritage avec exclusion mutuelle 6. Héritage conditionnel 6.1. Avec vue 6.2. Avec ajout de colonne 7. Quelques liens pour en savoir plus 1. Modélisation sans héritagePour comprendre l'intérêt de la modélisation par héritage, commençons par une application très banale qui devra contenir des prospects, des clients et des employés... Une gestion commerciale par exemple... Voici un exemple de modèle de données ![]() Nous constatons que certaines entités possèdent des attributs identiques : NOM, PRENOM se retrouvent dans EMPLOYE, CLIENT et PROSPECT. De même NUMxxx et DATE se retrouve dans COMMANDE et FACTURE. Enfin, les associations portent sur contiennent elles aussi les mêmes attributs. Ce modèle possède un inconvénient majeur :
La première idée consiste à rassembler tous les individus dans une seule et même table. Il faut ensuite les décliner en client, prospect et employé. C'est la technique de l'héritage... 2. Modélisation d'un héritage de personnes![]() Nous voyons désormais que les entités PROSPECT, EMPLOYE et CLIENT n'ont plus de clef. C'est normal ces entités vont hériter des données de la table PERSONNE contenant une clef. A ce stade il existe deux possibilités :
3. Un héritage induitPrécisons encore notre modèle en faisant un héritage avec les tables COMMANDE et FACTURE : ![]() Contrat est une table qui rassemble aussi bien les commandes que les factures. Ce qui permet de distinguer une commande d'une facture sera le contenu de la colonne NATURE. C'est aussi une modélisation d'héritage d'une autre forme... Enfin pour résoudre la problématique des addresses multiples, rien ne nous empêche d'externaliser les adresses dans une tables à part : ![]() La nature des adresses est soit explicite (attribut UTILITE de l'assocation possède) soit implicite du fait de la relation avec la table des contrats (adresse de facturation ou de commande). Regardez comme ce modèle est devenu simple ! Nous sommes passés de 46 attributs à 33 tout en augmentant le nombre de rubriques pour les différentes entités (par exemple par rapport au premier modèle une prospect n'avait pas de titre !)... 4. Transposition en modèle physiqueEn générant le modèle physique d'après le modèle ci dessus, nous obtenons le diagramme suivant : ![]() On note que les entités PROSPECT, EMPLOYE et CLIENT héritent de la colonne clef de la table mère PERSONNE. 5. Héritage avec exclusion mutuelleUne autre possibilité dans l'utilisation des héritages est de faire en sorte qu'il n'existe qu'un seul héritier dans les diverses tables filles. Cela s'avère parfois indispensable. Comme un bon exemple est souvent plus explicite qu'un long discours, modélisons les différents types de location de véhicule d'une gance comme Hertz, Budget ou EuropCar... Ce qui nous intéresse c'est une entité générique des véhicules et des entités filles par type de véhicule (moto, voiture ou camion)... Voici un premier exemple d'une telle modélisation : ![]() Veuillez noter dans ce modèle la présence de la croix dans le symbole de l'héritage. Il indique une exclusion mutuelle entre les entités filles... Mais comment résoudre cette exclusion mutuelle ? La simple technique des intégrités référentielles est insuffisante à gérer ce cas de figure. Il faut recourrir à un ensemble de triggers... Voyons d'abord comment le modèle physique est construit à partir du modèle conceptuel : ![]() Dans le principe il faut que, pour chaque insertion dans l'une des tables filles s'assurer que le véhicule n'est pas déjà utilisé par les autres tables... Voici les triggers d'insertion/modification pour les trois tables filles, dans le langage Transact SQL de SQL Server :
Notez que SQL Server utilise la pseudo table INSERTED pour les insertions en cours. Certains SGBDR utilise la table NEW (norme SQL). Il faut aussi créer un trigger dans la table mère afin d'empêcher la suppression si le véhicule est référencé dans l'une des tables filles.
Pour vérifier ce fonctionnement, vous pouvez utiliser le jeu de données suivant :
6. Héritage conditionnelPlus rarement implémenté, voici l'héritage conditionnel. Il s'agit de rajouter dans la table mère une colonne particulière permettant de spécifier quelle est la table fille héritière. Cela peut se faire de deux manières :
6.1. Avec vueReprenons notre exemple précédent... Ajoutons la vue suivante :
Les avantages sont considérables... On peut simplifier les jointures du fait qu'il ne suffit plus que d'utiliser la jointure de véhicule sur la vue pour obtenir toutes les informations sur tous les véhicules quelque soit leurs types :
6.2. Avec ajout de colonneBien entendu si l'on a opté pour l'ajout d'une colonne spécifique dans la table mère il faudra la renseigner lors de l'exécution du trigger d'insertion/modification. 7. Quelques liens pour en savoir plusBase d'UML et comparaisons : http://www.usask.ca/frenchciv/ronald/la_boite_a_objets/modelisation_avec_uml.html
|
Copyright © 2003 Frédéric Brouard. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.