Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
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 25/04/2005, 11h33   #1
Invité de passage
 
Inscription : octobre 2004
Messages : 16
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 16
Points : 2
Points : 2
Par défaut [Résolu]Association 1:n sur une meme table

Bonjour,

J'ai un petit soucis de conception sur une association.
Je souhaite associer ma table image a elle meme par une relation 1:n dans le sens ou une image peut etre lier a plusieurs autres images.

Je travaille sous dbdesigner mais javoue, je comprend pas trop ca logique a ce niveau... En effet il crée une clé sur idimage qui est l'identifiant de la table mais je ne vois pas comment l'association avec les autres images peut se faire dans ce cas... Ne devrait-il pas plutot y avoir une table secondaire pour faire la liaison image 1 lié à la 2 et 3 ....

| IMAGE |
|----------------------|----| Foreign key Image_FKindex sur image_idimage
|IdImage_______|----|
|Path__________|
|Image_Idimage_|

Je ne vois pas comment cette association peux marcher pour demander a quel image l une est associe. Est ce une erreur de generation de table ou alors tou simplement mon choix de relation ki nest pas bon.

Merci pour vos conseils ou pour l'eclaircissement de cette situation ;-)

Bonne journee
dafalcon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 11h58   #2
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
Il te faut en effet une table en plus, avec une clef primaire (image1,image2) pour savoir quoi est lié avec quoi.
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 12h57   #3
Invité de passage
 
Inscription : octobre 2004
Messages : 16
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 16
Points : 2
Points : 2
Citation:
Envoyé par mirak63
Il te faut en effet une table en plus, avec une clef primaire (image1,image2) pour savoir quoi est lié avec quoi.
Ok c bien ce que je me disai.

Merci pour ta reponse mirak63
dafalcon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 14h21   #4
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Citation:
Envoyé par mirak63
Il te faut en effet une table en plus, avec une clef primaire (image1,image2) pour savoir quoi est lié avec quoi.
Absolument pas. Ca serait le cas si ta relation était n:n

Exemple de requête pour avoir tes images liées :

Code :
1
2
3
 
SELECT Img_Principale.IdImage, Img_Liee.IdImage
FROM IMAGE Img_Principale LEFT JOIN IMAGE Img_Liee ON Img_Principale.IdImage = Img_Liee.Image_IdImage;
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 15h43   #5
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
Pour moi ce que tu lui proposes va vachement restreindre les possiblités de ce qu'il semble vouloir faire
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 16h48   #6
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Soit la relation est 1:n soit elle est n:n. Que le lien soit entre deux tables différentes ou la même ne change rien. Tu ne vas pas créer une table intérmédiaire pour chaque relation 1:n sous prétexte de prévoir l'avenir non ?
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 17h17   #7
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
Ben une relation 1:n pour moi ça veut pas dire grand chose car il manquerait la cardinalité minimale pour les liens.
En uml ou en entité associtation il faut au moins 4 nombres pour decrire entierement une relation.
Donc là je sais pas si 1:n decrit les cardinalités max des deux cotés de la relation, ou alors seulement un seul coté avec le max et le min.
Au vu de son message je penche plutot pour la deuxieme possibilité mais c'est pas vraiment clair.

En fait avec le modele que tu proposes ça donne un graphe orienté avec des noeuds de degré sortant 1 au maximum.

Comme il a plutot l'air de vouloir qu'une image puisse en referencer plusieurs, ça va coincer.

Il pourra faire au maximum autant de liaisons qu'il a d'images.

Faudrait qu'il clarifie ce qu'il veut vraiment faire.
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2005, 17h38   #8
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
C'est juste. Je l'ai compris comme les deux cardinalités maximales. Le fait qu'une image puisse en référencer plusieurs ne signifie pas forcément qu'on serait de 1:n vers 1:n. La clef étrangère devra simplement s'appeler "image_id_est_referencee_par". Après si une image peut non seulement référencer plusieurs autre, mais aussi être référencée par plusieurs, là oui on serait en n<=>n.
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 09h19   #9
Invité de passage
 
Inscription : octobre 2004
Messages : 16
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 16
Points : 2
Points : 2
Justement, une image peut en referencer plusieurs autres.

Pour le moment, une image n'est pas sensé êtrereferencé par plusieurs mais ce n'est peut etre pas à exclure.

