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

  1. #1
    Membre du Club Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 61
    Points
    61
    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 sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    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 du Club Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 61
    Points
    61
    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 averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    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 : 55
    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
    Points : 3 510
    Points
    3 510
    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 averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    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

  7. #7
    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 : 55
    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
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Tu affirmes que la requête permettant de récupérer les "engagements du client Dupont" sont plus rapides.
    On ne parle pas de client ici ! Tu ne mentionnes pas la requête que tu ferais et celle que tu imagines que je ferai moi (normal il n'y pas pas la notion de client).

    Sans plus d'explications, je ne peux pas comprendre ton affirmation

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut


    Je parlais donc bien du M.C.D. ci-dessus qui contient bien une entité-type "Client".

    Voici tout d'abord la requête SQL qu'il te faudrait écrire pour rechercher les engagements du client Dupont :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT Engagement.EngagementId, Engagement.Quantite  /* etc... */
    FROM Client JOIN Commande<div style="margin-left:40px">                ON Client.CliId = Commande.CliId
               JOIN LigneCde  
                    ON Commande.CdeId = LigneCde.CdeId
               JOIN Engagement  
                    ON LigneCde.LigneId = Engagement.LigneId</div>WHERE Client.ClientNom = 'Dupont' ;


    et voici celle que j'écrirai (avec l'identification relative, et si j'ai bien tout compris, la table Engagement devrait contenir une clé primaire coposée de 4 attributs, dont CliId) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Engagement.EngagementId, Engagement.Quantite  /* etc... */
    FROM Client JOIN Engagement<div style="margin-left:40px">                ON  Client.CliId = Engagement.CliId</div>WHERE Client.ClientNom = 'Dupont' ;


    Je n'ai pas testé les requêtes, mais l'esprit y est. La deuxième solution requiert donc une seule jointure au lieu de trois.


    Voila, j'espère que ce sera plus clair. Je ne prétend pas détenir la solution, au départ j'ai posté dans ce topic pour m'assurer que j'avais bien tout compris.

    Cordialement

  9. #9
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    En tant qu'ancien DBA de production et sensibilisé aux performances, je suis aussi un adepte des identifications relatives pour les identités faibles.

    Au deux arguments sur les performances déjà donnés (possiblitré d'un index CLUSTER plus efficace sur une arborescence de plusieurs niveaux et possibilté d'une jointure plus simple sur une interrogation de l'entité du dernier niveau), j'en ajouterais un troisième.

    L'identification absolue "coûte" un index supplémentaire dans l'entité faible pour matérialiser la clé étrangère sur l'entité du niveau supérieur. L'identification relative n'a besoin que d'un index (certes multi-colonnes quand on descend dans l'arborescence des entités). Le gain à l'écriture est loin d'être négligeable, surtout si on effectue des traitements de masse.

  10. #10
    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 : 55
    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
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    ouhai je comprend bien le truc = on prend des raccourcis donc ça va plus vite.
    OK mais en termes d'évolutivité, c'est moyen, il faut être certain qu'un Engagement ne concerne vraiment qu'un Client et puis les raccourcis ça veut dire que l'on "brise" l'encapsulation et le "métier" qu'il y a "entre".
    S'il y a des concepts "entre" 2 autres concepts, la navigation métier, tout au moins en transactionnel se fait souvent de proche en proche, sans sauter d'étapes. Avec les clés multiples, un concept en profondeur, disons 3 ou 4, doit connaitre le concept initial : ici l'Engagement ou tout au moins le code qui va chercher l'engagement doit connaitre le client; ce qui n'est pas forcément très correct dans la mesure où il y a 2 concepts entre Client et Engagement.

    Je suis donc sceptique sur ces optimisations a priori même si je les comprend dans le cas où l'application aura montrée des faiblesses en termes de performance. Mais là il faut voir les traitements effectués et non partir sur des a priori

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut
    Bonsoir,

    OK mais en termes d'évolutivité, c'est moyen, il faut être certain qu'un Engagement ne concerne vraiment qu'un Client
    C'est écrit. Le MCD nous dit qu'un engagement ne concerne qu'un et un seul client. Il ne peut en être autrement.

    Pour s'en convaincre, il faut garder à l'esprit qu'un engagement est en quelque sorte une propriété multivaluée de l'entité-type Client comme disent les Merisiens, ou bien un ensemble strictement inclu dans un ensemble plus vaste, c'est-à-dire un composant. Pour moi cette notion fait partie du concept de l'identification relative.

    et puis les raccourcis ça veut dire que l'on "brise" l'encapsulation et le "métier" qu'il y a "entre".
    Vu que l'on peut considérer qu'un engagement est en quelque sorte une propriété multivaluée de l'entité-type Client, rien n'est "brisé".
    Tout cela colle parfaitement à l'univers du discours, à la réalité de cette entreprise commerciale.



    PS : Je viens de m'apercevoir que ce topic était marqué "Résolu". Désolé d'avoir posté ici. Je stop mes messages dans ce topic donc.

  12. #12
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par MacFly58 Voir le message
    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 ?
    Oui. la clé de la table ENGAGEMENT proposée par Power AMC sera la suivante :
    {ClientId, CommandeId, LigneCommandeId, EngagementId}

    En tant que DBA, j’ai l’habitude de conserver cette clé, bien que je compte mes octets (dix en tout dans le cas de DB2). En 25 ans de soute je n’y ai trouvé que des avantages, sans pénaliser les applications, d'autant plus que celles-ci ne connaissent pas ces attributs artificiels, elles n'ont accès qu'aux attributs naturels.


    Citation Envoyé par MacFly58 Voir le message
    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.
    « Probablement » n’est pas le terme qui convient, je le remplacerai par « A tout coup ». J’ai encore eu l’occasion de le vérifier dans une grande banque française où était utilisé DB2 for z/OS : un traitement batch avait été lancé le lundi et ramait encore le mercredi. Inquiets, les collègues m’ont appelé pour me demander si le samedi ça serait terminé (exigence absolue). J’ai expertisé, calculé, extrapolé : il y en avait encore au moins pour 10 jours, à cause du phénomène d’I/O bound conséquence d’une identification absolue, identification qui aurait sans commune mesure plus performante si elle avait été relative¹. A ma demande, arrêt immédiat du batch (qui gênait par ailleurs d’autres applications). Après aménagement et corrections, le temps de traitement a été ramené à quelques heures. Voir à ce sujet les différences que l’on peut observer dans les temps de traitement, cf. Le clustering selon DB2 for z/OS.

    Citation Envoyé par ego Voir le message
    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)
    Qui a dit le contraire ?
    Pour la nième fois, on ne va pas remettre ça sur le tapis. Au sens de l’utilisateur, une commande comporte un certain nombre de données : numéro de commande, date de commande, client, lignes de commande, total de la commande, etc.

    Exemple (écran de saisie) :



    (que son auteur me pardonne mais j’ai récupéré cette image, dans un vieux support de cours sur Merise datant des années quatre-vingts et je ne sais plus de quel ouvrage il s’agit...)

    Si je me place dans le contexte du Modèle Relationnel de Données, au nom de la normalisation en 5e forme normale, les données spécifiques du client seront regroupées dans une relvar (variable relationnelle) Client, même principe mutatis mutandis concernant les produits, d’autres gicleront si elles sont calculables (Totaux), etc. En ce qui concerne les lignes de commande, je peux décider d’en faire une relvar ou un attribut (RVA) de la relvar Commande, tel qu’ici :



    Maintenant, si j’adopte l’approche UML, j’utiliserai une relation de composition, à l’instar de la vôtre pour représenter la nature des liens de la commande et de ses lignes :




    Si j’adopte l’approche IEF (Information Engineering Facility) parce que mon client l’utilise, j’aurais la représentation suivante :



    Si j’utilise Merise (variante Power AMC) la représentation sera la suivante, en notant la présence de l’identifiant alternatif {CommandeNo} pour l’entité-type Commande et en observant encore que l’identification relative vaut ici relation de composition (Power AMC traduit du reste le MCD ci-dessous en un diagramme de classes identique au vôtre) :



    Ou comme au bon vieux temps de la fin des années soixante-dix ?




    Tout ça c’est blanc bonnet et bonnet blanc, ce sont des variations sur un thème.

    Mettez-vous dans le crâne qu’au niveau opérationnel, si vous utilisez un SGBD relationnel, disons SQL, il n’y a que des tables et rien que des tables, autrement dit des ensembles (au sens de la théorie des ensembles), que l’on manipule à l’aide d’une algèbre relationnelle et que les beaux schémas sont à l’affichage pour que les développeurs se souviennent de la structure des ensembles qu’ils manipulent.


    Citation Envoyé par ego Voir le message
    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.
    Vous mélangez les genres et à ce train-là on n’est pas couchés. L’identifiant est du niveau conceptuel. Ce terme est introuvable dans le dictionnaire de référence des bases de données relationnelles (The Relational Database Dictionary de C. J. Date). Le concept de clé étrangère a été défini par Ted Codd il y a trente ans et ne fait pas partie de Merise ou d’UML, il est strictement relationnel (cf. le même dictionnaire) et une clé étrangère qui est un ensemble (au sens de la théorie des ensembles) peut être incluse tout ou partie (toujours au sens de la théorie des ensembles) dans une clé candidate (plus simplement clé) : la théorie des ensembles et la théorie relationnelle n'ont aucune raison d'y voir une contre-indication quelconque (principe d'orthogonalité)...

    Citation Envoyé par ego Voir le message
    Le vrai identifiant de la ligne de commande, c'est son id.
    Oui, mais relatif. En Merise, l’identifiant relatif est défini ainsi dans le document de référence défini par le groupe 135 de l’AFCET (Journée du 15 novembre 1990 - Le formalisme de données Merise : extensions du pouvoir d’expression) :



    Citation Envoyé par ego Voir le message
    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 ?
    Je suppose que par clé primaire multiple, vous voulez dire clé primaire composée (c'est-à-dire ayant au moins deux attributs pour éléments). Par ailleurs le verbe « pointer » (horresco referens!) est banni du vocabulaire relationnel, où il est considéré comme un barbarisme (le jour où vous écrirez avec précision, on aura progressé).

    L’intérêt d’une clé composée ? Je prends maintenant ma casquette de DBA, on ne rigole plus, car ma mission est de faire en sorte que les applications percutent et la clé composée est une « clef » dans cette affaire : une fois que les MCD et autres diagrammes de classes sont stabilisés, les MLD produits, je valide ceux-ci, je les expertise et s’ils ne sont pas bons sur ce plan, je les fais modifier. Voyez à ce sujet les annexes F.2 et F3 de l’article sur la normalisation.



    Citation Envoyé par Luc Orient Voir le message
    L'identification absolue "coûte" un index supplémentaire dans l'entité faible pour matérialiser la clé étrangère sur l'entité du niveau supérieur. L'identification relative n'a besoin que d'un index (certes multi-colonnes quand on descend dans l'arborescence des entités). Le gain à l'écriture est loin d'être négligeable, surtout si on effectue des traitements de masse.
    Vous confirmez ainsi ce que j’ai écrit ici, et vous faites observer en plus que l’on réduit les coûts en écriture, ce que pour ma part j’avais omis de préciser. En tout état de cause, nous sommes d'accord pour dire que de telles économies de temps sont fort appréciées par la direction de la production informatique qui trouve que les traitements sont toujours trop gourmands.

    Citation Envoyé par ego Voir le message
    ouhai je comprend bien le truc = on prend des raccourcis donc ça va plus vite.
    OK mais en termes d'évolutivité, c'est moyen, il faut être certain qu'un Engagement ne concerne vraiment qu'un Client et puis les raccourcis ça veut dire que l'on "brise" l'encapsulation et le "métier" qu'il y a "entre".
    S'il y a des concepts "entre" 2 autres concepts, la navigation métier, tout au moins en transactionnel se fait souvent de proche en proche, sans sauter d'étapes. Avec les clés multiples, un concept en profondeur, disons 3 ou 4, doit connaitre le concept initial : ici l'Engagement ou tout au moins le code qui va chercher l'engagement doit connaitre le client; ce qui n'est pas forcément très correct dans la mesure où il y a 2 concepts entre Client et Engagement.
    Soyez rassuré, car même si je fais participer l’ensemble des tables à la requête, DB2 qui est doté d’un système expert de première bourre, transforme de lui-même la requête pour ne pas perdre de temps à crapahuter dans les tables intermédiaires : voyez la Requête 4 (identification relative, 2e variante) du 4e exemple du paragraphe 1.7 de l’article.

    Citation Envoyé par ego Voir le message
    Je suis donc sceptique sur ces optimisations a priori même si je les comprend dans le cas où l'application aura montrée des faiblesses en termes de performance. Mais là il faut voir les traitements effectués et non partir sur des a priori
    Un DBA n’écrit pas « dans le cas où l'application aura montrée des faiblesses en termes de performance », mais « dans le cas où l'on a démontré que l'application montrera des faiblesses en termes de performance, avant même que les développements ne commencent ». En s’entretenant avec les concepteurs et des chefs de projet, à l’occasion de réunions à ce sujet, le DBA doit identifier les traitements transactionnels et batchs qui poseront des problèmes de performance. Ceci fait, il construit un prototype de performances et bien avant le début des développements, il doit rendre son verdict et faire faire les transformations qui s’imposent.

    Bref apprenez le métier de DBA au lieu de parler des a priori.

    Maintenant, comme MacFly, j’arrête parce que vous lassez le DBA que je suis et j’ai d’autres chantiers en cours qui, pendant ce temps, restent en plan.

    ___________________

    ¹ Il est hélas habituel de plaquer au niveau relationnel les options conceptuelles, platoniciennes, conséquence des règles de dérivation énoncées par des gens qui n’ont aucune idée du fonctionnement d’un optimiseur de SGBDR et raisonnent séquentiellement, cf. les calculs puérils et archaïques des « primitives d’accès » (bonnes seulement quand on utilise des systèmes de gestion de fichiers ou des SGBD pré-relationnels) à la façon des auteurs de « La Méthode Merise, Tome 1, Principes et outils ».
    (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.

  13. #13
    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 : 55
    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
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    @fsmrel
    Désolé pour le dérangement

    Mais c'est vous qui avez expliqué qu'il y avait 2 écoles, je cherche donc juste, en forçant le trait, à comprendre pourquoi vous et d'autres avez fait le choix de l'une d'entre elles.
    L'autre école, celle à laquelle vous n'adhérez pas, est donc totalement à côté de la plaque ?

  14. #14
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir ego,


    Citation Envoyé par ego Voir le message
    @fsmrel
    Désolé pour le dérangement

    Mais c'est vous qui avez expliqué qu'il y avait 2 écoles, je cherche donc juste, en forçant le trait, à comprendre pourquoi vous et d'autres avez fait le choix de l'une d'entre elles.
    L'autre école, celle à laquelle vous n'adhérez pas, est donc totalement à côté de la plaque ?
    Pourriez-vous me donner les coordonnées du message où je parle de deux écoles, que je puisse me pencher sur cette affaire.

    Merci
    (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.

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut
    Bonsoir,

    Les 2 "écoles", c'est identification absolue vs identification relative.
    Vous en parlez dans le présent topic en ces termes :

    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.

+ 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