Melhores Práticas - meta dados deve e dados que definem funcionais ser misturados?
-
03-07-2019 - |
Pergunta
Considere o caso de uma aplicação web reportagem simples que tem uma coluna de tabela DB de "Status", que é acessível por um conjunto botão de opção de:
Status - [x] Publicar [] projecto [de] Arquivo
... onde "Publicar" mostra um artigo publicamente e "Rascunho" e "Arquivo" não. Funcionalmente "Rascunho" e "Arquivo" fazer a mesma coisa, mas carregam significados dados meta adicionais. Os dois estados funcionais do "show" e "esconder", juntamente com os dados de meta de "publicar", "rascunho" e "arquivo" são misturados na mesma coluna de "status".
Esta é uma boa prática? Enquanto este é um caso muito simples, casos maiores podem revelar falhas com tal prática um (ou não ...).
Solução
estados funcionais são sobre o comportamento - eles não precisam ser modelados em seu banco de dados. Se a sua lógica de negócios só se preocupa com "mostrando" artigos com um status de "Publicado". - não há nenhuma razão para dobrar a complexidade de seus dados com um show coluna
No ponto em que você decidir suas necessidades de lógica de negócios dados adicionais para fazer a decisão de mostrar ou ocultar um artigo (talvez uma bandeira IsApproved), então você pode armazenar esses dados.
Olhando para ele de um ângulo diferente - se você fosse adicionar outra coluna de "Show", em seguida, o que seria um artigo com um status de "Rascunho" e "Show" = 1 faz? De acordo com suas regras de negócios, que é um estado inválido.
Outras dicas
Neste caso, eu diria que esta é a funcionalidade adequada.
Nós todos vimos WTF de nos meios de comunicação em que alguém acidentalmente atingiu programa [x] e projecto [x] ao mesmo tempo.
O jeito que está agora, é impossível mostrar acidentalmente um projecto. Isto é importante em jornais como repórteres são notórios por coisas como:
John Doe, de StackOverflow disse: "--- Eu não consigo lembrar o que isso feio f * cker disse - Verifique a fita e preencha mais tarde"
O que provavelmente não deve ser impresso.