Ist es sinnvoll, in allen DB-Tabellen ein Feld für das Erstellungsdatum und das Datum der letzten Aktualisierung zu standardisieren?


38

Meine Chefin versucht derzeit, einige Entwicklungsstandards auf unser Team anzuwenden. Deshalb hatten wir gestern ein Meeting, um die Standards zu besprechen, die größtenteils gut liefen, bis sie Folgendes ansprach:

  • Alle DB-Tabellen haben eine Spalte CreatedDate und LastUpdatedDate, die durch Trigger aktualisiert werden.

Zu diesem Zeitpunkt litt unser Team unter einer Meinungsverschiedenheit. Die Hälfte von uns ist der Meinung, dass dies an allen Tischen ein großer Arbeitsaufwand mit geringem Nutzen ist (wir arbeiten an Projekten mit festem Budget, sodass die Kosten aus den Gewinnen unseres Unternehmens entstehen). Die zweite Hälfte ist davon überzeugt, dass dies bei der Unterstützung der Projekte hilfreich sein wird.

Ich bin fest im ehemaligen Lager. Obwohl ich zu schätzen weiß, dass einige externe Fälle dazu führen würden, dass die zusätzlichen Spalten die Unterstützbarkeit verbessern, würde meiner Meinung nach der Arbeitsaufwand, der erforderlich wäre, um die Spalten an erster Stelle hinzuzufügen, sowie die Wartung dazu führen, dass wir weniger Zeit für mehr aufwenden wichtige Dinge wie Unit- oder Load-Testing. Ich bin mir auch ziemlich sicher, dass diese zusätzlichen Spalten die Verwendung von ORM umständlicher machen würden - wenn man bedenkt, dass wir hauptsächlich C # und Oracle verwenden, was anfangs nicht sehr ORM-freundlich ist.

Meine Frage ist also zweifach:

  • Bin ich im richtigen Lager? Ich behaupte nicht, über weltbekannte Datenbankkenntnisse zu verfügen, daher könnte dies eine einfache Ergänzung ohne nachteilige Nebenwirkungen sein.
  • Wie würden Sie mit einer Situation umgehen, in der sich ein Meeting über Standards in ein Schlackenmatch verwandelt? Wie kann ich wirklich verkaufen, dass uns dieser Standard langfristig nicht weiterhilft?

Warum ist C # nicht ORM-glücklich? Das Hinzufügen der Eigenschaften [insert = "false" update = "false" generated = "always"] zu der Zuordnung dieser beiden Spalten in NHibernate zum Beispiel scheint mir auch nicht so umständlich zu sein, oder vermisse ich etwas?
Jalayn

C # + Oracle ist nicht ORM-freundlich, und wir stellten fest, dass NHibernate zu schwergewichtig war (anscheinend war ich nicht an diesen Werkzeuguntersuchungen beteiligt). Wahrscheinlich habe ich C # und Oracle in der Hauptfrage rückwärts gestellt.
Ed James

Sie sollten in Erwägung ziehen, den Titel Ihrer Frage umzubenennen, um den Datenbankstandards besser gerecht zu werden.
maple_shaft

Wie würde dies etwas Zeit kosten? Sie müssen es mindestens zweimal für die "äußeren Fälle" tun. Erstellen Sie ein Tool und einige wiederverwendbare Klassen und sorgen Sie sich nie wieder darum.
Steven Evers

Antworten:


27

Dies ist eine ziemlich verbreitete Praxis, obwohl ich nicht sagen würde, dass Supportfähigkeit der Hauptvorteil ist. Der eigentliche Vorteil dieses Ansatzes besteht darin, dass ein Prüfpfad geführt wird. Es ist auch üblich, eine zusätzliche Spalte mit dem Benutzernamen des Benutzers zu haben, der das letzte Update durchgeführt hat.

Wenn Sie mit finanziellen oder sensiblen Daten zu tun haben, haben Sie sicher schon von Dingen wie PCI- und SOX- Konformität gehört. Um diese Spezifikationen zu erfüllen, ist ein umfassender Audit-Trail unerlässlich.

Haftungsausschluss: Es gibt jedoch viel bessere Möglichkeiten, einen Datenbank-Audit-Trail zu erstellen> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails


Es tut uns leid, ich habe vergessen zu erwähnen, dass die PCI-Konformität (usw.) nicht zutreffend ist. In den Protokollen ist bereits ein Prozess-Audit-Trail vorhanden (ALLES wird gründlich protokolliert).
Ed James

6
"(ALLES ist ziemlich gründlich protokolliert)" beinhaltet das CreatedDate und LastUpdatedDate? Wenn ja, könnten Sie vielleicht Ihre Kollegen auf das DRY-Prinzip
hinweisen

