Bonsoir,
Avant tout, mettons-nous d’accord sur le principe de la généralisation/spécialisation. Considérez par exemple le cas d’une SSII ayant des clients et des salariés. Le cœur du modèle concerne essentiellement ces deux types de personnes. Si l’on entame la modélisation, on aura peut-être une ébauche de diagramme du genre :
Diagramme dans lequel l’attribut (propriété au sens Merise) ClientId est artificiel, par opposition aux attributs (propriétés) naturels ClientSiret (numéro Siret du client) et ClientRaisonSociale (raison sociale du client). L’attribut ClientId n’est là que pour servir d’identifiant au sens Merise du terme. Ceci vaut pour l’attribut SalarieId, mutatis mutandis.
En passant, je rappelle s’il en est besoin ce qu’a écrit l’un des plus grands de la modélisation, Yves Tabourier (De l’autre côté de MERISE page 81), et ça c’est une règle d’or, qui a plus de vingt ans :
« ... la fonction d’une propriété est de décrire les objets (et les rencontres), alors que l’identifiant ne décrit rien. Son rôle fondamental est d’être sûr de distinguer deux jumeaux parfaits, malgré des descriptions identiques... »
A noter que deux entreprises ne pouvant pas avoir le même Siret, l’attribut ClientSiret fait donc l’objet d’un identifiant dit alternatif, signalé par le mickey <ai> dans le diagramme (voir ici ou là, c’est du Power AMC V11, mais avec la V15 ça ne doit pas être très différent). Même principe concernant le matricule des salariés et leur numéro de sécurité sociale (NIR).
Ensuite, on va dire que les clients et les salariés ont un téléphone :
Ou bien, s’ils peuvent avoir plusieurs téléphones :
A toutes fins utiles, je rappelle que le fait de placer les cardinalités 1,1 entre parenthèses (convention Power AMC) entraîne que l’identifiant de l’entité-type CLIENT_TELEPHONE est relatif à celui de CLIENT, c'est-à-dire qu’implicitement l’identifiant de CLIENT_TELEPHONE n’est pas ClientTelephoneId mais le couple {ClientId, ClientTelephoneId} (qui composera donc la clé primaire de la table CLIENT_TELEPHONE au niveau logique). Disons qu’entre CLIENT et CLIENT_TELEPHONE on a une relation de composition, ou encore que CLIENT_TELEPHONE est une propriété multivaluée de CLIENT.
A la longue, on se convainc qu’il serait intéressant de factoriser les attributs et les relations qui caractérisent aussi bien les clients que les salariés. On utilise alors le procédé de la généralisation, en considérant que les entités-types CLIENT et SALARIE sont des cas particuliers, des sous-types d’une entité-type plus générale (surtype), appelons-la PERSONNE :
CLIENT et SALARIE sont des sous-types de PERSONNE, des entités-types spécialisées. CLIENT hérite de l’identifiant {PersonneId} de PERSONNE, donc l’attribut artificiel ClientId n’a plus d’emploi et au nom du rasoir d’Ockham, il doit disparaître, même chose concernant l’attribut SalarieId.
Si l’on se place au niveau SQL, les entités-types PERSONNE et CLIENT donneront lieu aux tables PERSONNE et CLIENT, etc. :
Revenons à votre modélisation. Vu l’utilisation de l’héritage, on considère que l’entité-type FICHIER_GPS est un sous-type de l’entité-type ARTICLE :
Comme je l’ai écrit précédemment, il y a détournement d’héritage, mais c’est pour la bonne cause et l’on dira que sémantiquement parlant, le couple {ARTICLE, FICHIER_GPS} représente le cas de l’article à fichier GPS et dont la réunion des attributs est la suivante :
{id_article, article_titre, article_description, article_timestamp, validation_article, article_url_photo, id_fichier_gps, fichier_gps_lat, fichier_gps_lon, fichier_gps_altitude, fichier_gps_url_image, fichier_gps_date}.
Well, mais il y a quand même une anomalie : De même que l’entité-type CLIENT hérite de l’identifiant {PersonneId} de PERSONNE — en vertu de quoi l’attribut artificiel ClientId n’a plus d’emploi et disparaît au nom du rasoir d’Ockham — de même l’entité-type FICHIER_GPS hérite de l'identifiant {id_article} et doit donc être débarrassée de l’attribut id_fichier_gps (à défaut on pourrait dire qu’on est en présence d’une entité-type hybride, à la fois sous-type et propriété multivaluée, ce qui est un non-sens) :
Concernant les balades.
Là aussi, l'attribut id_dept_balade doit disparaître au nom du rasoir d’Ockham. En plus, le numéro et le nom du département ne sont pas des propriétés de DEPARTEMENT_BALADE et doivent être celles d’une entité-type DEPARTEMENT :
(A titre de curiosité, à quoi correspondent dept_balade_prefixe et dept_balade_geom ?)
Entité-type SECTEUR_PERIPLE : Là encore, l'attribut id_secteur_periple doit disparaître.
Cas du livre d’or : selon votre diagramme, un utilisateur peut être en relation avec plusieurs livres d’or, tandis qu’un livre d’or n’est en relation qu’avec un seul utilisateur. Qu’en est-il exactement ?
Cas des mots-clés : un article peut ne pas comporter de mots-clés, tandis qu’un mot-clé fait référence à au moins un article : j’aurais pour ma part tendance à permuter les cardinalités...
Partager