Bien sûr, vous pouvez le faire par exemple pour appliquer qu'une seule table secondaire peut faire référence à une ligne donnée:
CREATE TABLE Super_Table (
super_id SERIAL PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
UNIQUE KEY (super_id, sub_type)
);
CREATE TABLE Sub_Table_A (
super_id PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
CHECK (sub_type = 'A'),
FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);
CREATE TABLE Sub_Table_B (
super_id PRIMARY KEY,
sub_type CHAR(1) NOT NULL,
CHECK (sub_type = 'B'),
FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);
Maintenant, il n'y a aucun moyen d'une ligne de Super_Table peut être référencée par une ligne dans les deux tables sous . La ligne dans Super_Table doit avoir 'A' ou 'B' et donc seulement une des sous-tables peut satisfaire la référence de clé étrangère.
Re votre commentaire:
Ma compréhension est que la mise en œuvre de PostgreSQL actuelle INHERITS permet un certain nombre d'anomalies liées à des indices, constaints uniques et les clés étrangères. L'utilisation de cette fonctionnalité est délicate et sujette aux erreurs. Fondamentalement, parce que les index n'existent que sur une seule table, si vous avez une contrainte unique sur votre table parente alors comment peut-elle imposer cette unicité sur le parent et tous ses enfants? Les enfants peuvent insérer des valeurs dans leurs tables qui existent déjà dans le parent, ou le parent peut insérer une valeur qui existe déjà dans l'un des enfants. De même, les clés étrangères ne peuvent pas référencer la table parent et/ou ses enfants car la ligne référencée est ambiguë si plusieurs lignes peuvent exister dans parent/enfants avec la même clé primaire ou la même valeur unique.
Ce sont des limitations connues et non résolues d'INHERITS dans PostgreSQL. La conception que j'ai montrée ci-dessus résout le problème pour la clé primaire, mais pas pour les clés uniques secondaires.
http://archives.postgresql.org/pgsql-hackers/2010-05/msg00285.php
Quel problème avez-vous? L'héritage de Spring/Hibernate a une portée différente comme dans PostgreSQL. N'essayez pas de résoudre un problème que vous n'avez pas, vous vous retrouverez avec de vrais problèmes. –