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
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 26
    Points : 16
    Points
    16

    Par défaut Clé étrangère chat, chien, ou aligator

    Bonjour,
    j'imagine que la réponse se trouve quelque part, mais je ne pense pas trouver la bonne formulation pour la trouver.

    J'aimerai savoir comment réaliser proprement l'association (binaire dans le principe), en bénéficiant de la cohérence assurée par les clés étrangères.
    J'ai :
    - une table "propriétaires"
    - une table "chiens"
    - une table "chats"
    - une table "alligators"
    Les 3 dernières ne pouvant pas être fusionnées, ni reliées par une héritage.

    Imaginons l'association "dresser", à savoir :
    Un propriétaire - dresse - un chat, un chien ou un alligators

    Pas de soucis pour le propriétaire on intègre son id en clé étrangère.
    Mais pour le deuxième élément, comment indiquer que la clé étrangère dépend de la nature de l'animal : c'est à dire id du chat, id du chien, ou id de l'alligator.

    Pour le moment, je crée un champ nature de l'animal (chat, chien ou alligator) et un autre champ pour l'id, et je recherche dans la table correspondante. Mais je n'intègre pas de clé étrangère et je suis obligé de faire un contrôle à priori (liste fermée) ou à postériori (vérification de l'existence de l'enregistrement).
    Je me dis qu'il doit y avoir une manière plus propre de faire : au niveau modèle ? au niveau contraintes ? ou selon le SGBD (en l'occurrence, je travaille sur du postgres) ?

    Je suis preneur de vos conseils, pratiques ou renvois vers "la question déjà posée".

    Merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Consultant Teradata
    Inscrit en
    septembre 2008
    Messages
    7 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Teradata

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 697
    Points : 16 044
    Points
    16 044

    Par défaut

    En effet votre modèle est erroné, il vous manque une table animaux dont les tables chiens chats et alligator hériteraient (soit avec l'héritage de postgresql, soit à la mano).

  3. #3
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 910
    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 910
    Points : 8 937
    Points
    8 937
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Cette question concerne la modélisation, or pour bien modéliser il faut connaitre les règles de gestion.
    Il faut les rédiger sous la forme (exemple)

    R001 : un propriétaire possède un ou plusieurs animaux
    R002 : un animal est possédé par un et un seul propriétaire
    R003 : un animal est d'un et un seul type
    R004 etc...

    Questions à poser ici : forum MCD/MLD/MPD

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 26
    Points : 16
    Points
    16

    Par défaut

    Citation Envoyé par Waldar Voir le message
    En effet votre modèle est erroné, il vous manque une table animaux dont les tables chiens chats et alligator hériteraient (soit avec l'héritage de postgresql, soit à la mano).
    Je ne souhaite pas faire appel à l'héritage, sauf si pas d'autres solutions (en tout cas pour le moment...)
    Bonjour,

    Cette question concerne la modélisation, or pour bien modéliser il faut connaitre les règles de gestion.
    Il faut les rédiger sous la forme (exemple)

    R001 : un propriétaire possède un ou plusieurs animaux
    R002 : un animal est possédé par un et un seul propriétaire
    R003 : un animal est d'un et un seul type
    R004 etc...

    Questions à poser ici : forum MCD/MLD/MPD
    Pour les règles de gestion, en voici :
    Un animal ne peut être dressé que par un propriétaire
    Un propriétaire peut dresser 1 ou plusieurs animaux (du même type ou de types différents)
    Et un animal est d'un seul type

    Mon message a été déplacé ici par un modérateur...

  5. #5
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 910
    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 910
    Points : 8 937
    Points
    8 937
    Billets dans le blog
    1

    Par défaut

    Si les attributs des chiens, chats, aligators et autres animaux sont strictement identiques (ce qui est peu probable), inutile d'utiliser l'héritage, dans le cas contraire c'est fortement recommandé

    Dans le 1er cas
    PROPRIO 1,n --- dresser --- 1,1 ANIMAL 1,1 --- typer --- 0,n TYPE

    Ce qui donne 3 tables : PROPRIO, ANIMAL (avec une FK vers l'id proprio et une FK vers le type) et TYPE

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 26
    Points : 16
    Points
    16

    Par défaut

    Citation Envoyé par escartefigue Voir le message
    Si les attributs des chiens, chats, aligators et autres animaux sont strictement identiques (ce qui est peu probable), inutile d'utiliser l'héritage, dans le cas contraire c'est fortement recommandé

    Dans le 1er cas
    PROPRIO 1,n --- dresser --- 1,1 ANIMAL 1,1 --- typer --- 0,n TYPE
    Merci pour la réponse, mais en effet les attributs sont différents (ici les animaux ne sont qu'un exemple pour la question), on ne peut fusionner en une seule table.

    Et donc l'héritage est la seule alternative ?
    Va falloir que je me repenche sur la question, je l'avais un peut éludée, parce qu'il me semblait que cela entraînait des complications (contrôle d'unicité, suppression en cascade, ... je ne sais plus...)

  7. #7
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 910
    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 910
    Points : 8 937
    Points
    8 937
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par cryptom Voir le message
    Merci pour la réponse, mais en effet les attributs sont différents (ici les animaux ne sont qu'un exemple pour la question), on ne peut fusionner en une seule table.

    Et donc l'héritage est la seule alternative ?
    Va falloir que je me repenche sur la question, je l'avais un peut éludée, parce qu'il me semblait que cela entraînait des complications (contrôle d'unicité, suppression en cascade, ... je ne sais plus...)
    Pas du tout, aucune complication : avec l'héritage, les sous-types héritent de l'identifiant du sur-type l'unicité est donc implicite (fort heureusement du reste )

    Il y a des infos sur l'héritage dans ce forum, par exemple ici

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 6 480
    Points : 22 432
    Points
    22 432
    Billets dans le blog
    16

    Par défaut Spécialisation

    cryptom,

    Comme l’écrivent Waldar et escartefigue, la spécialisation du type ANIMAL en CHIEN, CHAT, ALLIGATOR ne pose pas de problème particulier. En passant, notez l’emploi au singulier du nom de chaque type.

    Puisque vous vous situez au niveau tabulaire, vous pouvez vous reporter à l’article consacré à la modélisation avec MySQL Workbench, plus précisément ici.
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  9. #9
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 967
    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 967
    Points : 31 634
    Points
    31 634
    Billets dans le blog
    5

    Par défaut

    Merci pour la réponse, mais en effet les attributs sont différents (ici les animaux ne sont qu'un exemple pour la question), on ne peut fusionner en une seule table.
    Alors expliquez-nous votre cas concret !
    Sinon c'est difficile de vous aider.
    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 !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 26
    Points : 16
    Points
    16

    Par défaut

    Les réponses sont très claires merci.

    Je cherchais une réponse pour le cas général.

    En l'occurrence, actuellement ce sera pour de l'affectation de matériel (équipement de chantier, chacun avec des caractéristiques très spécifiques). En définitive, peu importe le type d'objet, au pire on fait une table mère "CHOSES", avec juste un ID et on crée les enfants qu'on veut.

    N'ayant pas encore implémenté de l'héritage dans mes bases de données, j'en étais resté à ce que j'ai décrit plus haut. Et pour le moment je ne peux aller plus loin dans l'échange. Je tague le post comme résolu et je travaille mon héritage.

    Merci encore pour les réponses données.

  11. #11
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 967
    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 967
    Points : 31 634
    Points
    31 634
    Billets dans le blog
    5

    Par défaut

    En l'occurrence, actuellement ce sera pour de l'affectation de matériel (équipement de chantier, chacun avec des caractéristiques très spécifiques).
    Donc vous pouvez avoir par exemple ce type d'héritages :
    grue -(1,1)----être----0,1- equipement_chantier
    bungalow -(1,1)----être----0,1------|
    container -(1,1)----être----0,1-------|

    Ensuite, vous pouvez avoir des héritages multiples, par exemple :
    vestiaire -(1,1)----être----0,1- bungalow
    sanitaire -(1,1)----être----0,1--------|
    bureau -(1,1)----être----0,1----------|

    Et du coup vous pouvez faire des associations générales à tous les équipements de chantier (livrer, installer...) ou spécifiques à des entités-types filles (vérifier une grue, raccorder le vestiaire au réseau d'eau propre et d'eaux usées...).
    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 !

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

Discussions similaires

  1. Découper un lien .php?champ-texte=chien+chat
    Par djo007 dans le forum Fonctions
    Réponses: 7
    Dernier message: 02/08/2011, 14h53
  2. [Flash] Chat irc ?
    Par Skorps dans le forum Flash
    Réponses: 9
    Dernier message: 13/10/2008, 01h55
  3. [Script]prob de clés étrangères
    Par Seb7 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/07/2003, 18h37
  4. [TP]Création d'un Chat en Pascal!
    Par Sub0 dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 12/06/2003, 20h58

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