C'est pour ca que le choix d'une table qui référence les id comme par exemple imagereference_id et imageassocie_id me semble plus judicieux.

Enfin dit moi si je me trompe....

Je pense que je me suis trompé donc dans la cardinalité de ma liaison si je considére maintenant qu'il est possible qu'on me demande qu'une image soit referencé par plusieurs autres.

Sinon j'ai mal saisi ton principe laffreuxthomas, j'avoue que je maitrise pas trop cette notion et je vois pas comment lier et ensuite appeler les images à une seule dans le cas d'une relation 1:n par une clé etrangére.
dafalcon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 09h56   #10
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Citation:
Envoyé par dafalcon
Je pense que je me suis trompé donc dans la cardinalité de ma liaison si je considére maintenant qu'il est possible qu'on me demande qu'une image soit referencé par plusieurs autres.

Sinon j'ai mal saisi ton principe laffreuxthomas, j'avoue que je maitrise pas trop cette notion et je vois pas comment lier et ensuite appeler les images à une seule dans le cas d'une relation 1:n par une clé etrangére.
C'est simple : soit tu souhaites une association de n vers n et tu ajoutes une table de liens, soit ton association est de 1 vers n et une simple clef étrangère suffit. Ensuite, pour écrire tes requêtes, on t'aidera sur les forums appropriés.
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 10h56   #11
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
Ca n'a pas de rapport avec la question, mais j'etait en train de me demander si un association de n vers 1 etait possible.
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 11h25   #12
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Citation:
Envoyé par mirak63
Ca n'a pas de rapport avec la question, mais j'etait en train de me demander si un association de n vers 1 etait possible.
Ici n vers 1 et 1 vers n c'est pareil, puisque la table reférençante est aussi la table référencée.
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 11h39   #13
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
Citation:
Envoyé par laffreuxthomas
Citation:
Envoyé par mirak63
Ca n'a pas de rapport avec la question, mais j'etait en train de me demander si un association de n vers 1 etait possible.
Ici n vers 1 et 1 vers n c'est pareil, puisque la table reférençante est aussi la table référencée.
Euh bah si par exemple tu dis la voiture A percuté la voiture B par l'arriere, ça a un sens, même si voiture pointe sur voiture.

Ca depend du sens semantique de l'asscotiation.
Si on considere que c'est une référence y a un sens.

D'ou ma question, savoir si ça a une signification dans ce cas.
Bref c'etait juste une question
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 12h57   #14
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Euh, j'ai pas compris.

Par exemple avec des groupes de travail, qui sont parfois parainés par un groupe plus ancien :
Code :
1
2
3
4
CREATE TABLE Groupe (
  Groupe_Id integer NOT NULL PRIMARY KEY,
  Parain_Groupe_Ref integer REFERENCES Groupe(Groupe_Id)
);
Tu veux avoir les groupes parainés par le groupe 6 :
Code :
SELECT Groupe_Id FROM Groupe WHERE Parain_Groupe_Ref = 6;
Tu veux avoir le groupe parain du groupe 12 :
Code :
SELECT Parain_Groupe_Ref FROM Groupe WHERE Groupe_Id = 12;
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 14h09   #15
Membre du Club
 
Inscription : avril 2003
Messages : 79
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 79
Points : 47
Points : 47
bah n : 1 ça ferait : un group peu parainer plusieurs fois le même groupe.
C'etait le sens de ma question.
A savoir la reelle signification de n : 1 dont je ne suis pas sur d'ailleurs.
mirak63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 09h07   #16
Membre confirmé
 
Inscription : mars 2002
Messages : 323
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 323
Points : 280
Points : 280
Allez spécialement pour toi, voici une table unique comportant à la fois une association de 1 vers n plus une association de n vers 1.

De 1 vers n : un groupe peut avoir un groupe parain. Donc un parain peut parainer plusieurs groupes.

De n vers 1 : un groupe parain peut avoir un groupe parainé préféré.

Code :
1
2
3
4
5
CREATE TABLE Groupe (
  Groupe_Id integer NOT NULL PRIMARY KEY,
  Parain_Groupe_Ref integer REFERENCES Groupe(Groupe_Id),
  Paraine_Prefere_Groupe_Ref integer REFERENCES Groupe(Groupe_Id)
);
T'es bluffé hein ?
__________________
creapage.net
laffreuxthomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h56.


 
 
 
 
Partenaires

Hébergement Web