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 :

Association 1:n sur une meme table


Sujet :

Décisions SGBD

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 10
    Points
    10
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Il te faut en effet une table en plus, avec une clef primaire (image1,image2) pour savoir quoi est lié avec quoi.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    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

  4. #4
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    Pour moi ce que tu lui proposes va vachement restreindre les possiblités de ce qu'il semble vouloir faire

  6. #6
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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 ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    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.

  8. #8
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    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.

  10. #10
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    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.

  12. #12
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    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

  14. #14
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Euh, j'ai pas compris.

    Par exemple avec des groupes de travail, qui sont parfois parainés par un groupe plus ancien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    select Groupe_Id from Groupe where Parain_Groupe_Ref = 6;
    Tu veux avoir le groupe parain du groupe 12 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select Parain_Groupe_Ref from Groupe where Groupe_Id = 12;

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Points : 72
    Points
    72
    Par défaut
    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.

  16. #16
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

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

Discussions similaires

  1. Requete combiné sur une meme table
    Par Katachana dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/05/2008, 17h05
  2. 2 jointures sur une meme table
    Par amamildor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2007, 17h24
  3. 2 requete sur une meme table en une seule
    Par Nizarazu dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/08/2006, 21h03
  4. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  5. DOUBLE REQUETE SUR UNE MEME TABLE
    Par MORAS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/01/2006, 13h40

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