ファクトテーブルの内容とディメンションテーブルの内容についてスタースキーマを設計する方法のテキストブックの定義を聞いたことがあります。
ファクトテーブルにはオブジェクトに関するコア情報が含まれ、ディメンションにはファクトに関する情報が含まれている必要があります
(言い換え)
ただし、実際にはビジネスでは、ファクトテーブルに代理キー、ビジネスキー、およびすべての単一値フィールドが含まれるように設計されたスタースキーマを見てきました。オブジェクトのすべてのmulti-valuedフィールドを格納します(つまり、Wordディメンション)。たとえば、人はファクトテーブルで表されるオブジェクトである場合があります。人には、1つの名前、1つの年齢などがあり、すべてファクトテーブルで実行可能なファクトを作成します。人は複数の車を所有している場合があり、それぞれの車の属性を持ちます。車の属性は、車の属性を説明する複数の列を持つディメンションテーブルとして格納されます。この例では、このディメンションテーブルには、ファクトテーブルの対応する行のビジネスキーを表す外部キーも含まれています。
したがって、これが適切な設計であることに同意できる場合、私が克服しようとしている問題は、複数値のディメンションテーブルでSCDタイプ2(履歴)を実行する方法です。単一のファクトでいっぱいの私のファクトテーブルの場合、それは明白です。有効日と有効期限の2つの列を追加し、ビジネスキーを使用して、最新のレコードの有効期限がNULL
である一般的なレコードをリンクし、同じビジネスキーの他のすべての履歴レコードがリンクする発効日と有効期限の両方が、それらがどの時点で最新の記録であったかを示します。
多値リストを表すディメンションでこれと同じコンセプトをどのように使用しますか?基本的には、(1)現在のリスト(この例では、人が所有する車)を特定し、(2)履歴の特定の瞬間にリストが何であったかを特定できる同じ概念を望みます。各ディメンション値に有効日と有効期限を設定することはできますか?その後、特定の時間の後に追加された値をどのように区別しますか?または値を削除しましたか?
しかし、この設計アプローチに同意しない場合、これを正しく実行できるように、業界標準を教えてください。
通常、ディメンションテーブルには、すべてのフィールドに対して単一の有効な時刻(開始日と終了日)が含まれており、SCD2は完全なレコードに適用されます。これによりクエリが簡素化されるため、事前にnull以外の終了値を使用して現在有効なレコードをマークすることをお勧めします。過去の終了日は、削除またはユーザーが定義したその他のセマンティクスを意味します(国を去った人、またはもはや雇用されていない人など)。また、サロゲートキーをディメンションテーブルに追加して、レコードを一意に識別します。
ファクトテーブルには通常、売上やコストなどの「メジャー」が含まれているか、発信された通話や通話時間などのイベントを示します。通常、レポートのこれらの列で集計を使用します。
スタースキーマは、疎に配置された「キューブ」をモデル化する方法であり、座標系の各軸は、ディメンションテーブルの1つによって指定されます。レポートの「スライスアンドダイス」操作と「ドリルアップ/ドリルダウン」操作は、このモデルを使用してSQLにうまく変換されます。
車と人の例では、2つのディメンションテーブルを使用します。1つは車用、もう1つは人用で、履歴化され(SCD2に従って)、ディメンションテーブルへの外部キーを含み、それぞれの識別子(エンティティ識別子)を参照する事実のないファクトテーブルを使用します。 )、および有効な時間列(SCD2)。この設計では、ディメンションテーブルの1つが変更された場合、ファクトテーブルのSCD2ルールに従ってレコードを追加しません。
このようにして、人の名前の変更、車の色の変更、車と人の関係、たとえば所有権など、各エンティティの変更をモデル化できます。各テーブルは、ビジネスキーごとに重複しない有効時間(開始値と終了値)を使用し、これらのエンティティの履歴を個別に記録します。このモデルでは、ファクトテーブルは基本的にm:nリンケージテーブルであり、有効な時間の個別の履歴が保持されます。
現在および過去のクエリに対して各テーブルでx between start and end
を使用して、現在と過去のリストを識別します((1)と(2)に答えます-インターバルが右に開いているか左に開いているかを無視して) 。
完全な履歴のある都市に車がいくつあるかなどの要約統計(都市が人物ディメンションテーブルの一部であると想定)は、時系列結合と「シーケンス」クエリを使用して応答できるようになりました。 Snodgrass 、6.3ff章を参照