AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 109060
Accepted
Falco
Falco
Asked: 2015-08-06 00:55:21 +0800 CST2015-08-06 00:55:21 +0800 CST 2015-08-06 00:55:21 +0800 CST

Restrição de chave estrangeira em duas tabelas

  • 772

Estou tentando colocar em prática o seguinte modelo de entidade:

  1. 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)

  2. 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

  3. 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:

Diagrama mostrando o 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:

  1. Quando altero o account_type de um Payment_type, todos os pagamentos deste tipo passarão a "pertencer" às respetivas contas.

  2. Se eu excluir uma conta, desejo excluir todos os pagamentos dessa conta (como excluir cascata em uma chave estrangeira)

  3. 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.

oracle database-design
  • 1 1 respostas
  • 2289 Views

1 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2015-08-08T02:07:04+08:002015-08-08T02:07:04+08:00

    Algumas notas primeiro:

    • Considerando que Accountstem uma uniquerestrição em (account_type, account_store), um Pagamento parece estar associado a apenas uma Conta. Isso sugere que o FK from Paymentsdeve referenciar Accounts(e não Stores). Essa alteração também resolverá o problema nº 2.

    • Adicionar account_typea Payments(e modificar de acordo a chave estrangeira para Payment_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 CASCADEopçã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_typestabela (renomeei algumas colunas, mas isso depende de você e de suas preferências / convenções):

    Account_types
    ---------------
    account_type_id  PK
    
    
    Payment_types
    ---------------
    account_type_id  PK, FK -> Account_types
    payment_type_id  PK
    
    
    Stores
    --------
    store_id         PK
    
    
    Accounts
    ---------------
    account_type_id  PK, FK1 -> Account_types
    account_id       PK
    store_id             FK2 -> Stores
    
    
    Payments
    ---------------
    payment_id       PK
    amount
    account_type_id      FK1, FK2 
    payment_type_id      FK1 -> Payment_types
    account_id           FK2 -> Accounts
    

    Observe como ambas as chaves estrangeiras Paymentsusam chaves compostas.

    insira a descrição da imagem aqui

    • 3

relate perguntas

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve