Estou tentando colocar em prática o seguinte modelo de entidade:
Temos uma lista de Pagamentos, cada Pagamento pertence a uma determinada loja e é de um determinado tipo de pagamento (ex. 10€ de custo de manutenção na Loja1, 20€ de renda na Loja2)
Um tipo de pagamento é uma categoria como (aluguel, manutenção, taxas legais, licenças) e cada categoria é atribuída a um determinado tipo_de_conta (por exemplo, orçamento_legal, orçamento_mensal, orçamento_extraordinário) em que vários tipos de pagamento podem ter o mesmo tipo_de_conta
Temos contas: Uma conta pertence a uma determinada loja para um determinado tipo de conta. Portanto, Store1 pode ter tipos de conta budget_legal, budget_monthly , enquanto Store2 tem tipos de conta budget_legal, budget_monthly e budget_extra
Modelo de Relacionamento:
Imagem criada com http://draw.io/
Agora quero uma restrição de que cada pagamento deve pertencer a uma conta existente. Quero garantir o seguinte:
Quando altero o account_type de um Payment_type, todos os pagamentos deste tipo passarão a "pertencer" às respetivas contas.
Se eu excluir uma conta, desejo excluir todos os pagamentos dessa conta (como excluir cascata em uma chave estrangeira)
Só posso inserir/atualizar Pagamentos para que cada pagamento se refira a um store_id/account_type válido, que existe na tabela de contas.
Possíveis soluções que tentei, mas realmente não funcionam:
Tentei adicionar o tipo_de_conta aos pagamentos, mas depois dobrei o campo - e quando eu alterar um tipo de pagamento terei que alterar os pagamentos referenciados via gatilho. - Mas, na melhor das hipóteses, não quero gatilhos para impor a integridade dos dados - e não quero armazenamento de dados duplicado.
Tentei criar uma restrição de chave estrangeira em várias tabelas/uma exibição que une o pagamento com o tipo_de_pagamento. Infelizmente isso parece ser impossível no Oracle DBMS
Tentei criar uma coluna virtual em Payments, que calcula o valor de payment_types, mas as colunas virtuais só podem fazer referência a colunas na mesma tabela.