2016-07-19 5 views
0

私は人(詳細)を保持するテーブルを持っています。 2つのフィールドのうち、変更の履歴を保存して表示するという要件があります。彼らは 'IsActive BIT'と 'IsIdle BIT'です。テーブルを保持する2つのフィールドの変更履歴

現時点では、これらはPersonテーブル内のフィールドです。

この要件は、その人物がいつアクティブであったか、そしてそれらがアイドルだったときを表示できるようにすることです。これらの値を設定した人だけでなく、 (すべての物語にはLastUpdatedByとCreatedByの列があります)。

私の計画はPerson FKをPersonに、IsActiveとIsIdleの列、CreatedByとLastUpdatedByの列にPersonH​​istoryテーブルを使用することです。そして、 'EffectiveFrom' DATETIME。

人を作成するときに、IsActive値とIsIdle値、ユーザーおよびPersonIDを使用して履歴に行を追加します。

人物を表示するには、人物レコードの(非決定性)選択を行い、履歴テーブルのその人物の最後のレコードに参加する必要があります。 INNER JOIN .. ROW_NUMBERを使用して履歴からSELECT TOP 1 *を選択しますか?遅くなるかもしれません。

「IsActive」を編集するときは、PersonIDと新しいIsActive(および/またはIsIdle)値を含む新しい行を追加する必要があります。実際には、両方を保存する必要があります。これらの値が変更されると、行にのみ書き込まれます。つまり、値が変更されたかどうかを確認するために保存前チェックを行う必要があります。

これは、この要件を処理するための標準的な方法と思われますか?それとももっと一般的なアプローチですか?

+0

PersonテーブルおよびHistoryテーブルの値を保存して、結合の必要性を排除できます。 [Change Data Capture](https://msdn.microsoft.com/en-nz/library/cc645937.aspx)を調べることもできます。 – Blorgbeard

答えて

0

あなたは、データ構造を変更する前に、この方法を試してみてください:パフォーマンスを得るために、あなたはpersonhistory(personid, effetivefrom)にインデックスをしたい

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; 

関連する問題