PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sollte ich eine Typspalte hinzufügen, um die Vererbung in PostgreSQL zu entwerfen?

Sicher können Sie dies zum Beispiel tun, um zu erzwingen, dass nur eine Untertabelle auf eine bestimmte Zeile verweisen kann:

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)
);

Jetzt gibt es keine Möglichkeit mehr, auf eine Zeile in Super_Table durch eine Zeile in beiden Untertabellen zu verweisen. Die Zeile in Super_Table muss entweder 'A' oder 'B' haben und daher kann nur eine der Untertabellen die Fremdschlüsselreferenz erfüllen.

Zu Ihrem Kommentar:

Mein Verständnis ist, dass die aktuelle PostgreSQL-Implementierung von INHERITS eine Reihe von Anomalien im Zusammenhang mit Indizes, eindeutigen Einschränkungen und Fremdschlüsseleinschränkungen zulässt. Die Verwendung dieser Funktion ist schwierig und fehleranfällig.

Da Indizes nur über eine einzige Tabelle existieren, wie kann sie diese Eindeutigkeit für die übergeordnete Tabelle erzwingen, wenn Sie eine Eindeutigkeitsbeschränkung für Ihre übergeordnete Tabelle haben? Die untergeordneten Elemente könnten Werte in ihre Tabellen einfügen, die bereits im übergeordneten Element vorhanden sind, oder das übergeordnete Element könnte einen Wert einfügen, der bereits in einem der untergeordneten Elemente vorhanden ist.

Ebenso können Fremdschlüssel nicht auf die übergeordnete Tabelle und/oder ihre untergeordneten Tabellen verweisen, da nicht eindeutig ist, auf welche Zeile verwiesen wird, wenn mehrere Zeilen in übergeordneten/untergeordneten Tabellen mit demselben Primärschlüssel oder eindeutigen Wert vorhanden sein können.

Dies sind bekannte und ungelöste Einschränkungen von INHERITS in PostgreSQL. Das Design, das ich oben gezeigt habe, löst das Problem für Primärschlüssel, aber nicht für sekundäre eindeutige Schlüssel.

http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php