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

Décisions SGBD Discussion :

Jointure avec table associative


Sujet :

Décisions SGBD

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut Jointure avec table associative
    Bonjour, Je m'excuse par avance si je n'ai pas posté au bon endroit, ma question porte sur la création de table plus que sur les SGBD en générale et j'ai l'impression que cette partie porte plus sur ces derniers mais je ne voyais pas où poster sinon. (Dites mois si il faut que je déplace le post)

    Je possède 2 tables : gateaux et fours.
    Les deux sont liés par une relation 1-n : un gateau n'est que dans un four et un four peut avoir plusieurs gateaux et les gateaux sont cuisinés par cycle (1,2,3,...)

    J'ai vu sur le forum qu'il fallait mettre en place une table associative j'aurai donc :

    gateaux ----1,1 - cycles -1,n---- fours : un gateau est dans 1 seul cycle et un four a un ou plusieurs cycles.

    dans cycle je me retrouve donc avec 2 cles etrangeres (les ids de fours et gateaux) ainsi que le numero du cycle.

    C'est la que je me pose quelques questions :
    - Est-ce que le numero de cycle doit-être obligatoirement être une clé primaire? (dans les exemples que j'ai vu, cétait toujours une clé primaire.)
    - Avec une requête SQL est il possible de récupérer le four dans lequel a été le gateau et le cycle associé juste avec cette seule liaison? Ou faut il faire une autre liaison entre gateaux et fours en plus de la table associative?

    Si quelqu'un peut m'éclairer ce serait vraiment gentil.
    N'hésitez pas à me dire ce n'est pas clair.

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous dites :

    un gateau n'est que dans un four et un four peut avoir plusieurs gateaux et les gateaux sont cuisinés par cycle
    ...
    un gateau est dans 1 seul cycle et un four a un ou plusieurs cycles.
    Est-ce que les fours ont plusieurs cycles, et les types de gâteaux sont cuisinés à des cycles prédéfinis ?
    Ou bien est-ce que les gâteaux ne peuvent être cuisinés que par un (ou plusieurs) fours précis, et chacun des fours a un cycle précis ?

    @++

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour.

    Merci de vous pencher sur mon cas.
    En effet les fours ont plusieurs cycles. Plus précisément un four comporte 4 cycles (entre son lancement en début de journée et son arrêt)
    On a donc les gâteaux qui sont issus d'un cycle associé à un four.
    Par exemple :
    gateau 1 -> cycle 1 -> four 1 : le gateau 1 à été cuit dans le four 1 pendant le 1er cycle du four
    gateau 2 -> cycle 3 -> four 1 : le gateau 2 à été cuit dans le four 1 pendant le 3eme cycle du four
    gateau 5 -> cycle 2 -> four 3 : le gateau 5 à été cuit dans le four 3 pendant le 2eme cycle du four

    Donc tous les fours possèdent les mêmes cycles (1,2,3 ou4) et chaque gâteau à été cuit dans un four qui était dans son n éme cycle.

    Je ne sais pas si c'est plus clair?

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


    Je ne sais pas ce qu’est un cycle pour un four, mais si un four a plusieurs cycles, alors vous devez modéliser une entité-type FOUR et une entité-type faible FOUR_CYCLE (entité-type faible veut dire qu’un cycle en tant que tel n’a pas d’existence propre, un cycle n’est qu’un propriété multivaluée d’un four : la suppression d’un four fait que ses cycles disparaissent avec lui). Le four se comporte vis-à-vis de ses cycles comme une facture vis-à-vis de ses lignes.


    Dans ces conditions, vous pouvez représenter cela ainsi (j’utilise ici MySQL Workbench, gratuit) :




    Exemples d'instances :


    Table FOUR

    
    FourId    FourNom    
    ------    ----------
         1    four truc
         2    four tout
         3    four chose
    
    

    Table FOUR_CYCLE

    
    FourId    CycleNo    
    ------    -------
         1          1
         1          2
         1          3
         1          4
         2          1
         2          2
         2          3
         2          4
         3          1
         3          2
         3          3
         3          4
    
    

    En passant aux gâteaux :






    Table GATEAU

    
    GateauId    GateauNom       FourId    CycleNo
    --------    -----------     ------    -------
           1    éclair café          1          1
           2    baba                 1          3
           3    tarte tatin          1          1
           4    mille-feuille        1          2
           5    saint-honoré         3          2
           6    baba                 2          3
    
    
    Au plan gustatif, les conséquences de mes propres options seront sans aucun doute désastreuses, mais là n’est pas le sujet...


    A noter que tel baba a été cuit dans le four 1 et tel autre dans le four 2. Maintenant, si la table GATEAU héberge des types de gâteaux plutôt que des instances de gâteaux, alors {GateauNom} devrait être clé alternative de la table GATEAU.
    (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.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci pour cette réponse claire et précise.

    J'aurais juste une question. Quand vous dites entité faible, c'est juste une appellation(en fonction des cardinalités)? où faut-il faire quelque chose lors de la création de cette table en plus de déclarer Cycleno en clé primaire et FourId en clé étrangère?

    Merci encore.

    EDIT :
    Avec ces nouveau termes, j'ai fais quelque petites recherches et suis tombé sur quelques-unes de vos discussions : http://www.developpez.net/forums/d33...fiant-relatif/ .
    Dans si j'ai bien compris une entité faible est une sorte de table associative?

    Re-EDIT : Les cardinalité ne sont pas inversées? Le 1,n ne devrait pas être du côtés du four normalement car un four posséde 1 à n cycle non?

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


    Citation Envoyé par flavors
    Quand vous dites entité faible, c'est juste une appellation(en fonction des cardinalités) ? où faut-il faire quelque chose lors de la création de cette table en plus de déclarer Cycleno en clé primaire et FourId en clé étrangère?
    Tout d’abord je parle non pas d’entité, mais d’entité-type : une entité est une valeur (une instance, une occurrence) d’entité-type, ainsi, FOUR est une entité-type (type d’entité), tandis que <1, 'four truc' > en est une valeur.

    Techniquement parlant, au stade conceptuel, on dit que l’entité-type FOUR_CYCLE est identifiée relativement à l’entité-type FOUR, ce qui est la manière habituelle de procéder pour toute entité-type faible (weak entity type).

    Au stade SQL, la clé primaire de FOUR_TYPE est constituée de la paire {FourId, Cycleno}, comme l’indique le diagramme MySQL Workbench (présence des deux mickeys « » et « » pour cette clé primaire, la couleur rouge signifiant que FourId appartient aussi à une clé étrangère). Vous noterez la clause ON DELETE CASCADE utilisée pour la contrainte référentielle FOUR_CYCLE_FOUR_FK : quand un four meurt, ses cycles disparaissent de facto. Nonobstant, certains préfèrent identifier de manière absolue, c'est-à-dire considérer que la clé primaire de FOUR_TYPE n’est que le singleton {FourId} : mais, dans ces conditions, si par exemple vous voulez par une requête connaître le nom du four utilisé pour tel gâteau, vous devrez alors passer par une double jointure, entre autres joyeusetés.


    En tout cas, le code SQL correspondant est celui-ci (identification relative) :

    
    CREATE TABLE FOUR 
    (
            FourId              INT              NOT NULL
          , FourNom             VARCHAR(64)      NOT NULL
        , CONSTRAINT FOUR_PK PRIMARY KEY (FourId)
    ) ;
    
    CREATE TABLE FOUR_CYCLE 
    (
            FourId              INT              NOT NULL
          , Cycleno             INT              NOT NULL
        , CONSTRAINT FOUR_CYCLE_PK PRIMARY KEY (FourId, Cycleno)
        , CONSTRAINT FOUR_CYCLE_FOUR_FK FOREIGN KEY (FourId)
              REFERENCES FOUR (FourId)
              ON DELETE CASCADE
    ) ;
    
    CREATE TABLE GATEAU 
    (
            GateauId            INT              NOT NULL
          , GateauNom           VARCHAR(64)      NOT NULL
          , FourId              INT              NOT NULL
          , Cycleno             INT              NOT NULL
        , CONSTRAINT GATEAU PRIMARY KEY (GateauId)
        , CONSTRAINT GATEAU_FOUR_CYCLE_FK FOREIGN KEY (FourId, Cycleno)
              REFERENCES FOUR_CYCLE (FourId, Cycleno)
    ) ;
    
    INSERT INTO FOUR (FourId, FourNom) VALUES
               (1, 'four truc')
             , (2, 'four tout')
             , (3, 'four chose') 
    ;    
        
    INSERT INTO FOUR_CYCLE (FourId, Cycleno) VALUES
               (1, 1)
             , (1, 2) 
             , (1, 3)          
             , (1, 4)
             , (2, 1)          
             , (2, 2) 
             , (2, 3)         
             , (2, 4)         
             , (3, 1)          
             , (3, 2) 
             , (3, 3)         
             , (3, 4)         
    ;         
    
    INSERT INTO GATEAU (GateauId, GateauNom, FourId, CycleNo) VALUES
               (1, 'éclair café', 1, 1)
             , (2, 'baba', 1, 3)
             , (3, 'tarte tatin', 1, 1)
             , (4, 'mille-feuille', 1, 2)
             , (5, 'saint-honoré', 3, 2)
             , (6, 'baba', 2, 3)
      ;  
      
    SELECT * from FOUR ;
    SELECT * from FOUR_CYCLE ;
    SELECT * from GATEAU ;
    
    
    (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
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Ok c'est tout bon!
    Merci d'avoir pris le temps de rédiger cette superbe réponse qui m'a permis de bien saisir la chose.
    Je pensais qu'il fallait faire des choses compliquées pour utiliser la "relativité" mais ce n'est finalement qu'une simple façon de procédé pratique qui plus est puisqu'on utilise le delete_cascade et on évite des jointures c'est encore mieux!

    Merci encore, vous êtes vraiment très pédagogue.
    Bonne journée!

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

Discussions similaires

  1. @OneToMany - jointure avec table ou colonne ?
    Par Hole_geek dans le forum JPA
    Réponses: 0
    Dernier message: 14/03/2012, 12h24
  2. jointure avec table T030
    Par kercommun dans le forum SAP
    Réponses: 5
    Dernier message: 24/01/2011, 16h50
  3. Jointure avec tables contenant des memes noms de champs
    Par guy2004 dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/01/2010, 10h25
  4. [MySQL] Clé étrangère avec table association
    Par leototot dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/07/2009, 14h53
  5. sélection avec table associative
    Par Invité dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2009, 16h42

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