バージョン管理とデータ履歴

データベースを開発する場合、多くの場合、オブジェクトのバージョン管理と履歴の保存をサポートする必要があります。 たとえば、従業員が職位を変更し、職位が給与を変更する場合があります-多次元モデリングでは、これは緩やかに変化するディメンション(以下、SCD)と呼ばれます-ほとんど変化しないディメンション、つまり非キー属性が時間とともに変化する傾向があるディメンション 合計で、 SCDには6つの基本タイプ(メソッド)があり、これらは変更履歴をモデルに反映する方法を決定します。



タイプ0


これは、テーブルで最初にヒットした後のデータがそれ以上変更されないという事実にあります。 この方法は、実際には誰も使用していません。 バージョニングはサポートしていません。 SCD方法論のゼロ基準点としてのみ必要です。

タイプ1


タイプ1は、古いデータを新しいデータに書き換える通常の方法です。 純粋な形式では、このメソッドはバージョン管理も含まず、ストーリーが実際に必要でない場合にのみ使用されます。 ただし、このタイプの一部のDBMSでは、DBMS自体(Oracleのフラッシュバッククエリなど)を使用するか、トリガーを介して変更を追跡することで、制限付きのバージョン管理サポートを追加できます。

利点:

短所:


タイプ2


この方法では、バージョンごとに、このバージョンのキー属性フィールドが追加されたテーブルに個別のレコードを作成します。たとえば、バージョン番号、変更日、バージョンの存在期間の開始日と終了日です。

例:
IDNAMEPOSITION_IDDEPTDATE_STARTDATE_END
1コリャ21208/11/2010 10:42:259999年1月1日
2デニス23308/11/2010 10:42:259999年1月1日
3ボリス26208/11/2010 10:42:259999年1月1日
4シェルドン22308/11/2010 10:42:259999年1月1日
5ペニー25208/11/2010 10:42:259999年1月1日


この例では、デフォルトのバージョン日付は'01 .01.9999 'であり、その代わりに、たとえばnullを指定することは可能ですが、ID、DATE_STARTおよびDATE_ENDから主キーを作成することに問題があり、さらに、特定の日付の選択条件が簡素化されます(「 where snapshot_date>DATE_START and (snapshot_date < DATE_END or DATE_END is null) 」の代わりに「 where snapshot_date>DATE_START and (snapshot_date < DATE_END or DATE_END is null) where snapshot_date between DATE_START and DATE_END 」」。
この実装では、従業員を解雇するときに、従業員のレコードを削除する代わりに、現在のバージョンの終了日を解雇の日付に変更するだけで済みます。

利点:

短所:


タイプ3


レコード自体には、以前の属性値の追加フィールドが含まれています。 新しいデータを受信すると、古いデータは現在の値で上書きされます。

IDUPDATE_TIMELAST_STATECURRENT_STATE
1108/11/2010 12:58:4801
2208/11/2010 12:29:1611
利点:

短所:


タイプ4


変更の履歴は別のテーブルに含まれます。メインテーブルは常に、現在のデータで上書きされ、古いデータが別のテーブルに転送されます。 通常、このタイプは変更の監査またはアーカイブテーブルの作成に使用されます(Oracleで、フラッシュバックアーカイブを使用して1番目から同じ4番目のタイプを取得できます)。 私のように、このオプションのサブタイプまたはハイブリッド(2番目のタイプ)は、許容される行の移動を伴う現在のバージョンに基づいてパーティション化することを検討する必要がありますが、これはすでにモデリングの範囲を超えており、おそらく管理に関連しています。

例:
 select * from emp 

IDNAMEPOSITION_IDDEPT
1コリャ212
2デニス233
3ボリス262
4シェルドン223
5ペニー252


 select * from emp_history 

IDNAMEPOSITION_IDDEPTDATE
1コリャ21111/11/2010 14:12:13
2デニス23211/11/2010 14:12:13
3ボリス26111/11/2010 14:12:13
4シェルドン22211/11/2010 14:12:13

利点:

短所:


ハイブリッドタイプ/タイプ6(1 + 2 + 3)


タイプ6は、上記の方法の組み合わせとしてRalph Kimballによって発明されたもので、考慮していない状況やデータを扱う便利さのために設計されています。 それは追加の冗長性を導入することから成ります:タイプ2が基礎として採用され、代替属性が代替バージョンの概要(タイプ3)に追加され、1つまたはすべての以前のバージョン(タイプ1)が上書きされます。
例:
バージョンIDNAMEPOSITION_IDDEPTDATE_STARTDATE_END現在の
11コリャ21208/11/2010 10:42:259999年1月1日1
12デニス23308/11/2010 10:42:259999年1月1日1
13ボリス26208/11/2010 10:42:2508/11/2010 11:42:250
23ボリス26208/11/2010 11:42:269999年1月1日1


この例では、たとえば、サロゲートキーを追加すると、ファクトテーブルからディメンションの特定のバージョンを参照する機能が追加されます。これは、ファクト自体の時間に属さない場合があります。レコード自体を変更せずにバージョンが古くなる可能性があるため)。 ただし、現在のバージョンのインジケーターは、テーブルで必要な場合(DBMSがそのようなフィールドをサポートしている場合、バージョン11でOracleに表示された場合)、正規化を損なうことなく仮想の計算可能なフィールドとして、またこのテーブルからのビューのフィールドとして作成できます
一般に、SCDの主要なタイプの組み合わせはハイブリッドタイプを指すため、欠点と利点は特定の実装に依存しますが、1つ確かなことはあります-ハイブリッドタイプの選択は、モデルの複雑さによってのみ決定でき、ほとんどの場合(私はしませんそれ以外の場合)、主な4つのタイプで実行できます。

SCDの実装に関するヒントをいくつか追加します。


PS。 Habralyudi、あなたが出会った興味深いハイブリッド実装を教えてください。

Source: https://habr.com/ru/post/J101544/


All Articles