Ich entwerfe diese Datenbank, die eine Geschichte des Angestelltengehalts und der Bewegungen innerhalb der Organisation beibehalten muss. Grundsätzlich hat mein Entwurf 3 Tabellen (ich meine, dort mehr Tische, aber für diese Frage werde ich 3 erwähnen, so ertragen Sie mit mir). Mitarbeitertabelle (enthält das aktuellste Gehalt, Positionsdaten usw.), SalaryHistory-Tabelle (Gehalt, Datum, Grund usw.) und MovementHistory (Titel, Abt., Kommentare). Ich werde Linq zu Sql verwenden, also habe ich gedacht, dass jedes Mal, wenn Mitarbeiterdaten aktualisiert werden, die alten Werte in ihre jeweiligen Verlaufstabellen kopiert werden. Ist das ein guter Ansatz? Soll ich es einfach mit Linq zu SQL oder Triggern tun? Danke für jede Hilfe, Anregung oder Idee.pflegen Sie Geschichte in einer Datenbank
Antwort
Werfen Sie einen Blick auf http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture.
Grundsätzlich schlägt der Artikel, dass Sie die folgenden Spalten in den Tabellen, die Sie brauchen Geschichte zu verfolgen, für -
* DateCreated – the actual date on which the given row was inserted.
* DateEffective – the date on which the given row became effective.
* DateEnd – the date on which the given row ceased to be effective.
* DateReplaced – the date on which the given row was replaced by another row.
* OperatorCode – the unique identifier of the person (or system) that created the row.
DateEffective und DateEnd zusammen sagen, die Zeit, für die die Zeile gültig war (oder die Zeit für die ein Mitarbeiter in einer Abteilung war oder die Zeit, für die er ein bestimmtes Gehalt verdient hat).
Es ist eine gute Idee, diese Logik intern in der Datenbank zu behalten: das ist im Grunde, warum Trigger existieren. Ich sage dies jedoch sorgfältig, da es viele Gründe gibt, es extern zu halten. Oft ist es - insbesondere bei einer so einfachen Technologie wie LINQ-to-SQL - einfacher, den Code extern zu schreiben. Meiner Erfahrung nach könnten mehr Menschen diese Logik in C#/LINQ schreiben, als dies mit einem Trigger möglich wäre.
Auslöser sind schnell - sie sind kompiliert! Sie sind jedoch sehr leicht zu missbrauchen und machen Ihre Logik zu sehr komplex, so dass sich die Leistung schnell verschlechtern kann. Wenn Sie bedenken, wie einfach Ihr Anwendungsfall ist, würde ich verwenden, Trigger zu verwenden, aber das bin ich persönlich.
Danke für Ihre Erkenntnisse :) – jasonco
Ich denke, das ist der Ansatz, den ich verwenden werde. Ich habe nicht viel Erfahrung mit Triggern. Ich meine, ich lerne immer noch linq to sql, aber ich fühle mich viel wohler. – jasonco
Ich stimme nicht mit der "gute Idee" Kommentar, aber nicht in der Art, wie Sie denken. Diese Regeln sollten * immer * in der Datenbank enthalten sein, um sicherzustellen, dass die Datenbankclients ihnen folgen. Die DB sollte eine Einheit für sich sein, die ihre Datenintegrität schützt und sich nicht auf externe Parteien verlässt. +1 sowieso. – paxdiablo
Auslöser sind wahrscheinlich schneller und benötigen keinen "mittleren Mann", um die Aufgabe zu erledigen, wodurch mindestens eine Fehlermöglichkeit ausgeschlossen wird.
Je nach Datenbank Ihrer Wahl können Sie einfach eine Tabelle verwenden und OIDs darauf aktivieren und zwei weitere Spalten hinzufügen, "Flag" und "Previous". Niemals diese Tabelle aktualisieren, nur einfügen. Fügen Sie einen Trigger hinzu, so dass beim Hinzufügen einer Zeile für Mitarbeiter-Nr. Alle Datensätze mit Mitarbeiter-ID auf "alt" gesetzt werden und der vorherige Wert der neuen Zeilen auf die vorherige Zeile gesetzt wird.
Danke für Ihren Kommentar! – jasonco
Auslöser erleichtern die Migration Ihres Front-Ends auf etwas anderes und sie halten die Datenbank konsistent, unabhängig davon, wie Daten eingefügt/aktualisiert/entfernt werden.
Außerdem würde ich die Gehälter direkt in die Gehaltshistorie schreiben - von Ihrer Beschreibung würde ich keinen Grund sehen, warum Sie den Weg über einen Update-Trigger auf den Mitarbeitertisch gehen sollten.
So hatte ich es zuerst, aber ich entschied mich, die Geschichtstabelle nur für die Geschichte zu verwenden, nichts Aktuelles. Ich meine, ich bin mir sicher, dass es eine ganze Reihe von Möglichkeiten gibt. Ich bin nur auf der Suche nach der richtigen Lösung und es gibt keine richtige Lösung! hehe danke für deinen Kommentar. – jasonco
Ich denke, das gehört aus zwei Gründen in die Datenbank.
Erste, mittlere Stufen kommen und gehen, aber Datenbanken sind für immer. Dieses Jahr Java EJBs, nächstes Jahr .NET, das Jahr danach etwas anderes. Die Daten bleiben meiner Erfahrung nach erhalten.
Zweitens, wenn die Datenbank überhaupt freigegeben ist, sollte sie nicht auf jede Anwendung angewiesen sein, die sie verwendet, um zu wissen, wie sie ihre Datenintegrität erhält. Ich würde dies als ein Beispiel für die Kapselung der Datenbank betrachten. Warum das Wissen und die Pflege der Geschichte bei jedem Kunden erzwingen?
Danke, das werde ich mir auch überlegen. – jasonco
Interessanter Link - gut lesen, danke! – ChristopheD
Cool, ich hatte schon ein ähnliches Geplatter in Bezug auf die Daten. Danke für deinen Beitrag, sehr nützlich! – jasonco