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

SQL Firebird Discussion :

Table de jonction , relation n:n


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut Table de jonction , relation n:n
    Bonjour,

    Une question de débutant mais bon .... :

    Dans la cadre d'une relation n:n, j'ai deux tables reliées par une table de jonction contenant deux attributs (les PK de mes 2 tables). Comment faire pour mette à jour cette table lors de l'insertion d'un nouvel enregistrement ?

    Pour les suppression ou les modifications, cela se fait automatiquement par le biais des clé étrangères, mais quid de l'insertion ?

    Faut-il faire un trigger, comment ?

    merci de votre aide

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Table de jonction , relation n:n
    Citation Envoyé par Equus
    Bonjour,

    Une question de débutant mais bon .... :

    Dans la cadre d'une relation n:n, j'ai deux tables reliées par une table de jonction contenant deux attributs (les PK de mes 2 tables). Comment faire pour mette à jour cette table lors de l'insertion d'un nouvel enregistrement ?
    Il n'y a rien de bien compliqué, il suffit de faire un simple INSERT dans votre table de jonction. Et c'est le seul moyen car je ne vois comment un trigger ou tout autre programme pourrait deviner quel jonction créer...

    J'ai une table Employés, une table Projets et une table jonction "travail sur". J'insère des employés puis j'insère des projets et enfin il faut bien que je précise qui travail sur quels projets et pour celà j'insère dans la table "travail sur".

  3. #3
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Tu pourrais éventuellement créer une vue sur tes deux tables (pas la jonction), et un trigger (qui se déclenche au moment ou tu insère des données dans la vue) qui insère les données entrées dans la vue dans la jonction... A moins que ceci sois impossible avec Interbase, mais ça m'étonnerais.

    [EDIT]: pas clair, je m'explique.

    Tu crée une table tb_1, avec deux champ (pk_1 et champ1), tu crée ta deuxième table tb_2 avec deux champ itou (pk_2 et champ2), puis ta table associative (jonction) avec les champs (pk_fk_tb1, pk_fk_tb2).

    Maintenant, tu crée une vue sur tb_1 et tb_2 ou tu sélectionne pk_1, champ1, pk_2, champ2 avec un where pk_1=pk_fk_tb1 and pk_2=pk_fk_tb2.

    Au moment ou un utilisateur tentera d'entrer des données dans la vue, le trigger devra se déclencher et entrer comme données dans la table associative new.pk_1 et new.pk_2.

    plus clair, ou toujours pas asser?

    [RE-EDIT]

    Toujours pas? alors tapons dans le code

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    CREATE TABLE tb_1 (
    pk_1 integer not null,
    champ1 varchar(30),
    constraint ct_pk_tb_1 primary key (pk_1));
     
    CREATE TABLE tb_2 (
    pk_2 integer not null,
    champ2 varchar(30),
    constraint ct_pk_tb_2 primary key (pk_2));
     
    CREATE TABLE tb_associative (
    pk_fk_tb1 integer not null,
    pk_fk_tb2 integer not null,
    constraint ct_pk_tb_ass primary key (pk_fk_tb1,pk_fk_tb2),
    constraint ct_fk_tb1 foreign key (pk_fk_tb1) references tb_1(pk_1),
    constraint ct_fk_tb2 foreign key (pk_fk_tb2) references tb_2(pk_2));
     
    CREATE VIEW vu_selection AS
    SELECT pk_1,champ1,pk_2,champ2
    FROM tb_1,tb_2,tb_associative
    WHERE pk_1=pk_fk_tb1 AND pk_2=pk_fk_tb2;
     
    SET TERM ^;
     
    CREATE TRIGGER tr_tb_ass FOR vu_selection
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
     INSERT INTO tb_1 VALUES (new.pk_1,new.champ1);
     INSERT INTO tb_2 VALUES (new.pk_2,new.champ2);
     INSERT INTO tb_associative VALUES (new.pk_1,new.pk_2);
    END
     ^
     
    COMMIT WORK;
    Je vois pas comment je pourrais être plus clair...
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    Ok, merci pour toutes ces explications.

    Je vais tenter le coup de la vue. Cette vue permettra-t-elle de voir plusieurs enregistrement de tb2 pour 1 enregistrement de tb1 ?(c'est lobjectif d'une relation n:n)

    Merci

  5. #5
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    hélas, pas comme je l'ai faite! regarde avec les INNER JOIN, au lieu du WHERE dans la vue. j'ai fait cet exemple à la va vite, désolé...

    [TIENS, ENCORE UN EDIT]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW vu_selection AS
    SELECT pk_1,champ1,pk_2,champ2
    FROM tb_1 INNER JOIN tb_associative INNER JOIN tb_2
    ON pk_2=pk_fk_tb2 ON pk_fk_tb1=pk_1;
    Comme ça, ça doit marcher!

    A plus!
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    Ok super merci pour tout

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Cette solution n'est valable que pour la première jointure (relation 1:1).

    Pour reprendre mon exemple
    Un employé peux travailler sur plusieurs projets
    Un projet peut etre réalisé par plusieurs employés.

    On a bien une relation n:n qui va se matérialiser par une table "Travail" qui contient deux clés étrangères (PK_Employé et PK_Projet).

    La solution de la vue peut fonctionner pour inserer les employés travaillant sur un seul projet et ce projet est réalisé uniquement par cet employé.

    Si on veux gérer tous les cas de figures celà devient plus compliqué :

    Nouvel employé, nouveau projet (cas géré par votre vue)
    Nouvel employé, projet existant.
    Employé existant, Nouveau projet.
    Employé existant, projet existant.
    Gestion du changement d'affectation d'un employé à un projet. Etc...

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut,

    Si je suis à ta place Equus, je creerais une procedure stocké (avec en paramètres les champs des 2 tables reliées) qui va faire les insert dans tes 3 tables.
    Comme ça c'est plus propre et puis l'insertion dans la table de jointure est transparente au niveau de l'appli client.

    A+
    On progresse .....

Discussions similaires

  1. [AC-2007] Relation avec table de jonction
    Par Korleone dans le forum Modélisation
    Réponses: 2
    Dernier message: 31/12/2014, 18h51
  2. Table de jonction dans une relation ternaire
    Par younes2013 dans le forum Access
    Réponses: 3
    Dernier message: 16/11/2013, 02h53
  3. Réponses: 4
    Dernier message: 25/04/2007, 17h45
  4. Tables avec des relations & procédures dynamiques
    Par JustMe dans le forum Débuter
    Réponses: 5
    Dernier message: 15/12/2004, 09h58
  5. Exploitation d'une table possédant une relation recursive
    Par VincentR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/08/2004, 11h07

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