PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Devo adicionar uma coluna de tipo para projetar herança no postgreSQL?


Claro que você pode fazer isso, por exemplo, para impor que apenas uma subtabela possa fazer referência a uma determinada linha:
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)
);

Agora não há como uma linha em Super_Table ser referenciada por uma linha em ambas as subtabelas. A linha em Super_Table deve ter 'A' ou 'B' e, portanto, apenas uma das subtabelas pode satisfazer a referência de chave estrangeira.

Re seu comentário:

Meu entendimento é que a implementação atual do PostgreSQL de INHERITS permite uma série de anomalias relacionadas a índices, restrições exclusivas e restrições de chave estrangeira. Usar esse recurso é complicado e propenso a erros.

Basicamente, como os índices existem apenas em uma única tabela, se você tiver uma restrição exclusiva em sua tabela pai, como ela pode impor essa exclusividade sobre o pai e todos os seus filhos? Os filhos podem inserir valores em suas tabelas que já existem no pai, ou o pai pode inserir um valor que já existe em um dos filhos.

Da mesma forma, as chaves estrangeiras não podem referenciar a tabela pai e/ou seus filhos porque é ambíguo qual linha é referenciada se várias linhas podem existir em pai/filho com a mesma chave primária ou valor exclusivo.

Estas são limitações conhecidas e não resolvidas de INHERITS no PostgreSQL. O design que mostrei acima resolve o problema da chave primária, mas não das chaves secundárias exclusivas.

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