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?
fonte
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:
fonte
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.
fonte
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.
fonte
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.
fonte
Você pode tentar algo como isto:
A
approved_objects
tabela indica qual aprovação acompanha qual objeto aprovado. O objeto aprovado poderia estar eminvoices
,orders
ou outra coisa. Você determina em qual tabela procurar com baseapproved_object_type_id
. Isso será flexível, mas poderá tornar os relatórios um pouco complicados.fonte