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 [MLD]


Sujet :

Schéma

  1. #21
    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 à toi de définir ce qu'est une destination, ou à ton donneur d'ordre si tu ne travailles pas sur un projet personnel.

    Tu as écrit :
    Un adhérent peut choisir de partir en Asie par exemple.

    A ce moment là, tous les adhérents qui vivent dans le continent asiatique le savent et sont susceptibles de lui proposer un logement.
    Ceci laisse supposer que la destination susceptible d'être "commandée" finalement pas l'utilisateur est le logement proposé.

    Mettre un continent dans la destination ne me semble pas utile, du moins dans ce que j'entends par destination :
    - un vol à destination de Pékin ;
    - un village de vacances aux Caraïbes ;
    - un musée à Paris ;
    - une randonnée au départ de Bastia ;
    - un séjour de ski à Megève ;
    - les Jeux Olympiques de Rio...

    Tu as écrit aussi ce que j'ai déjà cité précédemment :
    j'ai une liste déroulante qui d'abord propose le nom des continent.

    Ensuite quand l'adhérent choisit son continent, il y a une liste déroulante qui apparaît et qui donne la liste des pays liés au continent.

    Ensuite, il y a la liste des villes liée au pays et au contient.
    Ici encore, on comprend que la destination est d'un niveau de précision au moins égal à une ville et que l'Asie ou l'Europe est trop vague en temps que prestation vendable sur ton site.

    Décrit davantage le domaine que tu cherches à modéliser si tu veux des avis pertinents.
    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 !

  2. #22
    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
    Effectivement, je me rends compte que je me suis mal exprimé...

    Je vais essayé d'être plus clair.

    Il s'agit au fait de proposition d'échanges de logement.

    le mieux est que je te donne un exemple concret

    Un adhérent, qui habite à Paris, par exemple, vient sur mon site d'échange de logement.

    Cet adhérent aimerait échanger son appartement, avec un autre adhérent qui habite en Asie.

    L'adhérent, qui habite à Paris, s'inscrit sur le site, en mettant ses coordonnées etc... A un moment de son inscription, on lui demande quelles sont ses préférences au niveau destination. Et à ce moment, l'adhérent choisit, dans la liste déroulante : Asie.
    Une autre liste déroulante est générée, c'est la liste des pays. Mais cela n'intéresse pas l'adhérent, car son souhait n'est pas un pays en particulier de l'asie, mais tout le continent asiatique.

    Ensuite, il termine son inscription.

    Donc, dans le profil de cet adhérent, au niveau souhait de destination, on voit Asie.


    l'autre adhérent, qui vit à Pékin, par exemple, et qui à envie d'aller à Paris, va
    chercher un adhérent qui correspond à son souhait. Quand il va voir le profil de l'adhérent parisien, il va tout de suite voir son ou ses souhaits de destination.
    Comme il va voir Asie au niveau de souhait, il va pouvoir le contacter et lui proposer un échange.

    Voilà, je ne sais pas si j'ai été clair.

  3. #23
    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 effectivement beaucoup plus clair et il aurait fallu commencer par là !

    Le MCD de Richard_35 est alors le bon. C'est le schéma d'un héritage de données qui fait qu'un continent, un pays ou une ville sera identifiée relativement à destination.

    Voici les tabmes qui réultent de son MCD :
    destination (dst_id, [colonnes communes à toutes les destinations])
    adherent (adh_id...)
    continent (cnt_id_destination, [colonnes spécifiques aux continents])
    pays (pay_id_destination, pay_id_continent,[colonnes spécifiques aux pays])
    ville (vil_id_destination, vil_id_pays, [colonnes spécifiques aux villes])
    adh_choisir_dst (acd_id_adherent, acd_id_destination...)
    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 !

  4. #24
    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
    Citation Envoyé par Richard_35 Voir le message

    Sam01, il n'est pas conseillé de stocker des valeurs nulles dans des clés étrangères. Suggestion :
    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
    Ville -1,1---[Situer]---0,n- Pays -1,1---[Situer]---0,n- Continent
      |                            |                            |
     1,1                          1,1                          1,1
      |                            |                            |
    [Etre destination]     [Etre destination]           [Etre destination]
      |                            |                            |
     0,1                          0,1                          0,1
      |                            |                            |
      +----------------------------+----------------------------+
                                   |
                              Destination
                                   |
                                  0,n
                                   |
                               [Choisir]
                                   |
                                  0,n
                                   |
                               Adhérent
    En clair, il faut créer une destination qui doit être, soit une ville, soit un pays, soit un continent et stocker Id_Destination dans la table associative "Choisir".

    Sam01, tu peux en déduire les tables.
    Bonjour Richard_35, je m'adresse à toi car Cinephil vient de me dire que ton MCD est le bon.
    Si je regarde ton MCD, j'ai 3 entités (continent, pays et ville) qui sont liées à une entité qui est destination.
    Je dois donc retrouver 3 attributs dans la table destination :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id_des id_cont   id_pays   id_ville
    donc une destination est bien une combinaison des 3 attributs :
    id_cont id_pays id_ville

  5. #25
    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
    NON !

    Je t'ai donné la liste et la composition des tables résultant du MCD de Richard !

    Il s'agit d'un héritage de données !

    Exemple de tables et de données :
    adherent (adh_id, adh_login)
    1, 'sam01'
    2, 'Richard_35'
    3, 'CinéPhil'

    destination (dst_id, dst_nom)
    1, 'Amérique'
    2, 'Asie'
    3, 'Europe'
    4, 'Océanie'
    5, 'USA'
    6, 'Canada'
    7, 'Mexique'
    8, 'Chine'
    9, 'Viêt Nam'
    10, 'France'
    11, 'Espagne'
    12, 'Australie'
    13, 'New York'
    14, 'Paris'

    continent (cnt_id_destination)
    1
    2
    3
    4

    pays (pay_id_destination, pay_id_continent, pay_indicatif_telephonique...)
    5, 1, '1'
    6, 1, '1'
    7, 1, '52'
    8, 2, '86'
    9, 2, '84'
    10, 3, '33'
    11, 3, '34'
    12, 4, '61'

    ville (vil_id_destination, vil_id_pays, vil_latitude, vil_longitude...)
    13, 5, '40° 42′ 48″ Nord', '74° 00′ 20″ Ouest '
    14, 10, '48° 51′ 24″ Nord', '2° 21′ 07″ Est'
    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. #26
    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,

    Citation Envoyé par Sam01
    donc une destination est bien une combinaison des 3 attributs :
    id_cont id_pays id_ville
    ==> comme le dit Philippe, non. Une destination est :
    • soit, un continent : destination.dst_id=continent.cnt_id_destination ;

    • soit, un pays : destination.dst_id=pays.pay_id_destination
      ==> le continent de pays.pay_id_destination étant retrouvé via pays.pay_id_continent=continent.cnt_id_destination ;

    • soit, une ville : destination.dst_id=ville.vil_id_destination
      ==> le pays de ville.vil_id_destination étant retrouvé via ville vil_id_destination.vil_id_pays=pays.pay_id_destination
      ==> le continent de pays.pay_id_destination étant retrouvé via pays.pay_id_continent=continent.cnt_id_destination
      .


    C'est le principe de l'héritage bien décrit dans l'exemple de Philippe.
    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 !

  7. #27
    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
    Ok, merci je commence à comprendre.
    Maisl il y autre chose qui me gène :

    Actuellement, j'ai déjà un table continent remplie et une table pays préremplies.
    La table ville est alimentée au fur et à mesure que adhérents s'inscrivent.
    Ces tables continents, pays et ville servent aux adhérents lors de leur inscription. Quand ils mettent leur adresse.

    Exemple :

    table adhérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_adh   'sam01'
    id_vil     '1'
    id_mail   etc...
    table ville (où il habite)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_vil       '1'
    id_pays    '5'
    nom_ville  'Paris'
    table pays

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_pays    '5'
    id_cont    '1'
    nom_pays 'France'
    tables continent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_cont              '1'
    nom_continent   'Europe'
    Donc ces tables existe et je m'en sert pour déterminer le lieu d'habitation de l'adhérent.

    Ce qui m'embête dans le model que vous me proposez, c'est qu'il y a des répétitions.

    Dans la tables destination, on voit par exemple 'Paris' apparaître alors que Paris est une ville qui est déjà dans la table ville.

    Même chose pour Mexique, qui est dans la table destination et dans la table Pays...

    N'est-il pas possible de se servir déjà de ces tables existantes ?

  8. #28
    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
    Citation Envoyé par Sam01
    Ce qui m'embête dans le model que vous me proposez, c'est qu'il y a des répétitions.
    ==> non.

    Citation Envoyé par Sam01
    table ville
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_vil       '1'
    id_pays    '5'
    nom_ville  'Paris'
    table pays
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_pays    '5'
    id_cont    '1'
    nom_pays 'France'
    tables continent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id_cont              '1'
    nom_continent   'Europe'
    ==> c'est très bien ! Cela résout la partie du haut du MCD (en rouge) :
    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
    Ville -1,1---[Situer]---0,n- Pays -1,1---[Situer]---0,n- Continent
      |                            |                            |
     1,1                          1,1                          1,1
      |                            |                            |
    [Etre destination]     [Etre destination]           [Etre destination]
      |                            |                            |
     0,1                          0,1                          0,1
      |                            |                            |
      +----------------------------+----------------------------+
                                   |
                              Destination
                                   |
                                  0,n
                                   |
                               [Choisir]
                                   |
                                  0,n
                                   |
                               Adhérent
    Simplement, pour remplir les tables Ville, Pays et Continent, il faut passer par la table Destination qui fournira une clé primaire aux enregistrements de ces trois tables. Cette clé primaire sera unique, toutes (trois) tables confondues : c'est le principe de l'héritage.

    "dst_id" sera donc égal à "vil_id" ou à "pay_id" ou à "des_id".

    Enfin, le choix de l'adhérent s'effectuera sur la table Destination qui déterminera donc, soit une ville, soit un pays, soit un continent (avec la cohérence conservée).
    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 !

  9. #29
    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
    Richard_35,

    d'après ce que tu me dis, ma table destination aura les colonnes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    id_dest   destination
    et la colonne destination est soit égale à id_vil, soit égale à id_pays, soit égale à id_continent.

    alors si ma table destination est alimentée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id_dest   destination
    1             1
    comment je vais savoir si le chiffre 1 correspond au continent, au pays ou à la ville?

  10. #30
    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,

    Citation Envoyé par Sam01
    d'après ce que tu me dis, ma table destination aura les colonnes suivantes :
    ==> exact.

    Citation Envoyé par Sam01
    et la colonne destination est soit égale à id_vil, soit égale à id_pays, soit égale à id_continent.
    ==> non :
    • la colonne "id_dest" est l'id qui a été distribué, soit à la ville, soit au pays, soit au continent ;
    • la colonne "destination" est le nom de la ville ou du pays ou du continent.

    ==> voir l'exemple de CinePhil :
    destination(dst_id, dst_nom)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     1, 'Amérique'
     2, 'Asie'
     3, 'Europe'
     4, 'Océanie'
     5, 'USA'
     6, 'Canada'
     7, 'Mexique'
     8, 'Chine'
     9, 'Viêt Nam'
    10, 'France'
    11, 'Espagne'
    12, 'Australie'
    13, 'New York'
    14, 'Paris'
    Avant de créer un enregistrement dans Ville ou Pays ou Continent, il faut passer par la table Destination pour :
    • générer un Id dans la table Destination ;
    • stocker le nom de la ville ou du pays ou du continent dans la table Destination ;
    • stocker l'Id de la table Destination ainsi généré, dans la table Ville ou Pays ou Continent.

    ==> c'est le principe de l'héritage.

    Si tu ne veux pas trop modifier l'existant, tu pourrais ajouter un flag V/P/C (Ville/Pays/Continent) dans la table Destination qui deviendrait :
    destination(dst_id, dst_flag, dst_nom)
    Cela ne me plaît pas trop, mais c'est un moindre mal, en quelque sorte. De ce fait, tu pourrais conserver tes id_ville, id_pays et id_continent en l'état (avec les mêmes valeurs), tout en gardant le même principe.

    Cela te permet, également, de continuer à créer tes villes, pays et continents avant de générer un enregistrement dans Destination. Bien entendu, le choix de l'adhérent s'effectuera toujours sur cette table Destination.

    Je te laisse modifier l'exemple évoqué précédemment pour imager le principe.
    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 !

  11. #31
    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
    Merci Richard_35 pour cette explication précise.

    Au fait ce que tu proposes (et ce qui me gênait et que j'avais tant de mal à exprimer) c'est que la table destination est une table mère et les tables ville, pays, et continent sont des tables filles. C'est bien ça.

    Ca signifie que si un jour je supprime une ligne de la table mère (destination), par cascade, les tables filles doivent disparaître. Et ça, ça ne me plaît pas trop.

    En supprimant une destination, je supprime un continent tout entier, c'est pas terrible...

    C'est pour ça que je vais plutôt opter pour la deuxième solution que tu proposes (à laquelle j'avais pensé, je t'avoues).

    Il est vrai que de mon côté, j'ai créé la table contient et la table pays liées au continent dès le début. donc mes tables continent et pays on déjà leur id prédéfinis. Tu as très bien compris ma problématique et je te remercie pour ça. Et autre chose que je n'avais pas compris et que tu as très bien expliqué dans ce dernier post, c'est l'id_dest, je pensait créer une table destination avec un id (clép primaire) en autoincrémente. mais ce n'est pas le cas.

    Eb tout cas je vous remercie à Cinephil et à toi. Même si la solution que je vais adopter n'est top, comme tu dis c'est un moindre mal et ça me rassure.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Table de jointure pour une seule table
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/10/2005, 18h49
  2. Regrouper les infos de deux table sans jointure
    Par ricobye dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/07/2005, 09h30
  3. [sql] afficher deux champs de deux tables sans jointure
    Par Hell dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/06/2005, 12h38
  4. Tables liées / Jointures
    Par giaco dans le forum Langage SQL
    Réponses: 18
    Dernier message: 02/05/2005, 10h17
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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