[PostgreSQL] Clef étrangère sur un parent

Clef étrangère sur un parent [PostgreSQL] - SQL/NoSQL - Programmation

Marsh Posté le 02-02-2005 à 11:25:12    

'jour à tous.
J'ai un petit problème avec postgreSQL, le voici :
 
* J'ai une table 'parent' dont l'identificateur est 'id' (entier) et une table 'enfant' qui dérive de 'parent'.
* J'ai une table 't1' qui référence la table 'parent' par une clef étrangère sur le champs 'id'.
* J'ajoute un enregistrement dans ma table 'enfant' avec 'id' = 1.
(jusque la tout va bien)
* J'ajoute un enregistrement dans ma table 't1' avec ma clef étrangère = '1' et la rien ne va plus :

ERROR:  insert or update on table "t1" violates foreign key constraint "<nom clef étrangère>"
DETAIL:  Key (parent)=(1) is not present in table "parent".


 
Bon alors peut-être que c'est simplement une limitation de postgreSQL mais si c'est le cas alors à quoi sert l'héritage ?!
 
[EDIT]
Pour être plus clair voici le schéma relationnel :
http://pifou.myftp.org/~bordel/exemple_heritage.GIF


Message édité par Ummon le 02-02-2005 à 11:43:09
Reply

Marsh Posté le 02-02-2005 à 11:25:12   

Reply

Marsh Posté le 02-02-2005 à 13:39:44    

"hériter" en relationnel-objet, c'est recopier toutes les colones de la table parente dans la table enfant, mais pas recopier les données.
 
ça veut dire que quand tu as créé un enfant, tu n'as pas créé un parent.

Reply

Marsh Posté le 02-02-2005 à 14:07:42    

Argh!, mais alors quelle sont les solutions en sachant que je peux avoir plusieurs 'enfants' ?

Reply

Marsh Posté le 03-02-2005 à 09:48:41    

TABLE ENFANT
ENFANT_ID (PK)
PARENT_ID (FK, non unique)
champs...


Message édité par Arjuna le 03-02-2005 à 09:49:32
Reply

Marsh Posté le 03-02-2005 à 10:29:53    

Euh... ouais mais t1 ne peut toujours pas pointer sur les enfants.
Bon j'ai résolu mon problème avec une table intermediaire entre t1 et parent
t1 -(FK)-> table_intermediaire <-(FK)- parent

Reply

Marsh Posté le 03-02-2005 à 11:52:06    

Elle te sert à quoi T1 ?
 
Avec la table que je t'ai indiqué, un même père peut avoir plusieurs enfants. C'est ce que tu veux non ?
 
T1 ne sert à rien dans ce cas.

Reply

Marsh Posté le 03-02-2005 à 11:54:32    

Une fois de plus, postez un exemple de données quand vous posez ce genre de questions. Parceque vu que les explications sont aussi claires que de la soupe aux légumes mixée, et qu'on ne sait pas quoi conserver des infos car on ne connaît pas votre niveau. Dans ce cas, la structure des données ne suffit pas, un jeu de données en plus est le bienvenu.
 
PS: et pour "T1", là je vois pas comment on peut connaître la structure... Y'a un lien vers Parent, dont je ne connais pas le symbole (peut-être une CIF ?) et pas de lien avec Enfant, donc pour moi elle est carrément hors jeu cette table.

Reply

Marsh Posté le 03-02-2005 à 15:27:48    

>to Arjuna  
Il me semblait pourtant que mes explications étaient suffisantes, d'ailleurs nraynaud à très bien compris mon problème.
 
Re explication :
 
- il y a un type de parent.
- il y a plusieurs type d'enfant dérivant au sens PostgreSQL (INHERITS) du type parent.
- je voudrai référencer n'importe quel type d'enfant depuis la table 't1' à l'aide d'une clef étrangère.
- mais visiblement la notion d'héritage est très simplifiée dans postgreSQL donc impossible à faire comme sur le schéma du premier message.
 
Merci quand même de ton aide.


Message édité par Ummon le 03-02-2005 à 15:28:45
Reply

Marsh Posté le 03-02-2005 à 15:39:08    

et le jeu de données, il est où ? Pour moi ça reste un joyeux charabia ce que tu viens d'écrire. Désolé [:spamafote]

Reply

Marsh Posté le 03-02-2005 à 15:41:13    

je ne vois toujours pas le lien entre T1 et les tables PARENT et ENFANT.
 
A mon avis, de toute façon, c'est dans tous les cas ta table T1 qui est à remettre en cause, si elle référence des "types d'enfants" je ne vois pas pourquoi tu la lie à la table PARENT.

Reply

Marsh Posté le 03-02-2005 à 15:41:13   

Reply

Marsh Posté le 03-02-2005 à 16:48:42    

Je n'ai pas de jeu de données, c'était une question théorique quand aux possibilités objets de postgreSQL, nraynaud m'a très bien répondu et j'ai compris mon problème, le sujet est clos.
Par contre je ne suis pas d'accord sur ton "[..]joyeux charabia ce que tu viens d'écrire [..]", il me semble que ce que j'ai écrit est clair et que tu n'as pas compris le fond du problème (problème lié à l'héritage).
 
(juste en passant il n'y a aucun lien explicite à l'aide de clefs étrangères entre le parent et l'enfant)


Message édité par Ummon le 03-02-2005 à 16:50:20
Reply

Marsh Posté le 03-02-2005 à 17:15:10    

Ummon > j'ai oublié de te donner la solution théorique :
 
parent(id)
enfant(<champs complémentaires>, idparent->parent)
 
chaque enfant a un pointeur vers sa partie "parent" et ne stocke que ce qui est spécifique à son statu d'enfant, c'est extrèmement lourd (c'est ce que fait gobject, le truc de gtk par ex.).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed