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.
Algumas notas primeiro:
Considerando que
Accounts
tem umaunique
restrição em(account_type, account_store)
, um Pagamento parece estar associado a apenas uma Conta. Isso sugere que o FK fromPayments
deve referenciarAccounts
(e nãoStores
). Essa alteração também resolverá o problema nº 2.Adicionar
account_type
aPayments
(e modificar de acordo a chave estrangeira paraPayment_types
) parece ser a abordagem mais sensata e resolverá o problema nº 3.As duas alterações juntas resolverão o problema nº 1.
A Oracle não tem
ON UPDATE CASCADE
opção, então este problema (atualizar o account_type de um Payment_type para atualizar os pagamentos relacionados) precisa ser resolvido por um gatilho de atualização ou por um procedimento armazenado (que também verificará se as contas relacionadas também existem (ou são adicionadas ) para todas as Lojas que possuem Pagamentos do tipo_de_conta (atualizado).O design sugerido, supondo que você também tenha uma
Account_types
tabela (renomeei algumas colunas, mas isso depende de você e de suas preferências / convenções):Observe como ambas as chaves estrangeiras
Payments
usam chaves compostas.