Est-il judicieux de normaliser l'inclusion d'une date créée et du champ de date de dernière mise à jour sur toutes les tables de base de données?

38

Mon patron tente actuellement d'appliquer certaines normes de développement à notre équipe. Nous nous sommes donc réunis hier pour discuter des normes, qui fonctionnaient généralement bien jusqu'à ce qu'elle nous parle:

  • Toutes les tables de base de données auront une colonne CreatedDate et LastUpdatedDate, mises à jour par les déclencheurs.

À ce stade, notre équipe a subi un schisme d'opinion; la moitié d'entre nous pensent que cela représente beaucoup de travail avec peu d'avantages sur toutes les tables (nous travaillons sur des projets à budget fixe, de sorte que tout coût provient des bénéfices de notre entreprise); la seconde moitié pense que cela aidera à soutenir les projets.

Je suis fermement dans l'ancien camp. Bien que j’apprécie que certains cas extérieurs amènent les colonnes supplémentaires à améliorer la prise en charge, à mon avis, la quantité de travail nécessaire pour ajouter les colonnes en premier lieu, ainsi que la maintenance, nous feraient perdre moins de temps à plus de temps. des choses importantes comme les tests unitaires ou en charge. De plus, je suis à peu près sûr que ces colonnes supplémentaires rendraient l'utilisation d'un ORM plus délicate, sachant que nous utilisons principalement C # et Oracle, ce qui n'est pas très agréable au départ.

Donc, ma question est double:

  • Suis-je dans le bon camp? Je ne prétends pas avoir des compétences de base de données de renommée mondiale, alors cela pourrait être un ajout trivialement facile sans effets secondaires indésirables.
  • Comment géreriez-vous une situation dans laquelle une réunion sur les normes se transforme en une partie de conflit? Comment puis-je vraiment vendre que cette norme ne va pas nous aider à long terme?
Ed James
la source
Pourquoi dites-vous que C # n'est pas ORM-heureux? En outre, l'ajout des propriétés [insert = "false", update = "false", généré = "toujours"] au mappage de ces deux colonnes dans NHibernate, par exemple, ne me semble pas si difficile, ou est-ce que quelque chose me manque?
Jalayn
C # + Oracle n’est pas heureux en ORM, et nous avons constaté que NHibernate était trop lourd (apparemment, je n’étais pas impliqué dans ce type d’investigation d’outillage). J'ai probablement mis le C # et Oracle à l'envers dans la question principale.
Ed James
Vous devriez envisager de renommer le titre de votre question pour mieux décrire les normes de base de données.
arbre_érable
Comment cela prendrait-il du temps? Vous allez devoir le faire au moins deux fois pour les «cas extérieurs». Créez un outil et des classes réutilisables sans plus vous en soucier.
Steven Evers

Réponses:

27

C'est une pratique assez courante, bien que je ne dirais pas que la prise en charge est le principal avantage. Le véritable avantage de cette approche est de conserver une piste de vérification. Il est également courant d'avoir une colonne supplémentaire contenant le nom d'utilisateur de l'utilisateur qui a effectué la dernière mise à jour.

Si vous traitez avec n'importe quel type de données financières ou sensibles, je suis sûr que vous avez entendu parler de choses comme la conformité PCI & SOX . Avoir une piste d'audit complète est essentiel pour répondre à ces spécifications.

Clause de non-responsabilité: Il existe cependant de bien meilleurs moyens de créer une piste d'audit de base de données> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails

MattDavey
la source
Désolé, j'ai oublié de mentionner, la conformité PCI (etc.) n'est pas applicable, il existe déjà une trace d'audit dans les journaux (TOUT est consigné de manière exhaustive).
Ed James
6
"(TOUT est consigné de manière assez détaillée)" cela inclut-il CreatedDate et LastUpdatedDate? Si oui, vous pourriez peut-être indiquer à vos collègues le principe DRY :)
MattDavey
2
C’est un très bon point. Je devrais peut-être préconiser un analyseur de journaux plus efficace que nous pouvons utiliser pour interroger facilement les données archivées (les données sont évidemment destinées à la trace d’audit, de sorte que nous ne gardons pas plus d’une semaine à leur disposition. requête, le reste est entreposé).
Ed James
3
Je ne pense pas que cette approche produira une piste d'audit riche ... Je ne l'appellerais même pas du tout une piste d'audit .
Jordão
@ Jordão J'ai dit que c'était une approche commune, je n'ai pas dit que c'était une bonne! D'où l'avertissement :)
MattDavey
17

Le premier argument n'est pas valide, car l'ajout de quelques champs d'horodatage conservés à une base de données à une série de tables n'est pas un travail difficile. C’est en fait le genre de tâche angoissante que l’on confierait à un stagiaire ou à un stagiaire. Ils pourraient facilement le faire en un seul sprint de deux semaines, avec suffisamment de temps.

Il peut être nécessaire ou non de mapper ces champs dans votre ORM, tout simplement parce que vous ne souhaitez pas que les utilisateurs de l'application modifient ces champs, car ils sont utiles pour la maintenance et le débogage et sont rarement utilisés dans la logique métier. J'ai travaillé dans des magasins qui fonctionnaient dans les deux sens et, franchement, je n'ai pas vraiment d'opinion là-dessus.

