Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/10/2004, 09h56   #1
Invité régulier
 
Inscription : août 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 61
Points : 9
Points : 9
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
Equus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 10h34   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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".
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 10h38   #3
Membre éclairé
 
Avatar de Cerberes
 
Inscription : janvier 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 328
Points : 309
Points : 309
Envoyer un message via MSN à Cerberes
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 :
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...
Cerberes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 11h28   #4
Invité régulier
 
Inscription : août 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 61
Points : 9
Points : 9
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
Equus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 11h30   #5
Membre éclairé
 
Avatar de Cerberes
 
Inscription : janvier 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 328
Points : 309
Points : 309
Envoyer un message via MSN à Cerberes
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 :
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!
Cerberes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 11h45   #6
Invité régulier
 
Inscription : août 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 61
Points : 9
Points : 9
Ok super merci pour tout
Equus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 12h16   #7
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2004, 18h11   #8
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h21.


 
 
 
 
Partenaires

Hébergement Web