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

Schéma Discussion :

Table de jointure et clef primaire


Sujet :

Schéma

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Table de jointure et clef primaire
    Bonjour à tous,

    ma question est d'ordre général.

    Est-ce qu'une table de jointure ne doit posséder que les deux clefs primaires des deux tables concernées ou peut-elle contenir d'autres champ ?

    Voici mon cas

    Il y a des personne qui doivent choisir une ou plusieurs destination. Ces destination sont un continent, un pays ou une ville avec les dates de début et de fin désirée du voyages.

    J'ai donc une table voyageurs et une tables destination.

    La cardinalité est la suivante :

    1 voyageur peut choisir une seule ou plusieurs destination.
    Une destination peut appartenir à un ou plusieurs voyageurs.
    On est donc dans une relation de type n-m.
    Il faut donc une table de jointure qui comportera en clef primaire la clef de la table voyageur (id_voyageur) et la clef de la table destination (id_des).

    J'ai décidé de basculer les champs date de début et date de fin dans la table de jointure.

    Mais je me suis rendu compte que la table de jointure ne peu pas avoir de doublons sur le couple (id_voyageur, id_des), or si un voyageur choisit une destination (londres par exemple) et qu'il désire y aller début octobre 2015 jusqu'aà fin octobre 2015 et aussi début décembre 2015 jusqu'à mi-décembre 2015, ça signifie qu'il y aura 2 ligne dans la table de jointure avec pour chaque ligne un couple (id_voyageur, id_des) identiques. il n'y a que les dates qui changent. or ce n'est pas possible d'avoir des doublons dans une clef primaire...Alors ou est mon erreur ?

    Merci d'avance pour votre aide.

  2. #2
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1 voyageur peut choisir une seule ou plusieurs destination.
    Une destination peut appartenir à un ou plusieurs voyageurs.
    On est donc dans une relation de type n-m.
    Il faut donc une table de jointure qui comportera en clef primaire la clef de la table voyageur (id_voyageur) et la clef de la table destination (id_des).
    OK avec ça mais...
    Ces destination sont un continent, un pays ou une ville
    Comment différencier le fait que ce soit un continent, un pays ou une ville ?
    Votre modélisation est probablement plus complexe que cette simple association sur laquelle vous nous interrogez.

    J'ai décidé de basculer les champs date de début et date de fin dans la table de jointure.

    Mais je me suis rendu compte que la table de jointure ne peu pas avoir de doublons sur le couple (id_voyageur, id_des), or si un voyageur choisit une destination (londres par exemple) et qu'il désire y aller début octobre 2015 jusqu'aà fin octobre 2015 et aussi début décembre 2015 jusqu'à mi-décembre 2015, ça signifie qu'il y aura 2 ligne dans la table de jointure avec pour chaque ligne un couple (id_voyageur, id_des) identiques. il n'y a que les dates qui changent. or ce n'est pas possible d'avoir des doublons dans une clef primaire...Alors ou est mon erreur ?
    Il faut donc que au moins la date de début figure dans la clé primaire. À vous de déterminer si c'est suffisant, c'est à dire si un voyageur peut partir vers plusieurs destinations le même jour.

    Revenons au cas général :
    Est-ce qu'une table de jointure ne doit posséder que les deux clefs primaires des deux tables concernées ou peut-elle contenir d'autres champ ?
    La réponse est donc non dans votre cas.
    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 !

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour CinePhil,

    c'est la table destination qui indique si c 'est un continent, un pays ou une ville .

    Donc si j'ai bien compris, dans mon cas, il faut que tous les champs de la table de jointure :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_adh
    id_des
    date_deb
    date_fin
    constituent la clef primaire.

    Merci

  4. #4
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    c'est la table destination qui indique si c 'est un continent, un pays ou une ville .
    Vous pouvez donner la structure de votre table pour qu'on comprenne mieux ?

    Je subodore des problèmes potentiels...

    Donc si j'ai bien compris, dans mon cas, il faut que tous les champs de la table de jointure constituent la clef primaire.
    Oui... pour autant que ce qui est le plus pertinent soit bien une table de jointure (que je préfère appeler table associative).
    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 !

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Sam01 et Philippe,

    Les traitements avec les dates sont toujours délicats... a fortiori, ceux avec des périodes (date début => date de fin).

    Suggestion :

    Nom : Capture.JPG