Les avantages, même exagérés, dépassent de loin les coûts humains liés à la mise en œuvre de telles fonctionnalités au niveau de la base de données, et probablement moins que l’intelligence collective des projets. Lorsque vous calculez l'impact de quelques réunions d'une heure sur la durée de vie d'un projet, vous ne serez probablement pas surpris qu'elles soient chères. Imaginez le salaire horaire et les avantages collectifs de toutes ces personnes réunies et cela devrait vous donner une idée.

arbre_érable
la source
8
Créez un script qui ajoutera ces colonnes à chaque table si elles n'existent pas déjà avec les déclencheurs.
JeffO
3
+1 Vous pourriez générer le code facilement dans quelques jours. Seulement beaucoup de travail si cela est fait manuellement.
Jon Raynor
8

... plus un homme fait de déclarations définitives, plus il risque de se tromper définitivement ... - tyler durden

ceci s'applique aux "normes" générales, alors que sur certaines tables, cela pourrait être une victoire énorme, sur chaque table, ce serait probablement du bruit inutile et plus de code à maintenir ou à oublier à entretenir.

il y a un équilibre à trouver ici, c'est ce que vous devriez pousser aux décideurs.


la source
8

Je suis tout à fait d'accord. Presque toutes les tables de chaque base de données doivent comporter au moins deux champs: la date de création et la date de mise à jour . Il existe de nombreuses raisons pour lesquelles vous devez indiquer une date de création et une date de mise à jour. Pour des raisons évidentes, ce que des personnes précédentes ont déclaré… qui est audit.

Je conçois des systèmes et des bases de données depuis 25 ans et j'ai travaillé pour des centaines de clients. Il n'y a pas un seul client qui n'en a PAS besoin.

Il y a 2 façons de faire cela:

1 - La première pratique consiste à laisser la base de données effectuer le travail et l'insérer directement dans la conception de la table. Quel est le strict minimum, je recommanderais.

2 - L’autre pratique, que je préfère .... utilise un outil de réplication pour gérer cela. Il y a peu de frais généraux et aucun coût pour les équipes de développement. Cependant les outils sont chers. Un avantage supplémentaire est que le processus de suppression peut être audité beaucoup plus facilement avec ce type d’outil. Sans un outil de réplication, vous auriez besoin de créer une table d'audit et d'activer les déclencheurs pour les suppressions - ce n'est pas une bonne pratique à mon avis.

Un autre avantage à avoir ces champs est l'entrepôt de données et l'ODS qui est TOUJOURS construit pour tout système OLTP. Vous ne pouvez pas extraire efficacement les données incrémentielles sans cela. Sinon, vous risquez de devoir recharger tous les jours la totalité de la base de données.

Il y a énormément d'autres raisons commerciales pour indiquer ces deux dates, que je ne vais pas approfondir ici. Faites vos devoirs et je suis sûr que dans 3-6-12-48 mois, vous serez très heureux de mettre ces deux champs simples.

J'ai implémenté et recommande généralement les deux solutions dans la mesure du possible.

Andrew Venuto
la source
5

Nous avons la date de création et les colonnes créées dans notre base de données et elles nous ont énormément aidées à repérer les problèmes de données. Si nous devons revenir, cela nous aide à trouver les enregistrements corrects dans les tables d'audit complètes (car nous savons où chercher dans une très grande table). Elle devrait aussi ajouter un créé par et modifié par des colonnes. Il est vraiment très utile de savoir qui a mis les données, surtout si vous n’avez pas l’audit complet.

Je ne peux penser à aucune application d'entreprise qui ne nécessite pas d'audit d'une forme ou d'une autre. Apparemment, votre patron pense qu'il n'a besoin que d'un audit relativement modéré. Personnellement, je suis favorable à un audit complet de chaque base de données contenant des données dont dépend votre entreprise (il est beaucoup plus facile de récupérer ces 2 000 mauvais enregistrements à partir de tables d'audit que de restaurer des sauvegardes) et l'exigerais si des informations financières étaient disponibles. ont vu ce genre de chose aider à attraper les fraudeurs. Tous les audits doivent être au niveau de la base de données.

Comment ces données peuvent-elles aider? Tout d’abord, il faut savoir quand chercher les anciennes données (dans une révision) et cela peut vous aider à voir quelle version de votre programme était active au moment où les données ont été entrées. Donc, si vous savez que vous avez corrigé ce problème dans la version 2.3, qui a été mise en ligne le 6 juillet 2011 et a ensuite rencontré le même problème avec un enregistrement inséré le 7 août, alors peut-être que votre solution n'était pas bonne. Si vous devez restaurer d'anciennes données, il vous indiquera la version des sauvegardes dans laquelle vous pourrez retrouver les anciennes données si vous ne disposez pas d'un audit complet.

