Eu li o seguinte post Como você modela efetivamente a herança em um banco de dados? sobre herança em bancos de dados. Infelizmente não encontrei nada nos livros PostgreSQL da Packt. E agora estou um pouco confuso se minha abordagem é um exagero e nem pertence ao banco de dados ou faz sentido (veja minhas considerações no final).
Primeiro eu queria implementar o exemplo a seguir usando Table-Per-Concrete . Mas então eu li várias vezes que você só deve fazer isso quando realmente tiver problemas de desempenho e deve usar tabela por tipo desde que não tenha problemas de desempenho.
Assim, as seguintes relações são dadas:
system_user (system_user_id, type, first_name, last_name, ...)
user (system_user_id) *Has no unique attributes but special relations accessible only for him, e.g. orders
customer (system_user_id, company_name, ...)
supporter (system_user_id, nickname, ...)
Até agora tudo bem, mas eu queria saber como garantir no exemplo acima que:
- O tipo não pode ser alterado.
- Um system_user tem no máximo uma entrada em uma extensão.
Minha consideração:
- Um gatilho que gera um erro se o tipo for alterado durante um UPDATE.
- Um gatilho para cada ramal, que verifica antes de um INSERT, se já existe uma entrada com este system_user_id em outro ramal.
Isso faz sentido? Ou estou indo do jeito errado? Isso é mesmo necessário? Devo criar uma relação separada para cada entidade diretamente?
Talvez eu tenha uma visão de desenvolvedor de software orientada a objetos demais. Muito obrigado por suas respostas.
Acho que seu modelo de dados faz sentido. Eu adicionaria
type
às tabelas de "subclasse", criaria uma restrição exclusiva(system_user_id, type)
e criaria relacionamentos de chave estrangeira apontando parasystem_user
. Em seguida, adicione uma restrição de verificação às tabelas de subclasse para garantir quetype
tenha o valor correto.Isso evita o uso de um gatilho.