Affichages : 586
Taille : 48,3 Ko


    Ensuite, via un trigger, il faut tester que la période saisie (date début => date fin) n'empiète pas sur une période existante. Voici l'exhaustivité des tests à créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    37
    38
    S_Deb : Date de début de période saisie
    S_Fin : Date de fin de période saisie
    
    S_Deb S_Fin
      |<--->|
    
    
    A chaque enregistrement :
    BdD_Deb : Date de début de période de l'enregistrement
    BdD_Fin : Date de début de période de l'enregistrement
    
    BdD_Deb                         BdD_Fin
       |<----------------------------->|
    
    
    Toutes les possibilités :
                     BdD_Deb                         BdD_Fin
                        |<----------------------------->|
    
      |<--->|       |<--->|          |<--->|         |<--->|      |<--->|
    S_Deb S_Fin   S_Deb S_Fin      S_Deb S_Fin     S_Deb S_Fin  S_Deb S_Fin
    
    
                        |<--->|                   |<--->|
                      S_Deb S_Fin               S_Deb S_Fin
    
    
                  |<--->|                               |<--->|
                S_Deb S_Fin                           S_Deb S_Fin
    
    
                        |<----------------------------->|
                      S_Deb                           S_Fin
    
    
                  |<----------------------------------------->|
                S_Deb                                       S_Fin
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Les traitements avec les dates sont toujours délicats... a fortiori, ceux avec des périodes (date début => date de fin).
    !!! A qui le dite vous....

    En effet, votre modèle (DATE_DEBUT, DATE_FIN) nécessite plusieurs contraintes :
    1) que DATE_DEBUT < DATE_FIN
    2) que DATE_DEBUT soit saisie si DATE_FIN est renseignée, sinon que DATE_DEBUT soit obligatoire

    Il est souvent plus intéressant d'utiliser le couple DATE_DEBUT, DUREE (avec une durée à la granularité temporelle voulue, par exemple minutes, jours....).

    Les contraintes sont simplifiée par le fait que 1) devient : DUREE >= 0

    Rien n'empêche en sus dans une vue de montrer la DATE_FIN par calcul, ni que l'utilisateur saisisse une date de fin qui soit convertie en durée ! => MED (Modèle Externe de Données)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour SQLpro,

    Citation Envoyé par SQLpro
    En effet, votre modèle (DATE_DEBUT, DATE_FIN) nécessite plusieurs contraintes :
    1) que DATE_DEBUT < DATE_FIN
    2) que DATE_DEBUT soit saisie si DATE_FIN est renseignée, sinon que DATE_DEBUT soit obligatoire

    Il est souvent plus intéressant d'utiliser le couple DATE_DEBUT, DUREE (avec une durée à la granularité temporelle voulue, par exemple minutes, jours....).
    ==> c'est vrai. Mais le plus délicat reste le contrôle des chevauchement des périodes, autrement plus compliqué que les deux contrôles que vous mentionnez.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

Discussions similaires

  1. table d'association et clef primaire
    Par lazuli dans le forum JPA
    Réponses: 1
    Dernier message: 02/12/2009, 14h15
  2. MAJ d'un champ d'une table avec condition sur clef primaire commune
    Par ar|equin dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/05/2007, 13h57
  3. [Modèle Relationnel] Design de table, choix de clef primaire
    Par Monkeyget dans le forum Schéma
    Réponses: 14
    Dernier message: 17/11/2006, 11h26
  4. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 21h06
  5. récupérer la clef primaire d'une table
    Par orionis69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/02/2004, 13h00

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