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 :

Cycles dans un MCD


Sujet :

Schéma

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 18
    Par défaut Cycles dans un MCD
    Bonjour,

    les cycles doivent être évités dans un MCD pour éviter la "redondance", si je peux acquérir une donnée à partir d'autres associations, il n'est pas nécessaire d'ajouter une association entre deux entités..
    Sauf que je pense que dans certains cas, il peut être plus pratique d'avoir une association directe (et donc un cycle) pour ne pas avoir à parcourir deux tables pour répondre à une requête à laquelle on répond plus facilement et rapidement si on a une association directe.
    exemple : groupe ----faire-----concert-----composer----morceau

    si on veut avoir les morceaux chantés par un groupe on a le choix entre ajouter une association chanter entre groupe et morceau, ou sinon parcourir parcourir les différents morceaux chantés dans les différents concerts

    Qu'en pensez-vous ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 217
    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 217
    Billets dans le blog
    16
    Par défaut
    Bonsoir jolla,


    En préambule.

    Supposons que nous modélisions les factures et les livraisons des produits facturés. Au niveau du MCD :
    [FACTURE]----1,1----(R)----1,1----[LIVRAISON]
    On a établi une bijection entre les deux entités-types, donc un cycle comme on va le montrer, alors que ça ne saute pas aux yeux. Du fait de la présence des deux cardinalités 1,1, la tradition merisienne veut qu’on fusionne FACTURE et LIVRAISON, mais je me gratte la tête : quel motif moins succinct peut bien nous pousser à faire de la salade sémantique ?

    Du point de vue de la théorie relationnelle, il est en effet on ne peut plus légal et légitime ne pas réaliser la fusion. On écrit sans problème :

    Relvar (variable relationnelle) FACTURE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VAR FACTURE BASE RELATION 
    {
            FactureId        FactureId
          , FactureDate      DATE
          , FactureHorsTaxe  Montant
          , FactureTVA       Montant
          , LivraisonId      LivraisonId
          , ...
    }
    KEY {FactureId}
    KEY {LivraisonId}
    FOREIGN KEY {LivraisonId} REFERENCES LIVRAISON ;
    Relvar LIVRAISON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VAR LIVRAISON BASE RELATION 
    {
            LivraisonId        LivraisonId
          , LivraisonDate      DATE
          , LivraisonAdresse   CHAR
          , LivraisonContact   CHAR
          , FactureId          FactureId
          , ...
    }
    KEY {LivraisonId}
    KEY {FactureId}
    FOREIGN KEY {FactureId} REFERENCES FACTURE ;
    Les deux clés étrangères (foreign keys) mettent formellement en évidence un cycle, mais il n’y a pas de problème au moment de créer une facture et la livraison correspondante, on procède par affectation multiple :

    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
    16
    INSERT FACTURE RELATION {TUPLE {FactureId          FactureId(123),
                                    FactureDate        '2012_09_26',
                                    FactureHorsTaxe    1000,
                                    FactureTVA         50,
                                    LivraisonId        LivraisonId(314),
                                    ... 
                                   }
                            } ,
    INSERT LIVRAISON RELATION {TUPLE {FactureId         FactureId(123),
                                      LivraisonDate     '2012_09_28',
                                      LivraisonAdresse  '12 rue de la dalle en pente',
                                      LivraisonContact  'Zorbec Legras',
                                      LivraisonId        LivraisonId(314),
                                      ... 
                                     }
                            } ;
    Les deux inserts font partie de la même instruction, ils y sont simplement séparés par une virgule. La fin de l’instruction est marquée par un point-virgule. Les contraintes d’intégrité ne sont vérifiées qu’à des frontières de points-virgules : en l’occurrence tout se passera donc bien.

    En revanche, les SGBD SQL ne permettent pas aujourd’hui de procéder par affectation multiple, aussi les deux clés étrangères créent une situation de blocage : la solution expéditive consiste alors à fusionner FACTURE et LIVRAISON. Sous forme de table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE FACTURE_LIVRAISON 
    (
            FactureId          INTEGER             NOT NULL
          , LivraisonId        INTEGER             NOT NULL
          , FactureDate        DATE                NOT NULL
          , FactureHorsTaxe    INTEGER             NOT NULL
          , FactureTVA         INTEGER             NOT NULL
          , LivraisonDate      DATE                NOT NULL
          , LivraisonAdresse   VARCHAR(80)         NOT NULL
          , LivraisonContact   VARCHAR(80)         NOT NULL
          , ...
        , PRIMARY KEY (FactureId)
        , UNIQUE (LivraisonId)
    ) ;

    On appelle ça pudiquement (au moyen d’un anglicisme) : optimiser, or ça n’est qu’une conséquence d’une lacune du langage SQL. Ceci a des effets sur le MCD (fusion d'entités-types), mais du jour où les SGBD SQL permettront l’affectation multiple, leurs utilisateurs n’auront plus à répercuter cette faiblesse du langage et les concepteurs pourront revoir leur position...


    Citation Envoyé par jolla Voir le message
    Sauf que je pense que dans certains cas, il peut être plus pratique d'avoir une association directe (et donc un cycle)
    Pour en revenir à votre exemple, je vous engage à ne pas établir d’association directe entre GROUPE et MORCEAU, à moins bien sûr que les groupes jouent des morceaux non programmés dans les concerts :
    [GROUPE]----1,N----(JOUER)----0,N----[MORCEAU]
    En effet, l’association JOUER est à l’origine d’effets secondaires contre lesquels vous devrez vous blinder, à savoir créer une contrainte de chemin (conterminous path), dont je donne ici une représentation plus ou moins formelle (et sujette à discussion au niveau du métamodèle) :




    Cette contrainte synthétise la règle suivante :
    Si le concert C donné par le groupe G comporte le morceau M, alors ce morceau doit faire partie de ceux qui sont joués par le groupe G.
    Cette représentation graphique ne comporte pas de cycle, mais bien deux chemins impliquant la paire {GROUPE, MORCEAU}, donnant l’illusion de cycle. Par contraste, la bijection établie entre FACTURE et LIVRAISON donne lieu à un cycle qui ne saute pas aux yeux, mais qui est authentique et mis en évidence par la présence des clés étrangères que comportent FACTURE et LIVRAISON au niveau logique.

    La contrainte de chemin fera évidemment l'objet d'une assertion ou de triggers au niveau SQL.


    De mon temps...

    Je me souviens que du temps où l’on ne connaissait pas encore la théorie relationnelle (inventée quand même en 1969), et qu’on commençait à se servir de Merise, c'est-à-dire au début des années quatre-vingts, en modélisant on était pollué par l’utilisation des SGBD navigationnels (IDS/2 essentiellement en France), conformes à la norme CODASYL, et pour celle-ci il était techniquement impossible que FACTURE et LIVRAISON soient représentées (en l’occurrence à l’aide d’un diagramme de Bachman) comme ci-dessous :



    Il ne nous restait plus qu’a fusionner les deux entités-types.

    Je pense que les problèmes techniques de jadis, du niveau logique, on encombré la tête des merisiens de problèmes existentiels au niveau conceptuel : pour ma part, après avoir clairement établi la distinction entre modèle entité-association (sémantique) et modèle relationnel (logico-mathématique), j’ai fait mon aggiornamento, ce qui ne m’empêche pas de surveiller les problèmes potentiels dus aux conterminous paths, tout en attendant que SQL soit mis à niveau (on peut rêver )...
    (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
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 217
    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 217
    Billets dans le blog
    16
    Par défaut
    Une mise au point.


    Citation Envoyé par fsmrel Voir le message

    On écrit sans problème :

    Relvar FACTURE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VAR FACTURE BASE RELATION 
    {
            FactureId        FactureId
          , FactureDate      DATE
          , FactureHorsTaxe  Montant
          , FactureTVA       Montant
          , LivraisonId      LivraisonId
          , ...
    }
    KEY {FactureId}
    KEY {LivraisonId}
    FOREIGN KEY {LivraisonId} REFERENCES LIVRAISON ;
    Relvar LIVRAISON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    VAR LIVRAISON BASE RELATION 
    {
            LivraisonId        LivraisonId
          , LivraisonDate      DATE
          , LivraisonAdresse   CHAR
          , LivraisonContact   CHAR
          , FactureId          FactureId
          , ...
    }
    KEY {LivraisonId}
    KEY {FactureId}
    FOREIGN KEY {FactureId} REFERENCES FACTURE ;
    Les deux clés étrangères (foreign keys) mettent formellement en évidence un cycle, mais il n’y a pas de problème au moment de créer une facture et la livraison correspondante, on procède par affectation multiple.
    J’apporte une précision et fais référence à ce qu’a écrit Chris Date dans Database Explorations, Essays on The Third Manifesto and Related Topics, au chapitre 13 « Inclusion Dependencies and Foreign Keys ».

    En réalité, l’utilisation des clés étrangères ne permet pas de garantir l’intégrité à 100%, on peut commettre l’infraction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FACTURE                                   LIVRAISON
    +------------+--------------+             +--------------+------------+
    | FactureId  |  LivraisonId |             | LivraisonId  |  FactureId |
    |------------+--------------|             |--------------+------------|
    |       123  |          314 |             |         314  |        456 |
    |       456  |          271 |             |         271  |        123 |
    +------------+--------------+             +--------------+------------+
    En effet, le constat est que l'on contrôle l’intégrité de référence seulement pour les singletons {FactureId} et {LivraisonId} alors qu’on doit garantir celle des paires {FactureId, LivraisonId}.

    Pour empêcher cette infraction, il faut mettre en œuvre la contrainte suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONSTRAINT FACTURE_LIVRAISON_CHK01
        FACTURE {FactureId, LivraisonId} = LIVRAISON {FactureId, LivraisonId} ;
    La définition des structures est alors à débarrasser des clés étrangères devenues inutiles :

    Relvar FACTURE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    VAR FACTURE BASE RELATION 
    {
            FactureId        FactureId
          , FactureDate      DATE
          , FactureHorsTaxe  Montant
          , FactureTVA       Montant
          , LivraisonId      LivraisonId
          , ...
    }
    KEY {FactureId}
    KEY {LivraisonId} ;
    Relvar LIVRAISON :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    VAR LIVRAISON BASE RELATION 
    {
            LivraisonId        LivraisonId
          , LivraisonDate      DATE
          , LivraisonAdresse   CHAR
          , LivraisonContact   CHAR
          , FactureId          FactureId
          , ...
    }
    KEY {LivraisonId}
    KEY {FactureId} ;
    Il est quand même fort ce Chris Date...


    A propos de la redondance :

    La définition de la structure des relvars met en évidence une redondance due à la simultanéité de la paire {FactureId, LivraisonId} dans FACTURE et LIVRAISON, mais grâce à la contrainte FACTURE_LIVRAISON_CHK01 on est à l’abri des anomalies de mise à jour, donc cette redondance ne gêne en rien.
    (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.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 18
    Par défaut
    Bonsoir fsmrel

    merci beaucoup pour l'explication, j'ai quand même une question,
    si un morceau est joué par un et un seul groupe, je pense que l'ajout
    de l'association ne pose pas problème dans ce cas, n'est-ce pas ?

    Merci beaucoup

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Le tout est de définir si un morceau n'est toujours joué que par un seul groupe ou si c'est le cas seulement de certains morceaux.

    Mais d'une manière générale, évite les cycles. C'est bien plus source de problèmes que d'ajouter des jointures pour obtenir les informations souhaitées.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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


    Citation Envoyé par jolla Voir le message
    si un morceau est joué par un et un seul groupe, je pense que l'ajout de l'association ne pose pas problème dans ce cas, n'est-ce pas ?
    Voulez-vous dire que dans ce cas il est inutile de d’embarrasser de contraintes ? Le MCD se simplifierait ainsi :
    Supposons maintenant que le morceau M2 soit joué seulement par le groupe G2 et que le groupe G1 donne le concert C1. En l’état, qu’est ce qui empêche que le concert C1 comporte le morceau M2 ? Rien. Si le morceau M2 est joué par le groupe G2, il n'en est pas moins jouable par le groupe G1 si celui-ci en a envie...

    D’où la nécessité d’une contrainte pour empêcher cela (assertion ou trigger au niveau SQL) :
    Le morceau M ne peut faire partie du programme du concert C donné par le groupe G que si M est joué par G.
    (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.

  7. #7
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 217
    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 217
    Billets dans le blog
    16
    Par défaut Cycle et cycle
    Citation Envoyé par CinePhil Voir le message
    d'une manière générale, évite les cycles.
    Dans le cas d’un cycle authentique, oui, et si possible les situations dans lesquelles on est amené à définir des contraintes du genre contrainte de chemin afin de blinder la base de données.

    Maintenant, comme dirait TheGzD au vocabulaire fleuri (cf. cycles or multiple cascade paths), il y a cycle et cycle. Le MCD figurant dans mon message précédent comporte seulement un cycle graphique. Il y a un véritable cycle quand une entité-type a émis un stimulus qui lui revient d’une façon ou d’une autre.

    Exemple

    Prenons le cas de la représentation graphique ci-dessous : la suppression d’une occurrence de E2 est répercutée sur les occurrences de E3 associées, puis sur celles de E4, puis sur celles de E1, et E2 est touchée à son tour.

    Un AGL comme PowerAMC vérifie les cycles et nous avertit :




    Maintenant, il suffit de remplacer une cardinalité 1,1 par 0,N et le cycle est rompu, il n’est plus que graphique et PowerAMC ne trouve plus rien à redire :




    Au niveau logique

    Cas du cycle authentique :

    Alors qu’au niveau conceptuel (Figure 1) on avait droit à un simple avertissement, cette fois-ci la situation est jugée bloquante par AMC !




    Absence de cycle authentique :

    Le MCD de la figure 2 dans lequel le cycle est rompu donne lieu au MLD suivant :


    Un stimulus émis par E2 se propage jusqu’à R1, via E3, E4 et E1, mais ne parvient pas jusqu’à E2.


    A routes fins utiles, voici les définitions de ce qu’on appelle un chemin référentiel (referential path) et un cycle référentiel (referential cycle) selon le Modèle Relationnel de Données (in The Relational Database Dictionary) :

    Chemin référentiel

    Étant données les relvars Rz, Ry, Rx, ..., Rb, Ra, telles qu’il existe une contrainte référentielle de Rz à Ry, une contrainte référentielle de Ry à Rx, ..., et une contrainte référentielle de Rb à Ra : la chaîne des contraintes de Rz à Ra constitue un chemin référentiel de Rz à Ra (le nombre de contraintes dans la chaîne représente la longueur du chemin).

    Cycle référentiel

    Un chemin référentiel d’une relvar à elle-même. La modélisation des bases de données comportant de tels cycles est généralement contre-indiquée.

    N.B.

    Une relvar (abréviation de variable relationnelle) a pour homologue la table en SQL.
    Une contrainte référentielle met en jeu une clé étrangère (contexte de l'intégrité référentielle).
    (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.

Discussions similaires

  1. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00
  2. Probleme de cardinalité dans mon mcd/mpd
    Par bluecurve dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2006, 08h12
  3. Représentation d'une vue dans un MCD
    Par fredhali2000 dans le forum Schéma
    Réponses: 8
    Dernier message: 16/02/2006, 09h45
  4. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29
  5. Tables de référence dans un MCD
    Par MomoZeAsticot dans le forum Schéma
    Réponses: 6
    Dernier message: 21/02/2005, 14h37

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