Les développeurs semblent rarement penser que les données doivent être conservées au fil du temps et que les mauvaises données doivent être réparées par quelqu'un. Avoir de telles choses peut être très précieux pour ceux d’entre nous qui devons faire de telles choses. Votre patron a raison, même si je ne pense pas qu'elle soit allée assez loin dans l'audit. Il suffit d'un problème très grave, facile à résoudre, pour justifier le temps très court nécessaire à l'ajout de ces colonnes et de ces déclencheurs.

HLGEM
la source
Je préférerais que les personnes testent efficacement leurs solutions plutôt que d'essayer de les vérifier avec des vérifications de base de données, mais j'apprécie votre argument. Cependant, je ne suis pas sûr que l'argument que vous avancez s'applique à CHAQUE table dans toutes nos bases de données, même les tables de référence, etc.
Ed James
Les tests unitaires sont distincts de l'audit. Je mentionne que cela pourrait attraper un bogue parce que je l'ai vu se produire même lorsqu'il y avait des tests unitaires, car il y avait un cas d'extrémité non testé. Cela pourrait également indiquer que les données ont été entrées avant la correction du bogue, puis vous devrez peut-être rechercher d'autres données qui doivent également être corrigées. Ou tout simplement savoir que c’est les données saisies lors d’une importation du 6 juin 2016 qui vous aideraient à déterminer si le problème venait de ce que votre importation l’avait fait ou de l’anomalie des données du fichier d’importation. C'est beaucoup plus facile que de parcourir des années de fichiers d'importation quotidiens.
HLGEM
4

La charge de travail est inutile car elle peut être scriptée et appliquée à toutes les bases de données que vous créerez un jour. Ajoutez les colonnes à toutes les tables avec les déclencheurs. Vous devez juste vous rappeler de l'exécuter avec votre build.

En ce qui concerne les besoins du client, vous pouvez les faire payer pour les intégrer à votre application comme bon leur semble. Beaucoup aiment voir des informations supplémentaires sur un enregistrement, comme par exemple qui l'a créé / modifié et quand. Pas besoin d'envoyer un e-mail à tout le monde pour le savoir ou se faire mentir. Vous ne voulez pas avoir à interroger un journal chaque fois que quelqu'un consulte un enregistrement.

Le placer dans la base de données et le conserver juste au cas où ce ne serait pas si difficile et pourrait vous permettre de facturer des fonctionnalités supplémentaires utilisant les champs ou simplement de vous donner une idée de l’utilisation des systèmes par les clients.

JeffO
la source
Les clients n’ont pas exprimé d’opinion à ce sujet (à ma connaissance) et n’ont probablement aucune idée de notre nouvelle réglementation en matière de normes; le mot "peut vous permettre de facturer" est un argument raisonnablement bon, si je compte un peu sur "pourrait" pour mon approche habituelle du développement.
Ed James
1

Ce serait assez simple à mettre en œuvre (peut-être 1 à 3 jours au total), donc, à mon avis, quelle valeur cela va-t-il ajouter à votre application au cours de sa durée de vie.

Tout d'abord, une instruction alter table serait nécessaire pour ajouter les colonnes, la table alter étant identique (à l'exception du nom de la table), vous pouvez donc écrire un script pour générer dans le code la déclaration alter SQL pour toutes les tables nécessaires. . Il faut permettre aux valeurs NULL de prendre en compte les données existantes et de vérifier l’existence des colonnes afin qu’elles puissent être réexécutées.

Deuxièmement, pour les colonnes, l'utilisation de valeurs par défaut, telles que GetUTCDate () (SQL Server, Oracle peut être différent), résout tous les ajouts de code lors de l'insertion, de sorte que la base de code ne doit pas être modifiée pour les instructions insérées, car les valeurs par défaut seront utilisé.

Les mises à jour des données (modification de la dernière modification) pourraient être résolues avec un déclencheur de mise à jour. Encore une fois, ce déclencheur serait presque le même pour toutes les tables, de sorte que ce code de déclencheur (SQL) pourrait également être généré pour toutes les tables existantes.

Il y aurait potentiellement beaucoup de code de script SQL (en fonction du nombre de tables), mais comme il s'agit d'un modèle reproductible, vous pouvez le générer en consultant un schéma de base de données existant.

Jon Raynor
la source
Je crains qu'avec une approche big-band comme celle-ci, vous ayez des problèmes de maintenance à long terme avec de nouvelles tables, ou que (pire encore) vous deviez créer un sproc qui scanne chaque table pour certaines colonnes nommées puis génère le script DDL pour les ajouter s'il manque, ce qui ressemble à un cauchemar de maintenance!
Ed James
S'il s'agit d'une norme, nous espérons que le développeur qui crée les nouvelles tables respecte la norme. Sinon, oui, cauchemar. L'approche consiste à mettre à jour rapidement le schéma existant, après qu'il incombe au développeur de respecter la norme.
Jon Raynor
Je pense que le mot clé dans ce commentaire est "j'espère", je ne suis pas sûr de faire confiance à tout ce qui doit arriver de la propre volonté de chaque nouveau développeur!
Ed James
2
@Ed - D'accord, pas de confiance, c'est ce à quoi servent les revues de code! :)
Jon Raynor