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 :

clé étrangère qui pointe vers un champ (n'est pas clé primaire)


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut clé étrangère qui pointe vers un champ (n'est pas clé primaire)
    Bonsoir,
    je n'arrive pas à créer une relation entre deux tables par une clé étrangère qui pointe pas vers une clé primaire :

    tb_image
    -ImgId
    -GroupImgId
    -UrlImg
    ...

    tb_article
    -ArticleId
    -GroupImgId#
    ...

    ça marche dans le cas ou le champ GroupImgId a une contrainte UNIQUE mais je veux qu'il accepte les valeurs répétées afin d’attribuer aux images de même article un GroupImgId identique .

    si y on a d'autre solutions au niveau conceptuel je suis preneur sinon comment puis je résoudre mon problème ça fait deux jours que je galère la dessus
    je vous remercie pour votre coud de main

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il vous faut une table supplémentaire GroupeImage, avec une clef primaire que vous pourrez référencer.
    Le principe des clefs étrangères est bien de pointer sur une colonne ayant au moins une contrainte d'unicité.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Une solution pour garantir la contrainte, mais qui ne sera pas une clé étrangère (et d'un point de vue performances, assez moyen) est de faire une contrainte "check" vérifiant la présence de "GroupImgId" dans la table tb_image.

    Mais sinon, Waldar a raison, conceptuellement, il semble de toute façon plus judicieux de créer une table "groupeimage" qui sera référencée à la fois par tb_image et tb_article.

    Sinon, je n'arrive pas bien à comprendre "dans quel sens" fonctionne votre lien entre article et image ?

    De ce que je comprends, plusieurs images peuvent se retrouver dans un même article.
    => Je serais donc tenté de mettre une clé "article_id" dans la table "tb_image", et donc abandonnée cette notion de "groupe d'images"

    Est-ce qu'une même image peut être référencée par deux articles ?
    Si oui, alors il faut une table de correspondance "imagearticle" faisant référence à la fois à image_id et article_id (et tb_article et tb_image) ne font plus référence à une table externe.

    Selon tes besoins, quelle est cette nécessité de regrouper les images d'un même article ensemble ? J'ai l'impression que la table "imagearticle" répond à ton problème.

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    Un grand MERCI à Waldar & StringBuilder
    alors pour cette partie de ma BD , l'ajout d'une autre table GroupeImage( avec un identfiant et 2 clés étrangères : ImgId et ArticleId ) est la solution -comme vous m'avez expliqué -. mais pour le reste de la BD y a d'autre tables qui font référence à la table tb_image ex : la table tb_vehicule , tb_promo ... qui nécessite pour chaque enregistrement une image ou plus donc je dois pas créer une table de groupement d'images pour chaque liaison avec la table tb_image !!

    Est-ce qu'une même image peut être référencée par deux articles ?
    pour l'instant non mais je dois mettre en place cette possibilité afin d’éviter des soucis au cas ou je voudrais avoir une image sur un article ou plusieurs articles!
    De ce que je comprends, plusieurs images peuvent se retrouver dans un même article.
    => Je serais donc tenté de mettre une clé "article_id" dans la table "tb_image", et donc abandonnée cette notion de "groupe d'images"
    la , je comprends pas moi aussi pourquoi mon encadrant a refusé cette idée puisqu'elle étais ma première suggestion ... si j'adopte cette idée il me faut la table tb_image avec des clés étrangères qui référencent tous les autres tables tb_article tb_vehicule... sans utliser des tables 'intermédiaires' "GroupeImageArticle" et "GroupeImageVehicule"... non ?

    je sais pas si c'est claire ou non et désolée pour mon français
    je vous remercie encore une fois pour le temps que vous m'avez accordé

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Pour reprendre les grandes lignes de la modélisation de base de données :

    Si une et une seule image peut être présente dans un ou plusieurs articles, alors il faut une clé étrangère image_id dans la table des articles.

    Si une ou plusieurs images peuvent être présentes dans un et un seul article, alors il faut une clé étrangère article_id dans la table des images.

    Si une ou plusieurs images peuvent être présentes dans un ou plusieurs articles, alors il faut une table de correspondance faisant référence à la fois à la table image à et la table article.

    Si une et une seule image peut être présente dans un et un seul article, alors il faut une unique table regroupant à la fois les images et les articles.

  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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tous les cas de cardinalités pour une association binaire sont étudiés dans un billet de mon blog consacré aux tables associatives.

    Si la table des images peut être associée à plusieurs autres tables, alors il te faudra forcément des tables associatives car la clé étrangère ne devra pas être dans la table des images, même si une image ne peut par exemple être associée au maximum qu'à un article et qu'un article ne peut avoir au maximum qu'une image.

    article -0,1----associer----0,1- image
    vehicule -0,n----associer----0,1--|
    promo -0,n----associer----0,n-----|

    Dans ces trois cas, il faut une table associative.

  7. #7
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    merci StringBuilder & CinePhil pour votre cours , le blog a résumé tous les cas possibles , je le garderai dans mes favoris

    je voulais éviter d'avoir plusieurs tables associatives mais si c'était la solution logique de mon cas je procéderais comme vous avez indiquer.

    la seule chose à modifier est : article -0,1----associer----0,n- image à la place de article -0,1----associer----0,1- image puisqu'un article peut avoir plusieurs images.

    je vous remercie encore une fois pour votre aide , vous êtes vraiment généreux

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

Discussions similaires

  1. [Toutes versions] Clé étrangère qui pointe vers clé primaire ou autre champ?
    Par skarno dans le forum Modélisation
    Réponses: 1
    Dernier message: 06/08/2014, 22h00
  2. Champ d'un tableau qui pointe vers une structure
    Par Almenor dans le forum Débuter
    Réponses: 3
    Dernier message: 23/05/2012, 09h04
  3. bouton qui pointe vers une page jsp
    Par redabadache3 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/10/2007, 14h33
  4. liste déroulante qui doit pointe vers 2 champ différent
    Par popofpopof dans le forum Access
    Réponses: 1
    Dernier message: 24/08/2007, 22h36
  5. [j3d] afficher une ligne qui point vers un objet
    Par guitalca dans le forum 3D
    Réponses: 1
    Dernier message: 06/03/2006, 21h44

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