2016-07-19 4 views
0

Ich habe eine Tabelle, die eine Person (Details) enthält. Zwei der Felder, wir müssen die Historie der Änderungen speichern und anzeigen. Sie sind 'IsActive BIT' und 'IsIdle BIT'.Eine Tabelle zu halten Geschichte der Änderungen für zwei Felder

Im Moment sind sie Felder in der Personen-Tabelle.

Die Anforderung besteht darin, dass angezeigt werden kann, wann die Person aktiv war und wann sie inaktiv war. Sowie, wer diese Werte gesetzt hat. (Alle Geschichten haben eine LastUpdatedBy und CreatedBy Spalte).

Mein Plan ist es, eine PersonHistory Tabelle zu verwenden, mit dem PersonID FK an der Person und die IsActive und IsIdle Spalten und die CreatedBy und LastUpdatedBy Spalten. Und ein 'EffectiveFrom' DATETIME.

Wenn wir also eine Person erstellen, fügen wir dem Verlauf mit den Werten IsActive und IsIdle, user und personID eine Zeile hinzu.

Um eine Person anzuzeigen, müssen wir eine (unordentliche?) Auswahl des Personendatensatzes vornehmen und dann mit dem letzten Datensatz für diese Person in der Verlaufstabelle verknüpfen. INNER JOIN .. SELECT TOP 1 * FROM Geschichte, mit einer ROW_NUMBER? Könnte langsam sein.

Wenn 'IsActive' bearbeitet wird, müssen wir eine neue Zeile mit der PersonID und dem neuen IsActive (und/oder IsIdle) Wert hinzufügen. Eigentlich müssen wir beides speichern. Eine Zeile wird nur geschrieben, wenn sich diese Werte ändern. Das bedeutet, dass wir einen Pre-save-Check durchführen müssen, um zu sehen, ob sich die Werte geändert haben.

Scheint dies ein Standardverfahren, um diese Anforderung zu erfüllen - oder gibt es einen besseren, häufigeren Ansatz?

+0

Sie können die Werte sowohl in der Tabelle "Person" als auch in der Tabelle "Verlauf" speichern und den Join nicht mehr benötigen. Möglicherweise möchten Sie auch in [Datenerfassung ändern] (https://msdn.microsoft.com/en-nz/library/cc645937.aspx) suchen. – Blorgbeard

Antwort

0

Sie könnten versuchen, diese Methode vor, die Datenstruktur zu ändern:

select p.*, ph.* 
from Person p outer apply 
    (select top 1 ph.* 
     from personhistory ph 
     where ph.personid = p.personid 
     order by ph.effectivefrom desc 
    ) ph; 

Für die Leistung, die Sie auf personhistory(personid, effetivefrom) einen Index mögen.

Verwandte Themen