2
Das ist ein sehr guter Punkt. Vielleicht sollte ich auf einen effizienteren Log-Parser drängen, mit dem wir die archivierten Daten einfach abfragen können (offensichtlich dienen die Daten Audit-Trail-Zwecken, sodass wir nicht mehr als eine Woche oder so zur Verfügung stehen Abfrage, der Rest ist eingelagert).
Ed James

3
Ich glaube nicht, dass dieser Ansatz zu einem umfangreichen Audit-Trail führen wird. Ich würde ihn nicht einmal als Audit-Trail bezeichnen .
Jordão

@ Jordão Ich sagte, es sei ein allgemeiner Ansatz, ich habe nicht gesagt, es sei ein guter! Daher der Disclaimer :)
MattDavey

17

Das vorherige Argument ist ungültig, da das Hinzufügen einiger von der Datenbank gepflegter Zeitstempelfelder zu einer Reihe von Tabellen keine schwierige Arbeit ist. Dies ist in der Tat die Art von betäubender Aufgabe, die man einem Junior oder einem Praktikanten geben würde, und sie könnte es leicht in einem einzigen zweiwöchigen Sprint mit Zeitverschwendung tun.

Möglicherweise müssen diese Felder in Ihrem ORM nicht zugeordnet werden, nur weil Sie nicht möchten, dass Anwendungsbenutzer diese Felder ändern, und weil sie für die Wartung und das Debuggen nützlich sind und in der Geschäftslogik nur selten Verwendung finden. Ich habe in Läden gearbeitet, die es in beide Richtungen taten, und ich habe ehrlich gesagt keine große Meinung dazu.

Die Vorteile, auch wenn sie noch immer übertrieben sind, überwiegen die menschlichen Kosten bei der Implementierung solcher Funktionen auf Datenbankebene und sind sicherlich geringer als die kollektive Intelligenz der großen technischen Köpfe des Projekts, die das Meeting entführen und in einem epischen Kampf gegen die Brust ausfechten. Wenn Sie die Auswirkungen abschätzen, die ein paar einstündige Besprechungen auf die Lebensdauer eines Projekts haben, werden Sie wahrscheinlich nicht überrascht sein, dass sie teuer sind. Stellen Sie sich die kollektiven Stundenlöhne und Vorteile aller dieser Personen zusammen vor, und das sollte Ihnen eine Idee geben.


8
Erstellen Sie ein Skript, das diese Spalten zu jeder Tabelle hinzufügt, sofern sie nicht bereits zusammen mit den Triggern vorhanden sind.
JeffO

3
+1 Sie können die Skripte in wenigen Tagen einfach per Code generieren. Nur viel Arbeit, wenn es manuell erledigt wird.
Jon Raynor

8

... je definitiver ein Mann aussagt, desto wahrscheinlicher ist es, dass er definitiv falsch liegt ... - tyler durden

Dies gilt für allgemeine "Standards", während dies an einigen Tischen ein großer Gewinn sein könnte. An jedem Tisch wäre es höchstwahrscheinlich nutzloses Rauschen und mehr Code, den man pflegen oder vergessen sollte, zu pflegen.

Hier ist ein Gleichgewicht zu finden, das sollten Sie den Entscheidungsträgern aufzwingen.


8

Ich stimme voll und ganz zu. Fast jede Tabelle in jeder Datenbank sollte mindestens 2 Felder enthalten: das Erstellungsdatum und das Aktualisierungsdatum . Es gibt viele Gründe, warum Sie ein Erstellungsdatum und ein Aktualisierungsdatum angeben sollten. Aus offensichtlichen Gründen, die von früheren Leuten angegeben wurden ... das ist Audit.

Ich entwerfe seit 25 Jahren Systeme und Datenbanken und habe für Hunderte von Kunden gearbeitet. Es gibt keinen einzigen Client, der dies NICHT benötigt hätte.

Es gibt zwei grundlegende Möglichkeiten, dies zu tun:

1 - Die erste Übung besteht darin, die Datenbank die Arbeit erledigen zu lassen und sie direkt in das Tabellendesign einzufügen. Welches ist das absolute Minimum, würde ich empfehlen.

2 - Die andere Praxis, die ich bevorzuge, ist die Verwendung eines Replikationswerkzeugs, um dies zu handhaben. Es gibt wenig Overhead und keine Kosten für DEV-Teams. Die Werkzeuge sind jedoch teuer. Ein zusätzlicher Vorteil ist, dass der Löschvorgang mit dieser Art von Tool viel einfacher überwacht werden kann. Ohne ein Replikationstool müssten Sie eine Prüftabelle erstellen und Auslöser für Löschvorgänge auslösen - meiner Meinung nach keine gute Vorgehensweise.

