Qual é o melhor design de banco de dados para essa situação?


8

Estou trabalhando na criação de um aplicativo de negócios para minha empresa e lutando para escolher o design de banco de dados mais apropriado para uma situação específica. Digamos que eu tenho as seguintes entidades:

Aprovação

  • Eu iria
  • Status
  • ...

ApprovalComment

  • Eu iria
  • ApprovalId
  • Comente

Ordem

  • Eu iria
  • ...

Fatura

  • Eu iria
  • ...

Obviamente, pode haver vários tipos de aprovações e vários objetos que exigem aprovações. Qual seria a opção mais apropriada para a criação das tabelas:

OPÇÃO 1

Tenha uma tabela de aprovações com chaves estrangeiras nulas:

Aprovações

  • Id PK
  • Status
  • OrderId FK NULL
  • InvoiceId FK NULL

AprovaçãoComentários

  • Id PK
  • ApprovalId FK
  • Comente

Nesse caso, eu teria que adicionar uma coluna para cada objeto que precisa de aprovação

OPÇÃO 2

Tenha uma tabela pai de aprovações com campos comuns e uma tabela filha para cada objeto que precisa de aprovação:

Aprovações

  • Id PK
  • Status

AprovaçãoComentários

  • Id PK
  • ApprovalId FK
  • Comente

OrderApprovals

  • ApprovalId PK FK
  • OrderId FK

Aprovações da fatura

  • ApprovalId PK FK
  • InvoiceId FK

OPÇÃO 3

Tenha uma tabela de aprovações para cada objeto:

OrderApprovals

  • Id PK
  • OrderId FK
  • Status

OrderApprovalComments

  • Id PK
  • OrderApprovalId FK
  • Comente

Aprovações da fatura

  • Id PK
  • InvoiceId FK
  • Status

InvoiceApprovalComments

  • Id PK
  • InvoiceApprovalId FK
  • Comente

Sei que todas essas são soluções válidas, mas não consigo decidir qual seria a melhor para adicionar diferentes tipos de aprovações no futuro. Alguma ideia?

Respostas:


10

Uma regra prática que eu uso é que é um projeto de banco de dados ruim ter que alterar uma tabela para acomodar uma alteração de código ou um novo recurso, se puder ser planejado no futuro.

Dito isto, eu usaria uma variante da opção 1

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

Agora, ao adicionar novos tipos de objetos que precisam de aprovação, você só precisa inserir uma linha em ApprovalTypes, em vez de alterar uma tabela para adicionar uma coluna.


Para onde iria a relação de identificação com um pedido / fatura específica nessa situação? Digamos que um pedido exija uma "aprovação de crédito", portanto o tipo de aprovação seria de crédito, mas como ele se vincula ao pedido (ou a qualquer entidade)? Além disso, para onde iriam colunas adicionais específicas apenas para uma aprovação de crédito?
User1384977

Isso adiciona um pouco de complexidade. Você poderia ter uma tabela CreditApprovalDetails. Se você precisar vincular aprovações a pedidos, precisará de uma tabela de junção, a menos que seja 1: 1. No entanto, sem um entendimento completo de sua inscrição, não posso fazer uma sugestão informada.
Sreimer

2

Depende da cardinalidade do seu banco de dados e do que você deseja armazenar, por exemplo, você pode simplesmente fazer o comentário de aprovação como um único e estabelecer um relacionamento 1-1 entre o comentário de aprovação e aprovação, para que você pule para criar uma tabela extra ... viu desta maneira:

Cardinality:
Approval N ---- 1 Approval_comment.
Approval 1 ----- N Order
Order N ----- 1 Invoice

insira a descrição da imagem aqui


1

Eu voto na primeira alternativa. Se você adicionar um requisito de aprovação a um item, poderá alterar o comportamento desses itens, de forma que a adição de uma coluna não seja um grande problema. E também, é a melhor maneira de usar junções em consultas.

O segundo possui tabelas adicionais inúteis, o que pode sugerir que mais de uma aprovação pode pertencer a um item.

O terceiro contém muitas tabelas redundantes e provavelmente código redundante para lidar com elas.


1

Se você precisar decidir entre uma de suas três opções, acredito que a opção 2 é a melhor. O @sreimer está correto, pois a alteração da estrutura da tabela para eventos previsíveis aponta para um design inadequado. Ter o OrderID e o InvoiceID na tabela Aprovações é, a meu ver, muito próximo a um grupo de repetição entre colunas e viola o espírito, se não a letra, da primeira forma normal.

Eu consideraria adicionar uma coluna ApprovalID a cada tabela que precisa de aprovação. Se o valor for nulo, ele não foi aprovado. Se isso não for uma opção, acho que o @sreimer está no design adequado - alguns esclarecimentos podem ajudar a firmar isso.


1

Eu sugiro que você tenha apenas uma tabela =>

Aprovação

Eu iria

status

Comente

E tenha aprovaçãoId armazenado em inovice ou tabela de pedidos. Dessa forma, você não precisa adicionar colunas para cada objeto e há menos tabelas para manter. E se eu tiver que escolher entre a opção que você forneceu, seguirei a opção 2 e mesclarei o comentário de aprovação na tabela de aprovação.


0

Você pode tentar algo como isto:

Aprovações
---------
  EU IRIA
  status
  approver_name
  (outras coisas)

Encomendas
------
  EU IRIA
  (outras coisas)

Faturas
--------
  EU IRIA
  (outras coisas)

aprovado_objetos
----------------
  EU IRIA
  Approval_id (FK - refere-se à tabela de aprovações)
  aprovados_objeto_id (FK - pode se referir ao ID de faturas, pedidos, etc ...)
  aprovados_objeto_tipo_id (FK se refere a tipos_objetos aprovados)

tipos_de_objeto aprovados
---------------------
  EU IRIA
  Nome

A approved_objectstabela indica qual aprovação acompanha qual objeto aprovado. O objeto aprovado poderia estar em invoices, ordersou outra coisa. Você determina em qual tabela procurar com base approved_object_type_id. Isso será flexível, mas poderá tornar os relatórios um pouco complicados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.