web-dev-qa-db-ja.com

ディメンション階層のレベル間の履歴変更をキャプチャする最良の方法

ディメンション階層のレベル間の変更をキャプチャする最もクリーンな方法は何ですか?

[Area]> [Region]> [Location]というディメンション階層があります。AreaはRegionの親で、RegionはLocationの親です。場所は階層の最下位レベルであり、ファクトテーブルに関連付けられています。

ビジネスルールは次のとおりです。ロケーションは、ビジネスニーズに基づいて、割り当てられているリージョンを変更できます。さらに、リージョンは割り当てられているエリアを変更できます。

これらの変更をキャプチャして、履歴分析を行うときに、ロケーションがそのリージョンを変更する前後と、リージョンがそのエリアを変更する前後にビジネス指標を比較できるようにします。

これを行う最良の方法は何ですか?

私が思いついた4つの方法には、大きな欠点があるようです。

  1. 階層レベル間でブリッジテーブルを使用するには、時間の境界(有効な開始日/終了日)を使用して、階層を上るときに子が属する親を正しく識別する必要があります。これにより、特に多くのレベルを持つ階層では、クエリがエラーを起こしやすくなります。
  2. 親との関係が変更されるたびに子レコードをバージョン管理し(たとえば、領域Aから領域Bに移動するときにリージョンAをバージョン管理する)、階層をずっと下に向かって変更をカスケードします(たとえば、地域Aに関連付けられた場所の新しいバージョンを作成する)新しいリージョンに関連付けられるようにしますA)。
  3. 子レコードの親レコードへの参照を更新し、時間範囲を使用して正しい履歴を再構成します(エラーが発生しやすい)。
  4. 階層をクエリするときは常に時間の境界を使用して、分析されるファクトの瞬間にロケーションAが正しいリージョンに関連付けられるようにします(同様に、リージョンAが正しいエリアに関連付けられる)。

これらのどれも私にはきれいに見えません。

もっと良い方法はありますか?

どうもありがとう

2
seadragon

ブリッジテーブルの最初のオプションを強くお勧めします。うまくいく3つのテーブルすべての履歴上の変更を確実にキャプチャすると、JOINが問題になることに同意します。 (JOIN句で)DateInsertedとValidTillがファクトテーブルにあるものと一致することを確認してください。 こちらのブリッジテーブルの詳細-キンボール大学

代わりに:ファクトテーブルでは、3つの次元すべて(領域、地域、場所)への参照を保持します。とにかくファクトテーブルに日付を設定する必要があるため、変更を簡単にマッピングできます。また、先ほど述べたように、場所は1つのトランザクションではA、別のトランザクションではBになる可能性があるため、この方法でグループ化した方がよいでしょう。 BYと傾向と変化を見る。欠点は、ファクトテーブルが太くなることです。

SSASを使用している(またはデータモデリングに使用するつもりである)場合は、エンドユーザーに実装する方法を説明する非常に良い 多対多革命 をお勧めします。

1
Hila DG

3つのテーブルの履歴変更をキャプチャする場合は、変更階層テーブル(つまり、[Area][Region])をディメンションテーブルのサブディメンションに変換します(つまり、[Location]effective_dateおよびexpire_date(3つのテーブルで)緩やかに変化するディメンション(SCD)の手法を使用して、履歴データをレポートするためにディメンションとサブディメンションの属性の変化を追跡できます。

1
Yassine LAADIDI