Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2003, 09h24   #1
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2003, 13h57   #2
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
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
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2003, 14h38   #3
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2003, 16h03   #4
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
Tout d'abord tu dois créer ta table fille en la faisant hériter de la table mère.

Code :
 CREATE TABLE administrateur_module ( les colonnes de la TABLE fille) INHERITS (personne);
Citation:
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 :
 INSERT INTO administrateur_module VALUES (num_personne,nom,login,password,num_admin_site);

Citation:
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 :
 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
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2003, 16h26   #5
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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. ?
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2003, 18h09   #6
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
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.

Citation:
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
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 08h46   #7
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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.
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 09h26   #8
Membre confirmé
 
Homme
Inscription : avril 2002
Messages : 279
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : avril 2002
Messages : 279
Points : 269
Points : 269
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 ?
Gandalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 09h38   #9
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 10h56   #10
Membre confirmé
 
Homme
Inscription : avril 2002
Messages : 279
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : avril 2002
Messages : 279
Points : 269
Points : 269
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...
Gandalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 11h07   #11
Invité de passage
 
Inscription : janvier 2003
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 8
Points : 0
Points : 0
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
lheureuxaurelie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2003, 15h06   #12
Membre confirmé
 
Homme
Inscription : avril 2002
Messages : 279
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : avril 2002
Messages : 279
Points : 269
Points : 269
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...
Gandalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2003, 18h30   #13
Membre habitué
 
Inscription : mai 2003
Messages : 145
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 145
Points : 146
Points : 146
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
wello00 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2008, 09h18   #14
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 68
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 68
Points : 26
Points : 26
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

Citation:
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.
nponzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h08.


 
 
 
 
Partenaires

Hébergement Web