PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Dois-je ajouter une colonne de type pour concevoir l'héritage dans postgreSQL ?

Bien sûr, vous pouvez le faire par exemple pour imposer qu'un seul sous-tableau puisse référencer 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 qu'une ligne dans Super_Table puisse être référencée par une ligne dans les deux sous-tables. La ligne dans Super_Table doit avoir 'A' ou 'B' et donc une seule des sous-tables peut satisfaire la référence de clé étrangère.

Concernant votre commentaire :

Je crois comprendre que l'implémentation PostgreSQL actuelle d'INHERITS autorise un certain nombre d'anomalies liées aux index, aux contraintes uniques et aux contraintes de clé étrangère. L'utilisation de cette fonctionnalité est délicate et sujette aux erreurs.

Fondamentalement, étant donné que les index n'existent que sur une seule table, si vous avez une contrainte unique sur votre table parent, comment peut-elle appliquer cette unicité sur le parent et tous ses enfants ? Les enfants peuvent insérer dans leurs tables des valeurs 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 il est ambigu de savoir quelle ligne est référencée si plusieurs lignes peuvent exister dans le parent/les enfants avec la même clé primaire ou la même valeur unique.

Ce sont des limitations connues et non résolues de 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