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

Restrições de chave estrangeira de associação polimórfica. Esta é uma boa solução?


O maior problema que tenho com o INHERITS do PostgreSQL implementação é que você não pode definir uma referência de chave estrangeira para a tabela pai. Existem muito dos casos em que você precisa fazer isso. Veja os exemplos no final da minha resposta.

A decisão de criar tabelas, views ou triggers fora do Rails é crucial. Depois de decidir fazer isso, acho que você também pode usar a melhor estrutura que puder encontrar.

Há muito uso uma tabela pai base, impondo subtipos disjuntos usando chaves estrangeiras. Essa estrutura garante que apenas uma associação possa existir e que a associação seja resolvida para o subtipo correto na tabela pai. (Na a apresentação de slides de Bill Karwin sobre antipadrões SQL , essa abordagem começa no slide 46.) Isso não requer gatilhos nos casos simples, mas geralmente forneço uma exibição atualizável por subtipo e exijo o código do cliente para usar as exibições. No PostgreSQL, as visualizações atualizáveis ​​exigem a gravação de gatilhos ou regras. (Versões anteriores a 9.1 exigem regras.)

No caso mais geral, os subtipos disjuntos não possuem o mesmo número ou tipo de atributos. É por isso que eu gosto de visualizações atualizáveis.

A herança de tabelas não é portátil, mas esse tipo de estrutura é. Você pode até implementá-lo no MySQL. No MySQL, você precisa substituir as restrições CHECK por referências de chave estrangeira para tabelas de uma linha. (O MySQL analisa e ignora as restrições CHECK.)

Eu não acho que você precisa se preocupar com a duplicação de dados. Em primeiro lugar, tenho certeza de que os dados não são duplicados entre tabelas pai e tabelas herdadas. Só aparece assim. Em segundo lugar, duplicação ou dados derivados cuja integridade é completamente controlada pelo dbms não é uma pílula especialmente amarga de engolir. (Mas não controlado duplicação é.)

Pense um pouco se as exclusões devem ocorrer em cascata.