複数のファクトを含むファクトテーブル
-
18-09-2019 - |
質問
ディメンション (SiteItem) には 2 つの重要な事実があります。
perUserClicks
perBrowserClicks
ただし、このディメンション内には、属性列に基づいた値のグループ (グループを AboveFoldItems、LeftNavItems、OnTheFlyItems などと呼びます) があり、それぞれがそのグループに固有のさらに多くのファクトを持っています。
AboveFoldItems: eyeTime, loadTime
LeftNavItems: mouseOverTime
OnTheFlyItems: doesn't have any extra, but may in the future
次のファクト テーブル スキーマは問題ありませんか?
DateKey
SessionKey
SiteItemKey
perUserClicks
perBrowserClicks
eyeTime
loadTime
mouseOverTime
一部の列のみが一部のディメンション キーに関連するため、これは少し無駄に思えます (無関係なファクトは NULL のままです)。しかし...これは一般的な問題のようですので、これに対する共通の解決策があるはずですよね?
解決
私はこの上ダミールの答えと一致して、一般的だが、実際のテーブルには、あなたの特定のケースでは非常に狭いため、まだNULLを維持するためのアーロンのadvocationにメリットがあります。
私たちは、寸法(準拠および内部)のほとんど(すべてではない)を共有する複数のファクトテーブルと、特定の対象地域でいくつかのスター・スキーマを持っています。限られた範囲の大きさが考慮されていない企業全体の「適合」が、彼らは我々が「共有内部」寸法を呼ぶものです。
さて、通常、寸法が変更されていないことを、あなたがキーに両方のファクトテーブルを結合することができますので、データが同時にロードされますが、一般的には、もちろん、あなたはディメンション・キーであれば上の2つの異なるスタースキーマに参加できない場合彼らは伝統的な緩やかに変化するディメンションでサロゲートです。一般的には、(通常、それは不変であり、唯一の自然キーを持つ日付ディメンションの特別な場合を除いて)サロゲートにないディメンション内の自然キーまたは「ビジネスキー」に別の星に参加しなければなりません。
あなたは2つの星に参加しないとき、あなたはあなたがおそらくまだを考慮に入れる必要がありますNULLを生成します。その場合には、LEFT JOINを、使用する必要があることに注意してください - ので、あなたが実際に元のモデルに戻って取得していますあなたはNULLで持っていました! ; - )
あなたのテーブルは、キーの小さなセットを幅で、データの垂直パーティショニングは、スペースの節約だけでなく、クリーンな論理モデルを作成する際に、余分なファクトテーブルの利点はより明白である - キーがあるとき、これは特にそうですだけは本当に時点までの共有 - 1つのダミーキーまたはNULLのキーを持つことは間違いなく良いアイデアではありません - これは通常、次元モデリングの問題を指す
。あなたは極端にそれをプッシュする場合は、アーロンが言うように、あなたがキーオーバーヘッドを意味し、共有キーを使用して、各ファクトテーブルの単一ファクト列を持つことができるという事実のコストを矮星とあなたが本当に偽装EAVで終わるんモデルます。
私はまた、あなたが「少なすぎる寸法」のキンボールの状況にあるかどうかを確認することになります。あなたはSESSIONKEYとSiteItemKeyに集中良好な寸法属性を持っている必要がありますように思える - しかし、あなたの全体のモデルと要件を見ることなく、それは言うのは難しいのですが、私はあなたなしでは、低カーディナリティあるいはスノーフレーク次元で一部のユーザー人口統計を持っていると思うだろうフルセッションまたはサイトの寸法ます。
他のヒント
実際には洗練されたソリューションはなく、Null 許容列を使用するか、EAV ソリューションを使用する必要があります。以前に EAV について投稿しました (そして、読む価値があると思われる多くのコメントが生成されました)。
私はシナリオによってはそのモデルを愛用していますが、ディメンションや属性が頻繁に変更されない場合、多くの追加作業が無駄になる可能性があります。周囲のコードが適切に処理できる限り、列内の NULL 値は実際には無駄になりません。
あなたは、複数のファクトテーブルを持つことができます:factperUserClicks、factperBroWserClicks、factEyeTime、等...
これらのそれぞれはDateKey、SESSIONKEY、SiteItemKeyを持っているでしょう。 「意味をなさない」この方法では、唯一のディメンション・キーは、各事実と表示されます。
理想的には、DWにはNULLSがあってはならない - あなたがより適切かもしれゼロを使用して、同じファクトテーブルに保管している場合
。限りディスクスペースを節約するように、私は理想的なソリューションが表示されていない - しかし、DWの1でとにかくスピードと(クエリ)簡略化のためのスペースを交換することになっている。
。