Ein weiterer Vorteil dieser Felder ist das Data Warehouse und das ODS, die IMMER für jedes OLTP-System erstellt wurden. Sie können inkrementelle Daten ohne sie nicht effektiv abrufen. Andernfalls besteht die Gefahr, dass Sie jeden Tag die gesamte DB neu laden müssen.

Es gibt eine enorme Anzahl anderer geschäftlicher Gründe für die Eingabe dieser beiden Daten, auf die ich hier nicht näher eingehen werde. Machen Sie Ihre Hausaufgaben und ich bin sicher, dass Sie 3-6-12-48 Monate später sehr froh sein werden, dass Sie diese 2 einfachen Felder ausgefüllt haben.

Ich habe beide Lösungen implementiert und empfehle sie in der Regel, wo dies möglich ist.


5

Wir haben das Erstellungsdatum und die Spalten in unserer Datenbank erstellt und sie haben uns enorm dabei geholfen, Datenprobleme aufzuspüren. Wenn wir zurücksetzen müssen, hilft es uns, die richtigen Datensätze in den vollständigen Prüftabellen zu finden (da wir wissen, wo wir in einer sehr großen Tabelle suchen müssen). Sie sollte auch eine von erstellte und von geänderte Spalte hinzufügen. Es ist wirklich sehr hilfreich zu wissen, wer die Daten eingibt, insbesondere wenn Sie nicht über eine vollständige Überwachung verfügen.

Ich kann mir keine Enterprise-Anwendung vorstellen, die keine Prüfung in irgendeiner Form benötigt. Anscheinend glaubt Ihr Chef, dass es nur relativ milde Audits braucht. Persönlich bevorzuge ich die vollständige Prüfung jeder Datenbank, die Daten enthält, von denen Ihr Unternehmen abhängig ist (es ist viel einfacher, diese 2000 fehlerhaften Datensätze aus Prüftabellen wiederherzustellen, als Sicherungen wiederherzustellen), und würde es erfordern, wenn es überhaupt finanzielle Informationen gibt, wie ich Ich habe gesehen, wie solche Dinge dazu beitragen, Betrüger aufzufangen. Alle Prüfungen müssen auf Datenbankebene erfolgen.

Wie können diese Daten helfen? Zunächst wird eingegrenzt, wann nach den alten Daten gesucht werden soll (in einer Revision), und es wird angezeigt, welche Version Ihres Programms zum Zeitpunkt der Dateneingabe aktiv war. Wenn Sie also wissen, dass Sie dieses Problem in Version 2.3 behoben haben, die am 6. Juli 2011 online ging, und dann dasselbe Problem mit einem Datensatz festgestellt haben, der am 7. August eingefügt wurde, war Ihr Fix möglicherweise nicht gut. Wenn Sie auf alte Daten zurückgreifen müssen, werden Sie darüber informiert, in welcher Version der Sicherungen Sie die alten Daten finden können, wenn Sie nicht über eine vollständige Überwachung verfügen.

Entwickler scheinen selten zu glauben, dass Daten über einen längeren Zeitraum hinweg gepflegt werden müssen und dass fehlerhafte Daten von jemandem behoben werden müssen. Solche Dinge zu haben, kann für diejenigen von uns, die solche Dinge tun müssen, sehr wertvoll sein. Ihr Chef hat Recht, obwohl ich glaube, dass sie beim Auditing nicht weit genug gegangen ist. Es ist nur ein wirklich schwerwiegendes Problem erforderlich, das einfach zu beheben ist, um den sehr geringen Zeitaufwand für das Hinzufügen dieser Spalten und Trigger zu rechtfertigen.


Ich würde es vorziehen, Leute effektiv beim Unit-Testen ihrer Korrekturen zu sehen, als zu versuchen, sie mit DB-Überprüfungen zu überprüfen, aber ich weiß Ihren Punkt zu schätzen. Ich bin mir jedoch nicht sicher, ob der von Ihnen angesprochene Punkt auf JEDE Tabelle in all unseren Datenbanken zutrifft, auch auf die Referenztabellen usw.
Ed James,

Unit-Tests sind von Audits getrennt. Ich erwähne, dass es einen Fehler geben könnte, weil ich gesehen habe, dass dies auch dann passiert, wenn Unit-Tests stattfanden, weil es einen ungetesteten Edge-Fall gab. Möglicherweise wird auch darauf hingewiesen, dass die Daten vor der Fehlerbehebung eingegeben wurden, und dann müssen Sie möglicherweise nach anderen Daten suchen, die ebenfalls behoben werden müssen. Oder wissen Sie einfach, dass es sich um die Daten handelte, die am 6. Juni 2016 durch einen Import eingegeben wurden, um herauszufinden, ob das Problem durch den Import verursacht wurde oder ob die Daten in der Importdatei fehlerhaft waren. Das ist viel einfacher als das Durchsuchen jahrelanger täglicher Importdateien.
HLGEM

