Faz sentido padronizar, incluindo um campo de data de criação e data da última atualização em todas as tabelas de banco de dados?


38

Meu chefe está atualmente tentando aplicar alguns padrões de desenvolvimento à nossa equipe, então tivemos uma reunião ontem para discutir os padrões que estavam indo muito bem até que ela falou:

  • Todas as tabelas de banco de dados terão uma coluna CreatedDate e LastUpdatedDate, atualizada por gatilhos.

Nesse ponto, nossa equipe sofreu um cisma de opinião; metade de nós acha que fazer isso em todas as tabelas é uma grande quantidade de trabalho com pouco benefício (trabalhamos em projetos de orçamento fixo, para que qualquer custo provenha dos lucros de nossa empresa); a segunda metade acredita que ajudará no apoio aos projetos.

Estou firmemente no antigo campo. Embora eu aprecie que alguns casos externos façam com que as colunas extras melhorem o suporte, na minha opinião, a quantidade de trabalho necessária para adicionar as colunas em primeiro lugar, bem como a manutenção, nos levaria a gastar menos tempo em mais coisas importantes, como testes de unidade ou de carga. Além disso, tenho certeza de que essas colunas extras tornariam mais complicado o uso de um ORM - tendo em mente que usamos principalmente C # e Oracle, o que não é muito bom para ORM no início.

Então, minha pergunta é dupla:

  • Estou no acampamento certo? Não pretendo ter habilidades de banco de dados de renome mundial; portanto, essa pode ser uma adição trivialmente fácil, sem efeitos colaterais adversos.
  • Como você lidaria com uma situação em que uma reunião sobre padrões se transforma em uma disputa de escória? Como posso realmente vender que esse padrão não vai nos ajudar a longo prazo?

Por que você diz que o C # não é compatível com ORM? Além disso, adicionar as propriedades [insert = "false" update = "false" generator = "always"] ao mapeamento dessas duas colunas no NHibernate, por exemplo, não me parece tão estranho ou estou faltando alguma coisa?
Jalayn

O C # + Oracle não está satisfeito com o ORM e descobrimos que o NHibernate era muito pesado (aparentemente, eu não estava envolvido nessa investigação de ferramentas). Eu provavelmente coloquei o C # e o Oracle para trás na questão principal.
Ed James

Você deve renomear o título da sua pergunta para ser mais descritivo aos padrões do banco de dados.
Maple_shaft

Como isso levaria tempo para algo? Você precisará fazer isso pelo menos duas vezes para os 'casos externos'. Crie uma ferramenta e algumas classes reutilizáveis ​​e nunca mais se preocupe com isso.
Steven Evers

Respostas:


27

Essa é uma prática bastante comum, embora eu não diria que a capacidade de suporte é o principal benefício. O benefício real dessa abordagem é manter uma trilha de auditoria. Também é um local comum ter uma coluna extra contendo o nome de usuário do usuário que fez a última atualização.

Se você estiver lidando com qualquer tipo de dados financeiros ou sensíveis, tenho certeza de que já ouviu falar de coisas como conformidade com PCI e SOX . Ter uma trilha de auditoria abrangente é essencial para atender a essas especificações.

Isenção de responsabilidade: No entanto, existem maneiras muito melhores de obter uma trilha de auditoria do banco de dados> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails


Desculpe, esqueci de mencionar, a conformidade com o PCI (etc.) não é aplicável, já existe uma trilha de auditoria de processo nos logs (TUDO é registrado completamente).
Ed11

6
"(TUDO é registrado completamente)" inclui isso CreatedDate e LastUpdatedDate? Se assim for, talvez você poderia apontar seus colegas no sentido do princípio de DRY :)
MattDavey

2
Esse é um ponto muito bom, talvez eu deva buscar um analisador de log mais eficiente que possamos usar para consultar facilmente os dados arquivados (obviamente, os dados são para fins de trilha de auditoria, portanto, não mantemos mais do que uma semana disponível para consulta, o restante é armazenado).
Ed James

3
Eu não acho que essa abordagem trará uma trilha de auditoria rica ... eu nem chamaria de trilha de auditoria .
Jordão

@ Jordão Eu disse que era uma abordagem comum, não disse que era uma boa! Daí o aviso legal :)
MattDavey

17

O argumento anterior é inválido, porque adicionar alguns campos de carimbo de data / hora mantidos no banco de dados a uma série de tabelas não é um trabalho difícil. Na verdade, esse é o tipo de tarefa entorpecente que alguém daria a um júnior ou a um estagiário, e eles poderiam fazer isso facilmente em uma única corrida de duas semanas, com tempo de sobra.

Pode ou não ser necessário mapear esses campos no ORM, simplesmente porque você não deseja que os usuários do aplicativo modifiquem esses campos e porque são úteis para manutenção e depuração e raramente têm uso na lógica de negócios. Eu trabalhei em lojas que fizeram as duas coisas e, francamente, não tenho muita opinião sobre isso.

