PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Devo aggiungere una colonna di tipo per progettare l'ereditarietà in postgreSQL?

Certo, puoi farlo, ad esempio, per imporre che solo una sottotabella possa fare riferimento a una determinata riga:

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

Ora non è possibile che una riga in Super_Table possa essere referenziata da una riga in entrambe le sottotabelle. La riga in Super_Table deve avere 'A' o 'B' e quindi solo una delle sottotabelle può soddisfare il riferimento alla chiave esterna.

Re il tuo commento:

La mia comprensione è che l'attuale implementazione PostgreSQL di INHERITS consente una serie di anomalie relative a indici, vincoli univoci e vincoli di chiave esterna. L'utilizzo di questa funzione è complicato e soggetto a errori.

Fondamentalmente, poiché gli indici esistono solo su una singola tabella, se hai un vincolo univoco sulla tabella principale, come può imporre quell'unicità sul genitore e su tutti i suoi figli? I figli possono inserire valori nelle loro tabelle che già esistono nel genitore, oppure il genitore può inserire un valore che esiste già in uno dei figli.

Allo stesso modo le chiavi esterne non possono fare riferimento alla tabella padre e/o ai suoi figli perché è ambiguo a quale riga viene fatto riferimento se possono esistere più righe in padre/figli con la stessa chiave primaria o valore univoco.

Queste sono limitazioni note e irrisolte di INHERITS in PostgreSQL. Il design che ho mostrato sopra risolve il problema per la chiave primaria, ma non per le chiavi univoche secondarie.

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