web-dev-qa-db-ja.com

データマートで時変の属性を処理する

私はサイトのリスト全体を調べましたが、これが最適だと思います。これは実際にはデータベース管理に関するものではなく、データベース設計のようなものです。すみません、正しいサイトを教えてください。

初歩的なBIシステム用のデータベースを設計しています。この瞬間、私は壁にぶつかりました。これは(ダミーデータを使用して説明しています):

私のファクトテーブルに次の情報が含まれているとします。

John Doe flew from LAX to ATL on 1 Nov in flight AB-123

寸法とその属性は次のとおりです。

  • チラシ-名前、クラブ
  • 空港-都市、コード
  • 日付-年、月、日付
  • フライト-コード、標準、遅延、価格

これで、次のようなレポートを簡単に生成できます。

Airport --> LAX  DFW  ORD  ATL Total
Gold         50   40   10   25   125
Silver      240  300   95  140   775
Bronze     1000 1500  800 1800  5100
Total      1290 1840  905 1965  6000

次のようなクエリを使用する:

select fd.club, ad.code, count(f1.id) from flyer fd, airport ad, fact1 f1
where fd.id = f1.fid and ad.id = f1.aid and month(f1.date) = 10
group by f1.club, ad.code;

しかし、私の問題は、チラシの「クラブ」ステータスが動くターゲットであるという事実から来ています。今日ゴールドになっているチラシは10月にシルバーになっている可能性があるので、ここでは間違ったグループに数えています。したがって、次のような別のファクトテーブルが必要だと思います。

 John Doe entered Bronze club on 8/15
 John Doe entered Silver club on 10/20
 ...

「クラブ」は、元のチラシの寸法の属性として削除されます。代わりに、新しいクラブの側面が現れます。

次に、必要なレポートを生成するために、これら2つのファクトテーブルを結合します。

私は正しい方向に進んでいますか?または、これに対する代替のより簡単な解決策はありますか?私が考えることができる1つの代替案は、元のファクトテーブルにクラブを含め、ETLプロセス中にそれを処理することです。したがって、事実は次のようになります。

John Doe of Silver Club flew from LAX to ATL on 1 Nov in flight AB-123

どちらのアプローチが良いか、または3番目のアプローチがあるかどうかを教えてください。

3
ObiObi

これを行う方法は、キンボールが タイプ2またはタイプ6のゆっくりと変化する次元と呼んだものです。 。基本的に、タイプ2 SCDには、合成ディメンションキーと、基になるエンティティ(この場合はチラシ)の自然キーと「有効開始日」で構成される一意のキーがあります。合成キーはファクトテーブルに対して結合されるため、単純な等結合でアタッチできます(つまり、クエリで日付範囲でフィルタリングする必要はありません)。

すべての属性(この場合はクラブなど)はチラシの属性です。これらの属性の1つが変更されると、変更日から有効な新しい状態を記録する新しい行がディメンションに作成されます。

タイプ6は通常のタイプ2に似ていますが、現在のバージョンの行に自己結合します。特定の自然キーに対して新しい行が作成されるたびに、その自然キーのすべての行が現在の行への自己結合で更新されます。この機能が必要な場合と不要な場合があります。

ファクトテーブルに記録された行(つまり、現在の状態)に対してファクトテーブルを結合することにより、現状のステータスを照会できます。タイプ6を使用している場合は、自己結合を介して現在のステータスを照会できます。これは、必要に応じてファクトテーブルで具体化することもできます。

このデータは、アドホックレポートツールやキューブでもうまく機能しますが、ゆっくりと変化するディメンションに複雑なキューブ階層を実装するのは少し面倒です(階層レベルと組み合わせの自然キーのプレースホルダーを時間の経過とともに保持する必要があります)。

開始するのに良いポイントは、 「タイプ2のゆっくりと変化する次元」 でのグーグル検索です。

私は別のテーブルを保持します

FlyerName, FlyerClub, StartDate, EndDate

このようにして、時間の経過に伴う変化を追跡し、いつでも誰かがどのクラブに所属していたかを知ることができます。

現在のレコードには、EndDateNULLが含まれます。

1
JNK

データマートでは、ファクトテーブルへの時変属性を非正規化する必要があります。

トランザクションソースデータベースのチラシのクラブレベルは、チラシテーブル、またはJNKが提案するチラシに関連する日付付きの履歴テーブルにあります。

データマートでは、特定の各チラシのcurrentクラブレベルを、チラシ、フライト、日付などをまとめたファクトレコードに適用する必要があります。

あなたの場合、クラブはチラシの時変特性ですが、興味があるのはチラシとフライトの組み合わせです。したがって、FlyerClubをフライトトランザクション(ファクトテーブル)に記録する必要があります。これは、飛行中にフライヤーにクラブを変更させない限り機能します。

1
Joel Brown