Os benefícios, mesmo que exagerados, ainda superam em muito os custos humanos na implementação de tal funcionalidade no nível do banco de dados, e certamente provavelmente menos do que o poder coletivo do cérebro dos projetos de grandes mentes técnicas que sequestram a reunião e a disputam em uma luta épica no peito. Quando você calcula o impacto que algumas reuniões de 1 hora têm na vida útil de um projeto, você provavelmente não ficará surpreso que elas sejam caras. Imagine o salário horário coletivo e os benefícios de todas essas pessoas combinadas e isso deve lhe dar uma idéia.


8
Crie um script que adicione essas colunas a todas as tabelas se elas ainda não existirem junto com os gatilhos.
9118 JeffO

3
+1 Você pode codificar para gerar os scripts facilmente em alguns dias. Apenas muito trabalho se for feito manualmente.
precisa

8

... as declarações mais definitivas que um homem aumenta, é mais provável que ele esteja definitivamente errado ... - tyler durden

isso se aplica a "padrões" comuns, enquanto em algumas mesas isso pode ser uma grande vitória, em todas as mesas provavelmente haverá ruído inútil e mais código para manter ou esquecer de manter.

existe um equilíbrio aqui, é isso que você deve empurrar para os tomadores de decisão.


8

Eu concordo plenamente. Quase todas as tabelas em todos os bancos de dados devem ter pelo menos 2 campos: a data de criação e a data de atualização . Há muitos motivos para você colocar uma data de criação e uma data de atualização. Por razões óbvias que pessoas anteriores declararam ... que é auditoria.

Projecto sistemas e bases de dados há 25 anos e trabalhei para centenas de clientes. Não há um único cliente que NÃO precise disso.

Existem 2 maneiras básicas de fazer isso:

1 - A primeira prática é deixar o banco de dados fazer o trabalho e colocá-lo diretamente no design da tabela. Qual é o mínimo, eu recomendaria.

2 - A outra prática, que eu prefiro ... é usar uma ferramenta de replicação para lidar com isso. Há pouca sobrecarga e nenhum custo para as equipes de DEV. No entanto, as ferramentas são caras. Uma vantagem adicional é que o processo de exclusão pode ser auditado muito mais facilmente com esse tipo de ferramenta. Sem uma ferramenta de replicação, você precisaria criar uma tabela de auditoria e disparar disparos para exclusões - não é uma boa prática na minha opinião.

Outro benefício de ter esses campos é o data warehouse e o ODS que SEMPRE são criados para qualquer sistema OLTP. Você não pode efetivamente extrair dados incrementais sem eles. Caso contrário, você corre o risco de recarregar todo o banco de dados todos os dias.

Há um número enorme de outras razões comerciais para colocar essas duas datas, das quais não vou me aprofundar aqui. Faça sua lição de casa e tenho certeza de que, 3-6-12-48 meses depois, você ficará muito feliz em colocar nesses 2 campos simples.

Eu implementei e geralmente recomendo as duas soluções sempre que possível.


5

Temos a data de criação e as colunas do nosso banco de dados e elas nos ajudaram tremendamente a rastrear problemas de dados. Se precisarmos reverter, isso nos ajudará a encontrar os registros corretos nas tabelas de auditoria completas (porque sabemos onde procurar em uma tabela muito grande). Ela deve adicionar um criado por e modificado por colunas também. Realmente ajuda saber quem colocou os dados, especialmente se você não tiver uma auditoria completa.

Não consigo pensar em nenhum aplicativo corporativo que não precise de auditoria de uma forma ou de outra. Aparentemente, seu chefe acha que precisa apenas de uma auditoria relativamente leve. Pessoalmente, sou a favor da auditoria completa em todos os bancos de dados que contêm dados dos quais sua empresa depende (é muito mais fácil reverter esses 2.000 registros incorretos das tabelas de auditoria do que restaurar backups) e exigiria isso se houver alguma informação financeira, como eu vi esse tipo de coisa ajudar a pegar as pessoas que cometem fraudes. Toda a auditoria deve estar no nível do banco de dados.

Como esses dados podem ajudar? Bem, primeiro ele reduz quando procurar os dados antigos (em uma revisão) e pode ajudá-lo a ver qual versão do seu programa estava ativa no momento em que os dados foram inseridos. Portanto, se você sabe que resolveu esse problema na versão 2.3, que foi ao ar em 6 de julho de 2011 e encontrou o mesmo problema com um registro inserido em 7 de agosto, talvez sua correção não tenha sido boa. Se você precisar reverter para dados antigos, ele informará em qual versão dos backups você poderá encontrar os dados antigos se não tiver uma auditoria completa.

Os desenvolvedores raramente parecem pensar que os dados devem ser mantidos ao longo do tempo e que dados ruins precisam ser corrigidos por alguém. Ter coisas assim pode ser muito valioso para aqueles que precisam fazer essas coisas. Seu chefe está certo, embora eu não ache que ela foi longe o suficiente na auditoria. Leva apenas um problema realmente sério que é fácil de corrigir para justificar a quantidade muito pequena de tempo necessária para adicionar essas colunas e gatilhos.


Eu preferiria ver as pessoas efetivamente testando suas correções da unidade do que tentar verificá-las com verificações de banco de dados, mas agradeço seu ponto de vista. No entanto, não tenho a certeza que o ponto que você faz se aplicaria a mesa todos em todos os nossos bancos de dados, mesmo as tabelas de referência etc.
Ed James

Os testes de unidade são separados da auditoria. Mencionei que ele pode pegar um bug porque já vi acontecer mesmo quando havia testes de unidade porque havia um caso de borda não testado. Também pode indicar que os dados foram inseridos antes da correção do bug e, em seguida, você pode precisar encontrar outros dados que também precisam ser corrigidos. Ou apenas saiba que foram os dados inseridos por meio de uma importação em 6 de junho de 2016 que o ajudarão a ver se o problema foi algo que sua importação fez ou algo errado com os dados no arquivo de importação. Isso é muito mais fácil do que procurar um arquivo de importação diária de vários anos.
HLGEM 6/06

4

A carga de trabalho é discutível porque isso pode ser script e aplicado a todos os bancos de dados que você criará. Adicione as colunas a todas as tabelas junto com os gatilhos. Você só precisa se lembrar de executá-lo com sua compilação.

Na medida em que o cliente deseja, você pode pagá-lo para integrá-lo ao seu aplicativo como bem entender. Muitos gostam de ver informações adicionais em um registro, como quem o criou / mudou por último e quando. Não é necessário enviar um email para todos para descobrir ou mentir. Você não precisa consultar um log toda vez que alguém olha para um registro.

Colocá-lo no banco de dados e tê-lo lá apenas por precaução não é tão difícil e pode permitir que você cobrar por recursos adicionais que utilizam os campos ou apenas para fornecer algum feedback sobre a quantidade de clientes que estão usando o sistema.


Os clientes não expressaram nenhuma opinião sobre o assunto (até onde eu saiba) e provavelmente não têm idéia sobre nossos novos padrões, por isso espero que não estejam interessados ​​em pagar por qualquer integração;) No entanto, a coisa "pode ​​permitir que você carregue" é um argumento razoavelmente bom, se um pouco dependente de "pode" para minha abordagem usual de desenvolvimento.
Ed James

1

Seria uma implementação bastante trivial (talvez um a três dias no total), portanto, na minha opinião, é quanto valor será adicionado ao seu aplicativo ao longo da vida útil.

Primeiro, seria necessária uma instrução alter table para adicionar as colunas, a tabela alter seria a mesma (exceto o nome da tabela), para que você pudesse escrever um script para gerar a instrução SQL alter para todas as tabelas necessárias. . É necessário permitir que os NULLs considerem os dados existentes e verifique a existência das colunas para que sejam executáveis ​​novamente.

Segundo, para as colunas, o uso de valores padrão, como GetUTCDate () (SQL Server, Oracle, talvez diferente) resolve quaisquer adições de codificação na inserção, portanto, a base de código não precisa ser alterada para nenhuma das instruções de inserções, pois os valores padrão serão usava.

As atualizações de dados (alteração para a última modificação) podem ser resolvidas com um gatilho de atualização. Novamente, esse gatilho seria quase o mesmo em todas as tabelas, portanto esse código de gatilho (SQL) também poderia ser gerado para qualquer tabela existente.

Existe potencialmente muito código de script sql (dependendo de quantas tabelas), mas é um padrão que pode ser repetido; portanto, você pode gerá-lo por código observando um esquema de banco de dados existente.


Eu me preocupo que, com uma abordagem de banda larga como essa, você tenha problemas de manutenção de longo prazo com novas tabelas ou que (ainda pior) seja necessário criar um sproc que varre cada tabela em busca de determinadas colunas nomeadas para gerar cada tabela o script DDL para adicioná-los se estiver faltando, o que soa como um pesadelo de manutenção!
Ed James

Se esse é um padrão, espero que o desenvolvedor que cria as novas tabelas siga o padrão. Caso contrário, sim, pesadelo. A abordagem é acelerar o esquema existente, após a responsabilidade do desenvolvedor seguir o padrão.
Jon Raynor

Acho que a palavra-chave desse comentário é "esperançosamente", não tenho certeza se confio em tudo o que deve acontecer com a vontade de cada novo desenvolvedor!
Ed James

2
@ Ed - Concordado, sem confiança, é para isso que servem as revisões de código! :)
Jon Raynor
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.