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

PostgreSQL Discussion :

[Postgresql]Héritage


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [Postgresql]Héritage
    Bonjour,

    Je voudrais faire de l'héritage dans ma base de données.

    Je voudrais savoir comment inserer et selectionner des enregistrements de tables venant des héritages.

    Mon MCD

    J'ai ma super table PERSONNE ( num_personne,nom,login,password)

    Et les tables filles sont :
    ADMINISTRATEUR_SITE(num_admin_site)
    ADMINISTRATEUR_MODULE(num_admin_module)
    CLIENT(num_client,prenom,adresse,ville)

    Si je veux inserer un administrateur de module, je suis obligée de remplir la table personne et la table administrateur_module ???

    et lorsque je veux selectionner les clients de ma base, je fais
    SELECT nom, login,adresse from Personne, client where num_client=num_personne;

    Est ce comme cela qu'il faut proceder ?

    Si vous avez des cours o tutoriels un peu detaillée sur l'heritage avec des exemple un peu complexe, je suis preneuse!!

    Merci

    Aurélie

    Ajout de [TAG]
    Modéré par Stessy

  2. #2
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    http://www.kuznix.net/content/pgsql/...nheritance.php

    Je crois que c'est déja un bon début si tu n'as jamais fait d'héritage


    www.google.fr

    en tapant postgresql+héritage tout simplement
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je ne veux pas etre medisante mais je suis deja allée sur ce site et il n'est pas assez détaillée.

    Tu pourras remarquer qu'il n' y a pas grand chose sur l'heritage. Il ne dise pas comment on fait pour inserer des données avec des tables héritée ni comment on fait pour selectionner les champs de ta table fille.
    ex: si je reprend l'exemple du site http://www.kuznix.net/content/pgsql/doc/tutorial-inheritance.php

    Ce sont des exemples simples.

    il ne disent pas comment on fait pour récupérer le champ state de la table cities . Peut on faire cette requete ?

    SELECT name, altitude,state
    FROM cities
    WHERE altitude > 500 ;

    Faut il faire une jointure entre cities et capitals ???

    Merci en tout cas de me repondre car a priori il n' ya pas grand monde qui connait l'heritage ou du moins qui l'utilise.

    Aurélie

  4. #4
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Tout d'abord tu dois créer ta table fille en la faisant hériter de la table mère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CREATE TABLE administrateur_module ( les colonnes de la table fille) INHERITS (personne);
    Si je veux inserer un administrateur de module, je suis obligée de remplir la table personne et la table administrateur_module ???
    non, tu as juste qu'a utiliser un insert au niveau de la table fille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     INSERT INTO administrateur_module values (num_personne,nom,login,password,num_admin_site);

    et lorsque je veux selectionner les clients de ma base, je fais
    SELECT nom, login,adresse from Personne, client where num_client=num_personne;
    pour sélectionner toutes les données des personnes en y incluant les données de la table fille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * FROM administrateur_module where nom='nomRecherché';
    En fait si tu fais un select à partir de la table fille tu auras les valeurs de la table mère et de la table fille.
    Par contre si tu fais une requête à partir de la table mère tu n'auras que les colonnes de la table mère.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Encore une derniere question qui va paraitre bete! A quoi elle sert exactement la table mere si on ne rentre aucune données dedans ?

    Tu m'as dit que lorsque je fais un insert, je le fais dans ma table fille, cela signifie que les données ne sont pas inserées dans la table mere(personne) donc dans la table personne, il n'y aura pas de données. ?

  6. #6
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    C'est vrai qu'il n'y aura pas d'enregistrement physique dans la table personne si tu n'utilise pas la clause insert pour la table personne.

    A quoi elle sert exactement la table mere si on ne rentre aucune données dedans ?
    Moi je veux bien mais si tu ne crées pas de table personne je ne te raconte pas la redondance dans les 3 tables filles.

    Maintenant si tu veux faire un select dans la table mère les données vont quand même apparaître, malgré que les données aient été insérées a partir de la table fille.

    Pour ne voir que les données de la table mère, qui ont été insérées à partir d'une clause select sur la table mère tu dois lui ajouter le mot-clé ONLY.

    Voilà, j'espère que j'ai répondu dans les grandes lignes à ta question.
    N'hésites pas si c'est encore un peu flou.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Donc si j'ai bien compris,les champs de ma table mere ne se retrouverons pas dans mes tables filles c ça ?

    Lorsque je fais

    creta table personne(num_personne,nom,prenom);
    create table client(num_client) inherits personne;

    lorsque la table est créée dans la base de données, ma table client est bien comme ceci (num_personne, nom, prenom, num_client ) ???

    Si tu me dis oui, cela signifie que forcement dans mes tables filles (ici client) les champs sont redondant.

    Si tu me dis non, elle est comme cela client(num_client) alors je ne comprends pas le sens de l'heritage.

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    En fait tu peut faire une table client qui se contente de referencer une personne, tu aurras l'equivalent de l'heritage sans heritage...

    L'avantage de l'heritage c'est la simplicité de l'ecriture, c'est tout...

    Donc oui, des champs seront redondants (num_client et num_personne dans ton cas)... mais as-tu besoin du num_client ?

  9. #9
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    non en fait je n'ai pas besoin du num_client , juste le num_personne suffira.


    Donc si je recapitule et si j'ai compris, ma classe mere(personne) ne me sert pas a grand chose. Elle est juste là pour expliquer plus simplement mon MCD.

    Mais lorsque ma base est généré, je me retrouve qd meme avec mes tables filles ( qui reprennent les champs de ma table mere) ?

    cela revient au meme si j'avais créée seulement les tables filles avec les memes nom de champs ?

    Merci

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Oui et non ...

    si tu n'utilises jamais la table mere : OUI

    L'interet est de pouvoir faire des recherches sur la table mere...

    Tu aurrais pu faire une table client
    CLIENT(num_client,num_personne,prenom,adresse,ville)
    puis utiliser des jointures entre client et personne plutot que de faire un heritage...

    l'interet est de pouvoir rechercher une personne a partir de son login sans savoir si c'est un client.

    donc 3 solutions :
    1- l'heritage => SELECT nom FROM personne WHERE login="toto"
    2- la jointure qui ne change rien sur ce cas precis
    3- des champs separes => tu dois reconstituer la table personne par des UNION des tables filles...

  11. #11
    Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    ok je comprends mieux!

    petite derniere question : a l'inverse comment je sais qu'une personne est un client ou un fournisseur par exemple. Lorsque je me connecte, je rentre mon mot de passe et mon login ( toto, password) , si j'utilise l'heritage, comment je sais que c dans la table client que toto existe ?

    Merci

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Ben je ne vois pas d'autre solutions que de faire la requete sur chaqune des tables filles (en utilisant la clef cette fois-ci pour que ce soit plus rapide.)

    Sans doute Postgres prevois-t-il des mecanisme par le biais des no de tuples...

    Bon apres rien ne t'empeche d'ajouter des champs dans la table mere pour y indiquer ce genre d'informations...

  13. #13
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Points : 172
    Points
    172
    Par défaut attention
    moi je te conseille de ne pas utiliser l'héritage dans PostGreSQL, je trouves que c'est mal implementé et surtout t'auras des problèmes avec l'intégrité référentielle.
    C'est juste un moyen de représentation un peu plus jolie mais pas du tout nécessaire.
    Walid

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    Bonjour,
    qu'entendez vous par intégrité référentielle ?

    Citation Envoyé par wello00 Voir le message
    moi je te conseille de ne pas utiliser l'héritage dans PostGreSQL, je trouves que c'est mal implementé et surtout t'auras des problèmes avec l'intégrité référentielle.
    C'est juste un moyen de représentation un peu plus jolie mais pas du tout nécessaire.
    Walid
    j'ai testé l'héritage dans postgres et c'est bien lorsque l'on veut représenter
    les données dans une seule table. mais pour lier la table mère à une autre table par des relation (n,n), la table d'association ne voit aucune données

    stessy : C'est vrai qu'il n'y aura pas d'enregistrement physique dans la table personne si tu n'utilise pas la clause insert pour la table personne.
    donc pour faire des recherches sur la table mère, vous l'avez bien dit, il faut saisir deux fois.

    cependant, les doublons, et la multiplication des tables me gène.
    je suis en train d'essayer de mettre un trigger à l'insertion des données dans la table mère et d'en remplir automatiquement les tables filles.

Discussions similaires

  1. Héritage postgresql (problème d'unicité)
    Par zakimadrid dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 17/01/2014, 18h19
  2. Héritage avec PostgreSQL
    Par barbug dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 14/12/2010, 22h28
  3. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    Réponses: 3
    Dernier message: 08/02/2007, 11h10
  4. postgresql et héritage
    Par ealias dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 28/05/2005, 17h38
  5. Réponses: 2
    Dernier message: 30/05/2002, 09h54

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