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 :

Entités de deux types à la fois et héritage [Entité-Association]


Sujet :

Schéma

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut Entités de deux types à la fois et héritage
    Le titre est catastrophique, mais si quelqu'un arrive à résumer ma question clairement, je suis preneur !

    Je suis en train de modéliser ma base et je suis confronté au problème suivant :
    Ma société travaille pour des transporteurs qui peuvent être des clients (de ma société) ou des prestataires (fournissant des services par le biais de ma société). Seulement voilà, le "ou" n'est pas exclusif, bien au contraire, on cherche à ce qu'un maximum de nos prestataires deviennent aussi des clients et vice-versa.

    J'avais modélisé ce problème en première lecture, par une relation d'héritage (transporteur prestataire et transporteur client héritent tous deux de transporteur) mais ça ne marche pas puisque ça ne prend pas en compte le cas ou un transporteur est client ET prestataire.

    Des idées pour m'aider à boucler mon diagramme entités relations ?

    D'avance merci !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Il n'y a pas une relation d'hériatge mais deux :

    Client -(1,1)----Etre----0,1- Transporteur
    Fournisseur -(1,1)----Etre----0,1---|

    Dès lors, qu'est-ce qui interdit à un transporteur d'être à la fois client et fournisseur ?
    Tant qu'il n'y a pas de contrainte d'exclusion entre les deux relations...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut
    Bonjour et merci beaucoup de votre réponse CinePhil,

    J'y vois plus clair, je ne sais pas pourquoi, mais je m'étais bloqué en considérant que l'héritage était différent des autres relations... C'est mon utilisation de inherits dans Postgresql qui m'a induit en erreur.

    Si je comprend bien, mon schéma relationnel aura cette tête-là :
    transporteur(Id_transporteur, nom)
    prestataire(Id_prestataire, date_inscription, #Id_transporteur)
    client(Id_client, date_souscription, #Id_transporteur)

    C'est bien ça ? Il n'y a pas moyen de faire mieux/plus court/plus simple ?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Pas tout à fait.
    En principe, quand il y a un héritage, on utilise l'identification relative et la table fille hérite en clé primaire de l'identifiant de la table mère :
    transporteur(Id_transporteur, nom)
    prestataire(Id_prestataire, date_inscription)
    client(Id_client, date_souscription)

    Id_prestataire et id_client sont à la fois clé primaire et étrangère faisant référence à id_transporteur.
    Il n'y a pas moyen de faire mieux/plus court/plus simple ?
    Ben ça fait une colonne de moins par table fille !

    Je prends l'habitude de préfixer les noms des colonnes par une ou plusieurs lettres du nom de la table et dans le cadre d'un héritage, je ferais plutôt comme ceci :
    transporteur(T_Id_transporteur, nom)
    prestataire(P_Id_transporteur, date_inscription)
    client(C_Id_transporteur, date_souscription)
    Ca permet de voir tout de suite que C_Id_transporteur est une clé étrangère venant de la table transporteur dans la table C = client.

    Mais rien n'est obligatoire en ce domaine !

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut
    D'accord, ça se rapproche de ce que je connaissais avec postgresql. Mais du coup, ça ne pose pas de problème qu'un prestataire et un client puissent avoir la même ID ?

    Et peut-on indiquer à mysql que les tables client et prestataire héritent de transporteur ?

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par huit_six Voir le message
    D'accord, ça se rapproche de ce que je connaissais avec postgresql. Mais du coup, ça ne pose pas de problème qu'un prestataire et un client puissent avoir la même ID ?
    Non puisque sémantiquement ce sont deux choses différentes.
    Les traitements faits sur les clients et les prestataires seront différents.

    Et peut-on indiquer à mysql que les tables client et prestataire héritent de transporteur ?
    Non. MySQL n'implante pas le concept d'héritage comme Postgresql.
    Il faut simplement implanter le modèle et le gérer.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut
    Il faut simplement implanter le modèle et le gérer.
    C'est à dire avec du code client ? (php, ou java suivant le cas ?)

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par huit_six Voir le message
    C'est à dire avec du code client ? (php, ou java suivant le cas ?)
    Pas forcément.
    Le mécanisme des clés étrangères permettra déjà de garantir une certaine cohérence.
    Ensuite ce sont les requêtes qui sont à adapter.
    Eventuellement faire des vues qui rassemblent les colonnes de la table mère et de sa fille pour simplifier les requêtes ensuite. Je me demande d'ailleurs si ce n'est pas ce que fait automatiquement Postgresql avec son concept d'héritage. Je l'ai vu une fois et j'ai eu l'impression qu'il y avait les colonnes de la table mère aussi dans la table fille, ce qui m'avait choqué (redondance de données) mais finalement ce n'est peut-être qu'une vue qui donne cette impression. Je n'ai pas pris le temps d'étudier ça plus avant.

    Les réponses à d'éventuelles autres questions attendront car maintenant, je vais jouer au billard !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut
    En effet, les colonnes de la table mère apparaissent bien dans la table fille, en revanche, je ne sais pas du tout s'il s'agit de vues.

    Comme je n'ai pas encore choisi mon SGDBR, j'ai encore le temps de me décider pour postgresql.

    En tout cas, merci pour ce coup de main précieux !!!

    Et amusez-vous bien au billard !

    <- Monstre vert de la jalousie...

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

Discussions similaires

  1. Deux types de RAM différentes ?
    Par sliderman dans le forum Composants
    Réponses: 9
    Dernier message: 16/07/2007, 15h26
  2. Réponses: 1
    Dernier message: 21/11/2006, 21h55
  3. création de deux graphiques à la fois
    Par Makino dans le forum Tkinter
    Réponses: 2
    Dernier message: 06/03/2006, 16h48
  4. Impression de deux onglets à la fois
    Par auriolbeach dans le forum Access
    Réponses: 3
    Dernier message: 17/10/2005, 05h34
  5. Résultats erroné différence entre deux types TDateTime
    Par Alghero dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 17h03

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