4

Die Arbeitsbelastung ist umstritten, da diese für jede Datenbank, die Sie jemals erstellen, per Skript erstellt und angewendet werden kann. Fügen Sie die Spalten zusammen mit den Triggern allen Tabellen hinzu. Sie müssen nur daran denken, es mit Ihrem Build auszuführen.

Sie können sich vom Kunden bezahlen lassen, damit er sie nach Belieben in Ihre App einbindet. Viele möchten zusätzliche Informationen zu einem Datensatz sehen, z. B. wer ihn zuletzt erstellt / geändert hat und wann. Sie müssen nicht jedem eine E-Mail senden, um dies herauszufinden oder angelogen zu werden. Sie möchten nicht jedes Mal ein Protokoll abfragen müssen, wenn sich jemand einen Datensatz ansieht.

Es in die Datenbank zu stellen und für alle Fälle dort zu haben, ist nicht so schwierig und ermöglicht es Ihnen möglicherweise, zusätzliche Funktionen in Rechnung zu stellen, die die Felder nutzen, oder Ihnen nur ein Feedback zu geben, wie viele Clients das System verwenden.


Die Kunden haben (soweit mir bekannt) keine Meinung zu diesem Thema geäußert und haben wahrscheinlich keine Ahnung von unseren neuen Standards, daher würde ich sehr erwarten, dass sie nicht daran interessiert sind, für eine Integration zu zahlen;) Die Sache "Kannst du dir erlauben, etwas zu berechnen" ist ein einigermaßen gutes Argument, wenn ich mich für meine übliche Herangehensweise an die Entwicklung ein wenig auf "Macht" verlasse.
Ed James

1

Die Implementierung wäre ziemlich trivial (vielleicht 1 bis 3 Tage insgesamt). Meiner Meinung nach ist es also so, wie viel Wert es für Ihre Anwendung im Laufe ihrer Lebensdauer bringt.

Zunächst wäre eine Anweisung alter table erforderlich, um die Spalten hinzuzufügen. Die Anweisung alter table wäre alle gleich (mit Ausnahme des Tabellennamens). Sie könnten also ein Skript schreiben, um die Anweisung alter SQL für alle Tabellen zu generieren, für die dies erforderlich ist . Sie müssen NULL-Werte zulassen, um vorhandene Daten zu berücksichtigen, und prüfen, ob die Spalten vorhanden sind, damit sie erneut ausgeführt werden können.

Zweitens werden für die Spalten mit Standardwerten wie GetUTCDate () (SQL Server, Oracle, möglicherweise anders) Codierungszusätze beim Einfügen behoben, sodass die Codebasis für keine der Einfügeanweisungen geändert werden muss, da Standardwerte verwendet werden gebraucht.

Die Aktualisierungen von Daten (Änderung in zuletzt geändert) könnten mit einem Aktualisierungstrigger behoben werden. Auch dieser Trigger wäre für alle Tabellen nahezu identisch, sodass dieser Triggercode (SQL) auch für alle vorhandenen Tabellen generiert werden könnte.

Möglicherweise gibt es viel SQL-Skriptcode (abhängig von der Anzahl der Tabellen), aber es handelt sich um ein wiederholbares Muster, sodass Sie den Code anhand eines vorhandenen DB-Schemas generieren können.


Ich würde mir Sorgen machen, dass bei einem Big-Band-Ansatz wie diesem langfristige Wartungsprobleme mit neuen Tabellen auftreten oder (noch schlimmer) ein Sproc erstellt werden muss, der jede Tabelle nach bestimmten benannten Spalten durchsucht und diese dann generiert das DDL-Skript, um sie hinzuzufügen, wenn sie fehlen, was wie ein Wartungs-Albtraum klingt!
Ed James

Wenn dies ein Standard ist, folgt der Entwickler, der die neuen Tabellen erstellt, hoffentlich dem Standard. Ansonsten ja, Alptraum. Der Ansatz besteht darin, das vorhandene Schema auf den neuesten Stand zu bringen, vorausgesetzt, der Entwickler ist verpflichtet, dem Standard zu folgen.
Jon Raynor

Ich denke, das Schlüsselwort in diesem Kommentar ist "hoffentlich", ich bin mir nicht sicher, ob ich irgendetwas traue, das auf eigenen Wunsch eines jeden neuen Entwicklers passieren muss!
Ed James

2
@Ed - Einverstanden, kein Vertrauen, dafür sind Code-Reviews da! :)
Jon Raynor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.