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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 7
    Points : 6
    Points
    6

    Par défaut Pourquoi une table de jonction?

    Bonjour,

    Je suis étudiant en SQL et je me pose une question toute bête mais à laquelle je n'arrive pas à répondre.

    Dans une relation many to many, il faut utiliser une table de jonction comme suit : table (idTbl1, idTbl2) avec une contrainte de clé primaire concaténée sur les deux propriété de la table. Mais je ne comprends pas la différence entre faire cette table de jonction et une table qui comporterait les 2 id uniquement en clé étrangères. je ne sais pas si c'est très clair....

    En clair :

    TblLocal (idLocal, numeroLocal) 0.n<--1.1 TblOrdianteur (idOrdi, numeroDeSerie, #idLocal, #idMarque) 1,1-->0,n TblMarque (idMarque, nom)

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    TblEleve (idEleve, nom) 0,n--> TblPasser (idEleve, idExam, point) 0,n <-- Tblexam (idExam, intitulé)



    Dans ses deux cas différents (one to many pour l'un et many to many pour l'autre) les tables ordinateur et Passer font exactement la même chose! Pourquoi la table de jonction Passer ne peut tout simplement pas être définie avec 2 clé étrangères comme dans le 1er cas? De plus, les jointures de requête dans "select" sont les mêmes dans les deux cas. La seul différence que j'ai pu noter, c'est que la table Passer possédant 2 PK. Un élève donné ne peut donc passer deux fois le même exam alors que si on lui avait plutôt choisi 2 clés étrangères ça aurait été la même chose sans cette contrainte.

    Il doit y avoir une raison qui m'échappe car sinon les tables de jonctions n'auraient pas été inventées . Mais j'avoue que je ne m'explique pas pourquoi et ça me ronge

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Responsable Datas
    Inscrit en
    janvier 2009
    Messages
    3 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Datas

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 552
    Points : 7 757
    Points
    7 757

    Par défaut

    Bonjour,
    Pour moi la description de la table tblPasser est fausse.
    Si un élève ne peut passer un examen qu'une seule fois, sa clé primaire est composée des deux colonnes idEleve et idExam, et chacune est une clé étrangère qui "pointent" respectivement sur tbleleve.ideleve et tblexam.idexam (pour l'intégrité référentielle).
    Maintenant si un élève peut passer plusieurs fois le même examen, la PK n'est plus bonne. Il faut une quatrième colonne (idPassage ?) pour identifier chaque ligne de façon unique, tout en conservant les 2 clés étrangères.

    Pour le premier exemple, je ne considère pas tblOrdinateur comme une table de jonction, mais comme une "entité" à part entière. Il ne fait pas le lien entre un local et une marque...

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    Pour moi la description de la table tblPasser est fausse.
    Si un élève ne peut passer un examen qu'une seule fois, sa clé primaire est composée des deux colonnes idEleve et idExam, et chacune est une clé étrangère qui "pointent" respectivement sur tbleleve.ideleve et tblexam.idexam (pour l'intégrité référentielle).
    C'est exactement ce je dis quand je note :

    TblEleve (idEleve, nom) 0,n--> TblPasser (idEleve, idExam, point) 0,n <-- Tblexam (idExam, intitulé)

    Sommes nous d'accord que La création de la table de jonction Passer en sql s'écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TblPasser
    (
    idEleve int,
    idExam int,
    point int,
    constraint PkEleveExam primary key (idEleve, idExam)
    )
    ?

    Ou alors pour toi la table de jonction s’écrirait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE TblPasser
    (
    idEleve int,
    idExam int,
    point int
    )
     
    alter table TblPasser
    add constraint FkPasserEleve foreign key (idEleve)
    references Tbleleve (idEleve)
     
    alter table TblPasser
    add constraint FkPasserExam foreign key (idExam)
    references TblExam (idExam)
    ?

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 907
    Points : 8 930
    Points
    8 930
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Tout dépend des règles de gestion que vous n'avez pas confirmées ou infirmées.
    Comme le faisait remarquer Tatayo, si un élève peut passer le même examen plusieurs fois alors il manque une composante DATE_EXAM dans la clef primaire

    En effet, dans ce cas, le modèle conceptuel est le suivant :

    EL_ELEVE (EL_id, EL_nom, EL_prenom, ...) 0,n --- presenter --- 0,n EX_EXAMEN(EX_id, EX_code, EX_libelle, ...)
    .................................................................................│
    ................................................................................0,n
    ......................................................................CA_CALENDRIER(CA_Date, CA_joursem...)

    Dans ce cas, la table "PRESENTER" issue de la relation ternaire, a pour PK EL_id+EX_id+CA_date

    Reste à préciser si un élève peut passer plusieurs examens le même jour.
    Dans la négative, l'attribut EX_id devra être supprimé de la PK de la table "PRESENTER", il restera comme attribut FK référençant la PK de "EXAMEN"

    Comme toujours, faute de règles de gestion précises, impossible de proposer un modèle de données définitif !

  5. #5
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    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 : 15 958
    Points : 31 624
    Points
    31 624
    Billets dans le blog
    5

    Par défaut

    TblLocal (idLocal, numeroLocal) 0.n<--1.1 TblOrdianteur (idOrdi, numeroDeSerie, #idLocal, #idMarque) 1,1-->0,n TblMarque (idMarque, nom)
    Ceci découle du MCD suivant :
    Local -0,n----abriter----1,1- Ordinateur -1,1----fabriquer----0,n- Marque

    => Il y a ici 3 entité-types (Local, Ordinateur, Marque) et deux associations-types (abriter, fabriquer).
    La présence des deux clés étrangères dans la table Ordinateur est justifiée par l'existence des deux associations dont la patte, côté Ordinateur, a pour cardinalités (1,1).

    TblEleve (idEleve, nom) 0,n--> TblPasser (idEleve, idExam, point) 0,n <-- Tblexam (idExam, intitulé)
    Ceci découle du MCD suivant :
    Eleve -0,n----passer----0,n- Examen

    => Il y a cette fois deux entités-types (Eleve et Examen) et une seule association-type (passer).
    L'association-type ayant pour cardinalités (0,n - 0,n), cela justifie la création d'une table associative dont la clé primaire est composée des clés étrangères référençant les tables objet de l'association.

    Les deux MCD sont différents et donc la construction des tables qui en découle est différente.

    Pour savoir quand il faut une table associative, je vous renvoie à mon billet de blog.

    Puisque vous êtes étudiant, commencez par écrire les règles de gestions des données puis dessinez le MCD et enfin générez les tables. Ne vous attaquez pas directement aux tables !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    Merci CinePhil. Vous avez saisi le sens de ma question. Merci je comprends beaucoup mieux la différence. Je lirais vos articles avec attention. Cependant une dernière question me chiffonne. Pour une table de jonction, le prof, me fait mettre les deux paramètres (idExamen, idEleve) en clé primaire. Hors, vous me dites qu'il faut les mettre en clé étrangère... Pourriez-vous m'éclaircir sur ce point?

    Merci

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 822
    Points : 24 537
    Points
    24 537

    Par défaut

    Les deux...
    Le tuple (idExamen, idEleve) est la clé primaire de la table de jonction donc chaque colonne est clé étrangère.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    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 : 15 958
    Points : 31 624
    Points
    31 624
    Billets dans le blog
    5

    Par défaut

    Pour préciser la réponse de al1_24...

    1) Par principe, toute table a besoin d'une clé primaire pour identifier de manière unique chaque ligne de la table.

    2) Pour les tables issues des entités-types du MCD, la bonne pratique est d'utiliser un identifiant technique et asémantique de type entier (car c'est léger) et auto-incrémenté (car ça garantit l'unicité).
    Exception fait des tables d'héritage dont la clé primaire reprend l'identifiant de la table mère. Exemple :
    te_personne_prs (prs_id, prs_nom...)
    th_personne_physique_pph (pph_id_personne, pph_nom_naissance, pph_prenom, pph_date_naissance...)

    Ci-dessus, les clés primaires sont soulignées et la clé étrangère est en italique. te_ pour une table issue d'une entité-type du MCD et th_ pour une table qui hérite d'une autre table.

    3) Les tables associatives ont besoin, par construction dérivée du MCD, des clés étrangères référençant les tables entrant en jeu dans l'association. Et comme ce sous ensemble de colonnes de la table associative garantit l'unicité de chaque ligne, elles font aussi partie de la clé primaire.
    Comme le dit al1_24, les clés étrangères référençant les tables concernées par l'association forment aussi la clé primaire de la table.

    th_personne_physique_pph (pph_id_personne, pph_nom_naissance, pph_prenom, pph_date_naissance...)
    te_projet_prj (prj_id, prj_numero, prj_nom...)
    tj_prs_participer_prj_ppp (ppp_id_personne, ppp_id_projet...)

    4) L'ensemble de clés étrangères n'est pas toujours suffisant pour constituer la clé primaire de la table associative.
    Dans l'exemple ci-dessus, si une personne peut travailler à plusieurs périodes différentes sur le même projet et si on veut enregistrer ces différentes périodes, il faut compléter la table associative et sa clé primaire :
    tj_prs_participer_prj_ppp (ppp_id_personne, ppp_id_projet, ppp_date_debut, ppp_date_fin...).

    On retrouve d'ailleurs là un cas similaire à celui décrit par escartefigue : En toute rigueur, il faudrait que le MCD représente une entité-type Calendrier et l'association serait alors ternaire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    D'un coup, tout est plus simple à comprendre. Je vous remercie encore de prendre le temps de formuler des réponses si complètes.

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

Discussions similaires

  1. [AC-2013] Recherche de plusieurs valeurs dans un seul champ d'une table de jonction
    Par Vijinn dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 12/09/2017, 12h33
  2. [AC-2007] Mise à jour d'une table avec jonction
    Par Korleone dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/03/2014, 21h50
  3. [AC-2003] Requête sans doublon ? dans une table de jonction ?
    Par artus59 dans le forum Modélisation
    Réponses: 3
    Dernier message: 04/07/2013, 23h35
  4. [AC-2007] création d'une table de jonction
    Par gengler dans le forum Access
    Réponses: 1
    Dernier message: 05/12/2011, 11h54
  5. Renseigner une table de jonction
    Par alter dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/07/2009, 14h45

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