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

Langage SQL Discussion :

Renseigner une table de jonction


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Renseigner une table de jonction
    Bonjour,

    Je voudrais m'assurer d'un point concernant l'insertion de valeurs dans une table de jonction.

    Dans mon exemple ci-dessous, j'ai une table DONNEES, avec une clé primaire multiple (composée de 4 champs FORME_ID,CHAMPS_1_ID,CHAMPS_2_ID et CHAMPS_3_ID) et une table FICHE relié via une table de jonction AFFILIATION_FICHE_DONNEES :

    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
    17
    18
    19
    20
    CREATE TABLE DONNEES
    (
       Donnees_Nom varchar(250) binary not null,
       Donnees_Date_Start datetime,
       Donnees_Date_End datetime,
       FORME_ID mediumint unsigned,
       CHAMPS_1_ID mediumint unsigned,
       CHAMPS_2_ID mediumint unsigned,
       CHAMPS_3_ID mediumint unsigned,
       FORME_CATEGORIE_ID mediumint unsigned not null,
       LOCAL_ID mediumint unsigned not null,
       PRIMARY KEY (FORME_ID,CHAMPS_1_ID,CHAMPS_2_ID,CHAMPS_3_ID),
       UNIQUE (Donnees_Nom),
       CONSTRAINT FK_DONNEES_FORME FOREIGN KEY (FORME_ID) REFERENCES FORME (FORME_ID) ON DELETE CASCADE,
       CONSTRAINT FK_DONNEES_CHAMPS_1 FOREIGN KEY (CHAMPS_1_ID) REFERENCES CHAMPS_1 (CHAMPS_1_ID) ON DELETE CASCADE,
       CONSTRAINT FK_DONNEES_CHAMPS_2 FOREIGN KEY (CHAMPS_2_ID) REFERENCES CHAMPS_2 (CHAMPS_2_ID) ON DELETE CASCADE,
       CONSTRAINT FK_DONNEES_CHAMPS_3 FOREIGN KEY (CHAMPS_3_ID) REFERENCES CHAMPS_3 (CHAMPS_3_ID) ON DELETE CASCADE,
       CONSTRAINT FK_DONNEES_FORME_CATEGORIE FOREIGN KEY (FORME_CATEGORIE_ID) REFERENCES FORME_CATEGORIE (FORME_CATEGORIE_ID) ON DELETE CASCADE,
       CONSTRAINT FK_DONNEES_LOCAL FOREIGN KEY (LOCAL_ID) REFERENCES LOCAL (LOCAL_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
    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
    17
    create table FICHE
    (
       FICHE_ID mediumint unsigned not null auto_increment,
       Fiche_Nom varchar(255) binary not null,
       Fiche_Date datetime not null,
       CHAMPS_1_ID mediumint unsigned,
       CHAMPS_2_ID mediumint unsigned,
       CHAMPS_3_ID mediumint unsigned,
       EXTENSION_ID mediumint unsigned not null,
       primary key (FICHE_ID),
       unique (Fiche_Nom),
       INDEX IND_FICHE (Fiche_Nom),
       CONSTRAINT FK_FICHE_CHAMPS_1 FOREIGN KEY (CHAMPS_1_ID) REFERENCES CHAMPS_1 (CHAMPS_1_ID) ON DELETE CASCADE,
       CONSTRAINT FK_FICHE_CHAMPS_2 FOREIGN KEY (CHAMPS_2_ID) REFERENCES CHAMPS_2 (CHAMPS_2_ID) ON DELETE CASCADE,
       CONSTRAINT FK_FICHE_CHAMPS_3 FOREIGN KEY (CHAMPS_3_ID) REFERENCES CHAMPS_3 (CHAMPS_3_ID) ON DELETE CASCADE,
       CONSTRAINT FK_FICHE_EXTENSION FOREIGN KEY (EXTENSION_ID) REFERENCES EXTENSION (EXTENSION_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    create table AFFILIATION_FICHE_DONNEES
    (
       FICHE_ID mediumint unsigned not null,
       FORME_ID mediumint unsigned,
       CHAMPS_1_ID mediumint unsigned,
       CHAMPS_2_ID mediumint unsigned,
       CHAMPS_3_ID mediumint unsigned,
       primary key (FICHE_ID , FORME_ID , CHAMPS_1_ID , CHAMPS_2_ID , CHAMPS_3_ID),
       INDEX IND_AFFILIATION_FICHE_DONNEES_FICHE (FICHE_ID),
       CONSTRAINT FK_AFFILIATION_FICHE_DONNEES_FICHE FOREIGN KEY (FICHE_ID) REFERENCES FICHE (FICHE_ID) ON DELETE CASCADE,
       INDEX IND_AFFILIATION_FICHE_DONNEES_DONNEES_PRIMKEY (FORME_ID , CHAMPS_1_ID , CHAMPS_2_ID , CHAMPS_3_ID),
       CONSTRAINT FK_AFFILIATION_FICHE_DONNEES_DONNEES_PRIMKEY FOREIGN KEY (FORME_ID , CHAMPS_1_ID , CHAMPS_2_ID , CHAMPS_3_ID) REFERENCES DONNEES (FORME_ID , CHAMPS_1_ID , CHAMPS_2_ID , CHAMPS_3_ID) ON DELETE CASCADE
    ) ENGINE = InnoDB;
    Le remplissage de la table de jonction AFFILIATION_FICHE_DONNEES se fait-il tout simplement de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into AFFILIATION_FICHE_DONNEES (FICHE_ID,FORME_ID,CHAMPS_1_ID,CHAMPS_2_ID,CHAMPS_3_ID) VALUES ('valeur_fiche_id','valeur_forme_id','valeur_champs_1_id','valeur_champs_2_id','valeur_champs_3_id')
    Quel est succinctement l'intérêt des jointures (avec le mot clé JOIN) par rapport à une table de jonction ? Est-ce que cela n'a aucun rapport ?

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je déduis de la structure de la table DONNEES qu'il s'agit déjà d'une table de jonction (que j'appelle plutôt table associative, c'est à dire issue d'une association entre N entités du MCD).
    Associeer de nouveau cette table à une autre est plutôt rare et, en principe, pas permis par le formalisme MCD de Merise (mais fsmrel dirait qu'en schéma entity-relationship c'est faisable).

    N'y aurait-il pas un problème de conception ?
    On peut avoir le MCD qui correspond à cette construction bizarre ?
    Et à quoi correspondent ces notions de FICHE, DONNEE...

    Venons-en à la requête d'insertion...
    Telle qu'elle est écrite, elle ne fonctionnera pas car elle essaiera d'insérer des valeur de type texte dans des colonnes de type numérique !

    Sinon on peut effectivement remplir les table selon ce principe. Après tout dépend d'où viennent les données. Si elles viennent d'un formulaire avec des listes déroulantes qui enregistrent comme résultat directement l'ID de la fiche par exemple, inutile de faire une jointure pour récupérer cet ID. Mais si le formulaire ne mémorise que le nom de la fiche, il faut alors faire une jointure pour récupérer son ID et l'insérer dans la table associative.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Renseigner une table de jonction

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Renseigner une table de jonction

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 27
    Points
    27
    Par défaut Renseigner une table de jonction

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En fait la table "FICHE" contient la liste des fichiers qui comprennent chacun un ou plusieurs types de données différents. (J'ai renommé "DONNEES" en "DONNEES_TYPE").
    Donc pour moi il y a simplement une association :
    FICHE -1,n----Comprendre----0,n- DONNEES_TYPE

    Dans le morceau de MCD ci-dessus, DONNEES_TYPE est une entité qui a donc son propre identifiant et non pas une clé primaire composée.
    Et il y aura au milieu une table associative entre FICHE et DONNEES_TYPE.

    Dans le nom d'un fichier (ou fiche), il y a 3 champs (Champs_1_Nom, Champs_2_Nom, Champs_3_Nom)
    Pourquoi ne pas les avoir mis en attribut de l'entité FICHE ?

    Tu pourrais donner un ou deux exemples de données parce que j'ai vraiment du mal à voir de quoi il s'agit et pourquoi ce modèle est si compliqué.

    Concernant la requête en PHP : puisque les colonnes à alimenter sont de type numérique, inutile de s'embêter à encadrer les variables par des ' !
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req = "INSERT INTO AFFILIATION_FICHE_DONNEES_TYPE
      (FICHE_ID, INSTRUMENT_ID, CHAMPS_1_ID, CHAMPS_2_ID, CHAMPS_3_ID) 
    VALUES ($fiche_id, $instrument_id, $champs_1_id, $champs_2_id, $champs_3_id)";


    Plus simple non ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

Discussions similaires

  1. [AC-2007] Mise à jour d'une table avec jonction
    Par Korleone dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/03/2014, 20h50
  2. [AC-2003] Requête sans doublon ? dans une table de jonction ?
    Par artus59 dans le forum Modélisation
    Réponses: 3
    Dernier message: 04/07/2013, 22h35
  3. [AC-2007] création d'une table de jonction
    Par gengler dans le forum Access
    Réponses: 1
    Dernier message: 05/12/2011, 10h54
  4. [AC-2003] Comment renseigner une table intermédiaire ?
    Par vali25 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/04/2010, 12h11
  5. Renseigner une list box à partir du champ d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 5
    Dernier message: 21/11/2006, 17h23

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