IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Définition 'lien identifiant' & 'identifiant relatif' [MCD]


Sujet :

Schéma

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut Définition 'lien identifiant' & 'identifiant relatif'
    Bonjour à tous !

    En pleine révision du Bts informatique de gestion, je dois connaitre les subtilités de merise ! J'arrive relativement bien à construire mes MCD mais je n'ai toujours pas bien compris la notion d'identifiant relatif (1,1) ni son utilité.
    J'ai fait des recherches sur le net et chacun à sa petite explication mais généralement c'est incomprehensible !
    Si quelqu'un pouvait m'expliquer rapidement (à l'aide d'un exemple) je serais ravi et je lui serais infiniment reconnaissant !

    Merci d'avance de vos réponses !

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 213
    Billets dans le blog
    16
    Par défaut
    Bonjour Knoxville,


    Au niveau conceptuel, à chaque entité-type on affecte un identifiant, dont l’objet est de distinguer des jumeaux parfaits. Pour leur part, les associations-types n’ont pas d’identifiant en propre, mais héritent de l’union des identifiants des entités-types qu’elles mettent en relation.

    Supposons que vous soyez dans une entreprise recevant des commandes de la part de ses clients. Considérons maintenant l’entité-type Commande. Elle a notamment pour propriétés :
    L’identifiant (disons CommandeId), affecté a priori par le concepteur (acte réflexe).
    Le numéro de commande connu des utilisateurs (et qui peut être utilisé comme identifiant s’il est fourni par le système, s’il est invariant et s’il garantit la règle d’unicité).
    La référence du client.
    La date de la commande.
    L’ensemble des lignes de commande.
    Etc.

    En Merise, la règle est que les attributs d’une entité-type ne puissent prendre qu’une seule valeur. Or, les lignes de commande correspondent à un attribut multivalué, en infraction avec la règle. En conséquence, ces lignes de commande vont faire l’objet d’une entité-type LigneCommande. Pour autant, cette entité-type pèse bien moins lourd que celle qui lui a donné naissance, elle est qualifiée de "faible" (weak entity). On peut encore considérer les lignes de commande comme constituant un composant de la commande. Au nom d’un principe érigé en règle, LigneCommande est techniquement une entité-type mais ontologiquement et sémantiquement, viscéralement devrais-je dire, elle n’est toujours qu’une propriété de Commande : par exemple, la suppression d’une commande entraîne automatiquement la suppression de toutes ses lignes de commande, qui n’ont aucune raison de rester en vie et de s’opposer à la destruction de l'objet qu'elles composent.

    Quoi qu’il en soit, l’entité-type LigneCommande doit être affectée d’un identifiant, appelons-le LigneCdeId. Il y a deux écoles :

    La première d’entre elles préconise que cet identifiant soit représenté par un attribut unique, comme ce fut systématiquement le cas jusque dans les années quatre-vingts.

    La deuxième, moins simpliste, reconnaît que LigneCommande — à l’instar des associations — hérite de l’identifiant de Commande. Mais, pour distinguer chaque ligne de commande au sein d’une commande, on complète l’identifiant de LigneCommande par un attribut supplémentaire, en l’occurrence LigneCdeId qui perd son caractère absolu et devient relatif à CommandeId.

    Pour résumer, selon la deuxième école :
    L’entité-type Commande a pour identifiant {CommandeId}
    L’entité-type LigneCommande a pour identifiant {CommandeId, LigneCdeId} :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Commande (CommandeId, CommandeDate, ClientId, ...)
                  1            d1          c1
                  2            d2          c2
                 ...          ...         ...
    
    LigneCommande (CommandeId, LigneCdeId, ProduitId, Quantité, ...)
                       1           1           p1        q1 
                       1           2           p2        q2 
                       1           3           p3        q3 
    
                       2           1           p4        q4 
                       2           2           p5        q5 
                       2           3           p6        q6 
                      ...         ...         ...       ...
    Personnellement, je suis un adepte de l’identification relative :
    Pour les raisons sémantiques que j’ai mentionnées.
    Ensuite, parce que cela a une incidence déterminante à l’autre bout de la chaîne, c’est-à-dire au stade de la Production informatique.
    J’ai quand même plus de quarante ans d’expérience concernant les très grands volumes de données, je me suis engagé auprès de nombreuses grandes entreprises quant à la performance de leurs applications et j’ai pu apprécier l’efficacité décisive de l’identification relative à ce sujet.

    En effet, au niveau physique, pour faire simple et pour reprendre l’exemple des lignes de commande, en fonction de l’attribut CommandeId, celles-ci pourront être regroupées dans une même page (clustering) et faire l’objet d’une seule entrée/sortie. Sinon, au pire, chaque ligne sera dispersée dans une page distincte, ce qui fait qu’au lieu d’obtenir les lignes en une seule entrée/sortie, il faudra donc compter autant d’entrées/sorties que de lignes. Ainsi malgré toute la puissance CPU dont vous disposerez, vous serez bloqué par les attentes de fin d’entrée/sortie, phénomène connu sous le nom d’I/O bound (ou I/O wait), qui énerve singulièrement celui qui le subit. Sur des volumes faibles ou pour des transactions légères, cela est quasiment transparent, mais peut devenir dramatique quand vous manipulez simultanément dix tables de dix à cent millions de lignes et au delà. Plus d’une fois j’ai effectué des missions en catastrophe, diagnostiqué que l’I/O bound était le coupable et fait en sorte que les temps de traitement des batch de nuit tiennent dans la fenêtre imposée et ne retardent plus le démarrage du télétraitement diurne.

    On pourra vous rétorquer que le regroupement (clustering) des lignes de commande sur CommandeId ne nécessite pas le mécanisme de l’identification relative. Mais, changement de chanson si vous voulez propager cet attribut au-delà des lignes de commande et continuer à éviter l’I/O bound. Considérez que l’entité-type LigneCommande comporte un attribut multivalué donnant lieu à une entité-type Engagement (on s’engage à livrer en fonction de ce que l’on a en stock, en cours d’arrivage, en fabrication, etc.) : le regroupement des engagements sur CommandeId s’impose là encore. Même chose si chaque engagement fait à son tour l’objet de plus d’une livraison (par exemple, on ne peut pas tout mettre sur le même camion).

    Je joins un schéma que j’ai déjà proposé à Snoopo et consorts. Vous noterez que même l’entité-type Commande est identifiée relativement à Client. Exercice : à vous de justifier ce choix.

    En revanche, l’entité-type Client est considérée comme "indépendante". Paradoxalement, le regroupement des clients pourrait poser des problèmes de contention dans un contexte transactionnel, mais je suppose que vous avez étudié le problème de la concurrence d’accès des transactions en mise-à-jour et comprendrez cela (supposez qu’au même moment plusieurs utilisateurs créent des clients). Le phénomène de contention joue moins avec les commandes et lignes de commande, car une commande donnée est traitée (en principe) par un utilisateur unique.


    Sur ce schéma (Power AMC), vous noterez que, par exemple, l’attribut CommandeId ne figure pas comme attribut de l’entité-type LigneCommande, mais au niveau tabulaire il sera bien présent. Vous noterez aussi que LigneCommande n’est pas identifiée relativement à Produit : une ligne de commande n’est pas un composant d’un produit.

    Il est encore possible que la recherche des données Produit engendrent de l’I/O bound, c’est pourquoi ces données devront être accédées au plus une fois, le plus tard possible, lors du traitement chargé de fournir ces données. Mais là, on en arrive au prototypage des traitements et il s’agit d’une autre histoire...

    Pour conclure, au niveau conceptuel, l’identification relative se justifie pour des raisons ontologiques et sémantiques. Ses conséquences au niveau physique sont déterminantes pour la réduction des temps des traitements lourds manipulant de grands volumes de données.

    A vous de jouer.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre confirmé Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    Alors là !
    Merci, merci, merci !
    C'est super bien expliqué et très claire !
    Franchement mille merci !
    Si avec ça j'ai pas mon exam^^

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Bonjour,

    Vous noterez que même l’entité-type Commande est identifiée relativement à Client. Exercice : à vous de justifier ce choix.
    Dans le MCD présenté ci-dessus, l’entité-type Commande est identifiée relativement à Client. Cela me semble être une très bonne solution pour les grande BDD, les traitements se trouveront probablement accélérés.

    Pour des entreprises qui gèreraient assez peu de commandes (TPE...), l'identification relative ne me semble pas utile. Je pense qu'un numéro de commande "absolu" permettra de simplifier l'application l'informatique.


    Par ailleurs, j'ai une petite question. Lors de la dérivation du MCD ci-dessus, la table "Engagement" aura une clé primaire composée de l'union de 4 attributs ? C'est bien ça ?


    Merci.

  5. #5
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    @fsmrel
    Ben moi je suis plus de la première école, encore que tu n'as pas totalement développé ce que tu entendais sur ce point aussi, je me permet d'exposer mon point de vue.

    Personnellement, comme tu as dû t'en rendre compte, je suis plutôt un adepte d'UML que de Merise. Pour prendre l'exemple Commande - LigneCommande, je mettrais plus l'accent sur la sémantique métier que sur des "règles Merisiennes".
    Une Commande est un ensemble de "lignes de commandes" qui chacune référence un produit et une quantité commandée (plus sûrement d'autres trucs dans la vraie vie). Ligne de commande existe non pas à cause de règles Merisiennes mais tout simplement parce que d'un point de vu métier elle existe et la LigneCommande est par nature un élément d'une Commande et d'une seule (d'où la composition).
    Ensuite (c'est là que l'on diverge), la règle est simple, chaque Entité possède son identifiant "technique" (l'id dans le modèle UML) et pour chaque association, en fonction des multiplicités et des choix de mapping vers le modèle de tables, on a forcément un "foreign key" du côté de la table "LigneCommande".
    La foreign key n'est pas vraiment une partie de l'identifiant de la ligne de commande, c'est ce qui matérialise son lien avec une commande particulière. Le vrai identifiant de la ligne de commande, c'est son id.
    L'idée de l'id unique c'est aussi de faciliter le travail côté code où la gestion des clés primaires multiples n'est jamais très simple... et comme ça n'avance pas à grand chose...
    J'imagine que de tout manière dans ta vision @fsmrel, tu vas déclarer une contrainte d'intégrité pour dire que le commandId de LigneCommand pointe nécessairement l'Id d'une Commande donc où est l'intérêt d'avoir une clé primaire multiple ?
    Images attachées Images attachées  

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Avec le MCD proposé par fsmrel, et l'utilisation de l'identification relative, les requêtes SQL seront facilitées je pense.

    Par exemple, pour connaitre les engagements du client Dupont, nous aurons beaucoup moins de jointures.

    Donc je pense effectivement que la "2ème école" est plus performante.

    Une Commande est un ensemble de "lignes de commandes"
    Si c'était le cas, nous aurions un héritage. Une commande n'est pas un ensemble de lignes de commande, mais une commande se compose de lignes de commande (et d'autres données comme la date de la commande, etc.).


    Ligne de commande existe non pas à cause de règles Merisiennes
    Ce ne sont pas les règles Merisiennes qui génère l'entité-type "ligne de commande" mais plutôt les règles propre à l'analyse informatique en général, que ce soit Merise, UML, MRD, MCX ou autre.


    L'idée de l'id unique c'est aussi de faciliter le travail côté code où la gestion des clés primaires multiples n'est jamais très simple... et comme ça n'avance pas à grand chose...
    Les vues SQL sont là pour résoudre se problème de complexité. Ainsi le DBA créera probablement une vue fondée sur une jointure entre "Commande" et Ligne Commande".


    En conclusion il me semble que l'identification relative simplifie les requêtes et accélère les traitements. C'est tout bénéf

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. sprintf: identifier les identifiants
    Par shaiHulud dans le forum MATLAB
    Réponses: 0
    Dernier message: 30/10/2013, 18h59
  2. Changer fonction "lien next" en plusieurs liens fixe (absolu ou relatif).
    Par masta64 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/01/2010, 15h58
  3. Lien identifiant
    Par Docsmea dans le forum Access
    Réponses: 15
    Dernier message: 26/04/2006, 16h15
  4. [Identifiant relatif] access
    Par Fredo02 dans le forum Access
    Réponses: 1
    Dernier message: 19/01/2006, 21h14
  5. Générer un identifiant relatif > l'entité faible en prati
    Par vmolines dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 19/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo