|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#2 |
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#4 | ||
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
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:
Code :
INSERT INTO administrateur_module VALUES (num_personne,nom,login,password,num_admin_site); Citation:
Code :
SELECT * FROM administrateur_module WHERE nom='nomRecherché'; 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 |
||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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. ? |
|
|
00
|
|
|
#6 | |
![]() ![]() Stessy DelcroixSenior Software Engineer JEE Inscription : avril 2002 Messages : 744 ![]() |
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:
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 |
|
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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. |
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() Inscription : avril 2002 Messages : 279 ![]() |
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 ? |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#10 |
|
Membre confirmé
![]() Inscription : avril 2002 Messages : 279 ![]() |
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... |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : janvier 2003 Messages : 8 ![]() |
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 |
|
|
00
|
|
|
#12 |
|
Membre confirmé
![]() Inscription : avril 2002 Messages : 279 ![]() |
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... |
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() Inscription : mai 2003 Messages : 145 ![]() |
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 |
|
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() Inscription : septembre 2008 Messages : 68 ![]() |
Bonjour,
qu'entendez vous par intégrité référentielle ? Citation:
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:
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. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com