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 :

Validation Mcd, moyen plus simple ?


Sujet :

Schéma

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut Validation Mcd, moyen plus simple ?
    Bonjour,

    J'expose mon sujet : concerne le milieu de la vente de voitures.

    Une offre de voiture concerne une voiture ayant :
    - une marque (ex: Renault)
    - un modèle (ex : Clio)
    - une motorisation (ex: 1.5 Dci 85)
    - une finition (ex: Dynamique)

    Une motorisation concerne un modèle uniquement.
    Une finition concerne un modèle uniquement.

    Quand je veux sélectionner la liste des marques ayant au moins une offre:
    - je lie vn_offre à veh_motorisation
    - puis veh_motorisation à veh_modele
    - puis veh_modele à veh_marque

    Mais je pourrais tout aussi bien "passer" par veh_version ...
    Il y a donc 2 trajets "parallèles".

    Ce modèle est-il bien pertinent ?



    Merci du coup de pouce
    Seb
    Images attachées Images attachées  

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

    Petit problème : vous pouvez associer une offre Citroën à une motorisation Renault et à une finition Peugeot...

    Un moyen d'éviter cela serait d’utiliser l’identification relative pour propager la marque et le modèle de voiture jusqu’à l’offre.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut
    Bonjour,

    Merci pour cette réponse !
    Pourquoi ne pas propager juste ModeleId ?

    Par contre, faut propager ça à la main ou le définir en tant que relation ?

    Merci !
    Seb

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


    Citation Envoyé par seb_perl Voir le message
    Pourquoi ne pas propager juste ModeleId ?
    Considérons l’exemple tabulaire qui suit :


    Marque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MarqueId  MarqueNom
    --------   
        1     Renault
        2     Peugeot
        3     Citroen

    Modele

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MarqueId  ModeleId  ModeleNom
    --------  --------   
        1        1      Clio Nouvelle
        1        2      R5 d'époque
        2        1      302 super
        2        2      403 prestige
        3        1      DS19 de luxe
        3        2      2CV de compète

    Motorisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MarqueId  ModeleId  MotorisationId  Motorisation  CO2
    --------  --------  --------------   
        1        1           1              motor a    1
        1        1           2              motor b    5
        1        2           1              motor c    3
        1        2           2              motor d    1
        2        1           1              motor e    2
        2        1           2              motor f    6
        2        2           1              motor g    4
        2        2           2              motor h    1
        3        1           1              motor i    3
        3        1           2              motor j    5
        3        2           1              motor k    1
        3        2           2              motor l    1

    Finition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MarqueId  ModeleId  FinitionId  Finition
    --------  --------  ----------   
        1        1          1       fini a
        1        1          2       fini b
        1        2          1       fini c
        1        2          2       fini d
        2        1          1       fini e
        2        1          2       fini f
        2        2          1       fini g
        2        2          2       fini h
        3        1          1       fini i
        3        1          2       fini j
        3        2          1       fini k
        3        2          2       fini l

    Offre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MarqueId  ModeleId  OffreId  MotorisationId  FinitionId  Prix  NbPortes
    --------  --------  -------  --------------  
        1        1          1          1             1       10000    3
        1        1          2          1             1       11000    5
        1        1          3          2             1       15000    3
        2        1          1          1             2        6000    5 
       ...      ...        ...        ...           ...       ...    ...
    Concernant la table Modele, vous noterez que pour la marque Renault (MarqueId = 1), l’attribut ModeleId prend les valeurs successives 1, 2, etc., même chose pour les autres marques. Ceci vaut pour les tables Motorisation, Finition et Offre.

    Situons-nous maintenant sur un plan conceptuel.

    Quand je parle d’identification relative, par exemple identifier Modele relativement à Marque, je considère qu’au niveau conceptuel, Modele est une entité-type « faible » par rapport à Marque qui est une entité-type « forte » : la suppression d’une marque entraîne la suppression de ses modèles, car ceux-ci n’ont de sens ontologique qu’au travers d’une marque. Quand vous pensez « Clio », vous pensez « Renault ». Inversement, si vous supprimez un modèle, vous ne supprimez pas la marque. On peut encore dire que l’entité-type Modele est en réalité une propriété multivaluée de l’entité-type Marque (que je renomme ci-dessous MarqueGr) : du point de vue de la théorie relationnelle, la variable relationnelle Modele peut faire l’objet d’un attribut de type RELATION (table en SQL) :
    MarqueGr {MarqueId INTEGER, MarqueNom CHAR, Modele RELATION {ModeleId INTEGER, ModeleNom CHAR}}
    Ceci dit, il est d’usage se sortir les attributs de type RELATION et d’en faire des variables relationnelles comme les autres, à l’aide d’un opérateur relationnel appelé UNGROUP (dont le symétrique s’appelle GROUP). On peut ainsi produire des variables relationnelles dont la structure est plus familière et correspondent à la représentation tabulaire obtenue avec Workbench :
    Marque {MarqueId INTEGER, MarqueNom CHAR}

    Modele {MarqueId INTEGER, ModeleId INTEGER, ModeleNom CHAR}

    Traduction au niveau SQL :

    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
    15
    CREATE  TABLE Marque
    (
      MarqueId    INT           NOT NULL ,
      MarqueNom   VARCHAR(45)   NOT NULL ,
      PRIMARY KEY (MarqueId) 
    ) ;
    CREATE  TABLE Modele 
    (
      MarqueId    INT           NOT NULL ,
      ModeleId    INT           NOT NULL ,
      ModeleNom   VARCHAR(45)   NOT NULL ,
      PRIMARY KEY (MarqueId, ModeleId) ,
      CONSTRAINT Modele_Marque_fk
        FOREIGN KEY (MarqueId) REFERENCES Marque (MarqueId)
    ) ;

    Vous noterez que l’attribut MarqueId entre dans la composition de la clé primaire de Modele, mais aussi dans la composition de la clé étrangère permettant de référencer la table Marque.

    Vous pouvez tout à fait propager ModeleId seul, c'est-à-dire ne pas utiliser l’identification relative à Marque :




    Ce qui donne en SQL :

    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
    15
    CREATE  TABLE Marque
    (
      MarqueId    INT           NOT NULL ,
      MarqueNom   VARCHAR(45)   NOT NULL ,
      PRIMARY KEY (MarqueId) 
    ) ;
    CREATE  TABLE Modele 
    (
      MarqueId    INT           NOT NULL ,
      ModeleId    INT           NOT NULL ,
      ModeleNom   VARCHAR(45)   NOT NULL ,
      PRIMARY KEY (ModeleId) ,
      CONSTRAINT Modele_Marque_fk
        FOREIGN KEY (MarqueId) REFERENCES Marque (MarqueId)
    ) ;

    Seule la composition de la clé primaire de la table Modele a changé.

    Personnellement, je préfère conserver l’identification relative entre Marque et Modele, car :

    1) Au niveau conceptuel, d’un point de vue sémantique, ontologique, on perçoit parfaitement les choses ;

    2) Au niveau logique (disons Workbench) puis SQL, on peut ainsi améliorer certaines requêtes, du genre :
    Quel est le prix moyen d’une offre par marque ?

    Requête que l’on code ainsi (une seule jointure) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.MarqueNom, AVG(b.prix) AS PrixMoyen
    FROM   Marque AS a
             JOIN Offre AS b ON a.MarqueId = b.MarqueId 
    GROUP BY b.MarqueId, a.MarqueNom ;
    Alors qu’en n’identifiant que relativement au modèle, on doit coder (une jointure supplémentaire) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.MarqueNom, AVG(c.prix) AS PrixMoyen
    FROM   Marque AS a
             JOIN Modele AS b ON a.MarqueId = b.MarqueId 
             JOIN Offre AS  c ON b.ModeleId = c.ModeleId 
    GROUP BY b.MarqueId, a.MarqueNom ;
    Vous me direz qu’une jointure de plus, ça n’est pas dramatique : cependant, quand vous avez des tables comportant cent millions de lignes, l’économie n’est pas mince. Et puis, le nombre de tables intermédiaires entre une table « racine » telle que Marque et une table « feuille » telle que Offre peut être plus conséquent. Je vous renvoie à ce sujet au message suivant, qui traite de commandes et de livraisons par camion :

    http://www.developpez.net/forums/d62...s/#post4843686
    3) Au niveau physique, on joue essentiellement sur les performances. A ce sujet, je vous renvoie au message dont je viens de faire mention.


    Citation Envoyé par seb_perl Voir le message
    faut propager ça à la main ou le définir en tant que relation ?
    Supposons que nous conservions MarqueId comme identifiant générique, à propager jusqu’à Offre.

    La clé primaire de Modèle est donc définie par le couple {MarqueId, ModeleId}, ce qui signifie que, pour établir une relation entre Marque et Modele, il suffit d’utiliser l’icône proposée par Workbench :
    Place a new 1:n Identifying Relationship
    Le principe est le même concernant Motorisation relativement à Modele, pour obtenir une clé primaire qui soit le triplet {MarqueId, ModeleId, MotorisationId} ; idem pour Finition.

    Offre est identifiée relativement à Modèle, mais pas à Motorisation et Finition. J’aurais pu identifier relativement soit à Motorisation, soit à Finition, mais pas au deux en même temps, car la clé primaire aurait été une surclé réductible (présence d’attributs dangereusement superflus) : ne faisons donc pas de jaloux Quoi qu’il en soit, j’ai utilisé l’icône
    Place a new 1:n Non-Identifying Relationship
    entre Motorisation et Offre d’une part, puis Finition et Offre d’autre part.

    Au résultat, Offre a l’allure suivante qui n’est pas satisfaisante :



    Il y a donc quelques actions à réaliser pour retrouver le MLD que je vous avais proposé dans mon précédent message :

    1) Intégrer les attributs MarqueId et ModeleId à la clé primaire




    =>




    2) La relation entre Offre et Motorisation convient :




    Par contre, la relation entre Offre et Motorisation n’est pas satisfaisante, car les attributs MarqueId1 et ModeleId1 sont inutiles :



    On modifie donc en conséquence la composition de la clé étrangère Offre_Finition_Fk :



    3) Les attributs MarqueId1 et ModeleId1 ne jouent plus de rôle particulier :



    On peut donc les supprimer et l’on retrouve le MLD attendu :


  5. #5
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 35
    Par défaut
    Bonjour fsmrel,

    Alors là ...
    Je viens de prendre une LECON mais dans le bon sens du terme !

    Je vais étudier ça au calme.

    Je te remercie d'avoir pris du temps pour m'exposer si en détails les choses.
    C'est une entraide rare de nos jours !!!

    A bientôt
    Seb

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


    J’ai détaillé les choses parce que l’on est en présence d’un cas de figure qui n’est pas toujours modélisable de façon formelle au niveau conceptuel (c’est pourquoi j’ai agi un cran en-dessous, au niveau « logique »). Au niveau conceptuel, représenter les entités-types Marque, Modele, Motorisation, Finition et leurs relations ne pose aucune difficulté, par contre on bute quand il s’agit de représenter l’entité-type Offre, du fait de la contrainte :

    La motorisation et la finition faisant partie de l’offre concernent un même modèle (d’une même marque).

    Dans le cas de Merise/2, la contrainte peut-être représentée, sinon il faut se résoudre à intervenir manuellement au niveau logique, comme je l’ai fait.

    En outre, je suppose que, le fait d’avoir détaillé les opérations effectuées à ce niveau, peut intéresser certains concepteurs confrontés à ce genre de contrainte. A cette occasion, je les invite à tenter une rétroconception pertinente...

Discussions similaires

  1. [Toutes versions] y a t-il un moyen plus simple
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/03/2015, 22h43
  2. Moyen le plus simple pour paralléliser avec données partagées
    Par ymoreau dans le forum Multithreading
    Réponses: 22
    Dernier message: 21/05/2012, 16h45
  3. [MCD] MCD bien compliqué: y avait-il plus simple?
    Par johnny3 dans le forum Schéma
    Réponses: 2
    Dernier message: 26/06/2009, 08h53
  4. [JDOM] Moyen le plus simple de valider une trame XML que l'on vient de créer ?
    Par scougirou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/06/2007, 14h16
  5. [Quartz] Quartz 2D le moyen le plus simple pour les images
    Par NiamorH dans le forum Développement OS X
    Réponses: 6
    Dernier message: 02/05/2007, 17h34

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