sql >> Databasteknik >  >> RDS >> PostgreSQL

Ska jag lägga till en typkolumn för att designa arv i postgreSQL?

Visst kan du göra detta till exempel för att tvinga fram att endast en undertabell kan referera till en given rad:

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

Nu finns det inget sätt att en rad i Super_Table kan refereras av en rad i båda undertabellerna. Raden i Super_Table måste ha antingen 'A' eller 'B' och därför kan endast en av undertabellerna uppfylla den främmande nyckelreferensen.

Angående din kommentar:

Min uppfattning är att den nuvarande PostgreSQL-implementeringen av INHERITS tillåter ett antal anomalier relaterade till index, unika begränsningar och främmande nyckelbegränsningar. Att använda den här funktionen är knepigt och felbenäget.

I grund och botten, eftersom index bara existerar över en enda tabell, om du har en unik begränsning på din överordnade tabell, hur kan den då genomdriva den unikheten över föräldern och alla dess barn? Barnen kan infoga värden i sina tabeller som redan finns i föräldern, eller föräldern kan infoga ett värde som redan finns i ett av barnen.

På samma sätt kan främmande nycklar inte referera till den överordnade tabellen och/eller dess underordnade eftersom det är tvetydigt vilken rad som refereras till om flera rader kan finnas i överordnade/underordnade med samma primärnyckel eller unika värde.

Dessa är kända och olösta begränsningar för INHERITS i PostgreSQL. Designen jag visade ovan löser problemet för primärnyckeln, men inte för sekundära unika nycklar.

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




  1. Hur man skriver data på ett nytt EXCEL-ark

  2. FrankenQueries:när SQL och NoSQL kolliderar

  3. Strängar automatiskt objekt när det infogas i en MySQL JSON-kolumn med knex

  4. Uppdatera inte kolumnen om uppdateringsvärdet är null