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?
Antworten:
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
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle