sql >> Databáze >  >> RDS >> PostgreSQL

Mám přidat sloupec typu pro návrh dědičnosti v postgreSQL?

Jistě to můžete udělat například pro vynucení toho, že pouze jedna podtabulka může odkazovat na daný řádek:

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

Nyní neexistuje žádný způsob, jak by na řádek v Super_Table mohl odkazovat řádek v obou podtabulkách. Řádek v Super_Table musí mít buď 'A' nebo 'B', takže pouze jedna z podtabulek může vyhovět odkazu na cizí klíč.

K vašemu komentáři:

Chápu to tak, že současná implementace PostgreSQL INHERITS umožňuje řadu anomálií souvisejících s indexy, jedinečnými omezeními a omezeními cizích klíčů. Použití této funkce je složité a náchylné k chybám.

V zásadě, protože indexy existují pouze nad jedinou tabulkou, pokud máte na nadřazenou tabulku jedinečné omezení, jak může vynutit tuto jedinečnost nad nadřazenou a všemi jejími potomky? Děti by mohly do svých tabulek vložit hodnoty, které již existují v nadřazeném prvku, nebo by mohl rodič vložit hodnotu, která již existuje v jednom z potomků.

Stejně tak cizí klíče nemohou odkazovat na nadřazenou tabulku a/nebo její podřízené položky, protože je nejednoznačné, na který řádek se odkazuje, pokud v nadřazeném/podřízeném prvku může existovat více řádků se stejným primárním klíčem nebo jedinečnou hodnotou.

Toto jsou známá a nevyřešená omezení INHERITS v PostgreSQL. Návrh, který jsem ukázal výše, řeší problém pro primární klíč, ale ne pro sekundární jedinečné klíče.

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




  1. PHP, co se stane, když je řetězec dvojnásobný mysqli_real_escape_string

  2. Třídicí sloupec řetězce obsahující čísla v SQL?

  3. Spojení tabulek v Oracle SQL Developer

  4. Problém s týdenním přidělováním hodin v Rails a Postgresql