2010-07-28 2 views
1

Je prévois de créer une application web en utilisant spring/hibernate.Dois-je ajouter une colonne de type pour concevoir l'héritage dans PostgreSQL?

Comment devrais-je concevoir ma base de données postgresql afin de prendre en charge l'héritage?
Supposons que j'ai les tables suivantes: super_table, sub_table_1, sub_table_2.
Alors sub_table_1 et subtable_2 hériteraient super_table.

Dois-je ajouter une colonne de type (comme un char ou int) pour que je sais
si la ligne est en super_table sub_table_1 ou sub_table_2?

Veuillez nous aviser. Merci.

+1

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. –

Répondre

3

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

+0

Je pensais utiliser INHERITS. Est-ce possible? – geffchang

+0

En savoir plus sur http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch pourrait éclaircir une chose ou deux – AlexRednic