プログラマ38の日記

主にプログラムメモです。

DWH: データモデリング (2.ディメンションとファクトは、内部結合にする。)

この記事は、前回書いたデータモデリングの9つのことの2つ目です。

 

crmprogrammer38.hatenablog.com

 

安定した性能にするなら内部結合です! 

DWHだと、ファクトの件数が多くて、ディメンションの項目に指定された検索条件を元に、一番最適なファクトの絞込みを行って欲しい。

 

でも、データ内容によっては外部結合にせざるを得ない時があって、そういう時は強制的に内部結合にできるようにデータを加工をします。

 

【内部結合にするためのデータの加工1】

ファクトの結合キーがnullの場合、でもデータは落としたくない

これはよくありますよね。nullであることが意味がある時があります。

でも結合キーがnullは外部結合にせざるをえないので、次のような工夫をします。

・ディメンションにnullの時のレコードを用意(例えばキー項目"00000000"で登録)

・ファクトの項目がnullの場合、nullを"00000000"に変換してセット

 

例えば、次のような売上ファクトで、次の業務データがあったとします。

(顧客は、顧客登録している場合は、顧客コードがセットされているけど、顧客登録されていない場合はnullになる。)

[売上ファクトのデータ]

f:id:crmprogrammer38:20170222195653p:plain

[顧客ディメンションのデータ]

f:id:crmprogrammer38:20170222200016p:plain

 

そしてこれをデータ加工すると次のようになります。

[売上ファクトのデータ(加工後)]

f:id:crmprogrammer38:20170222200221p:plain

[顧客ディメンションのデータ(加工後)]

f:id:crmprogrammer38:20170222200301p:plain

これなら顧客がnullだったレコードも内部結合することができます。

でも、顧客がnullの時に"00000000"と表示するのが違和感がある場合は、次のように顧客ディメンションにさらに「顧客 結合用」列を追加すれば、表示する顧客をnullにすることができます。

f:id:crmprogrammer38:20170222200818p:plain

【内部結合にするためのデータの加工2】

ファクトの結合キーがディメンションにない場合、でもデータは落としたくない

 

データの打ち間違えか、マスタの名寄せをしたかでファクトの顧客が、ディメンションにない場合があります。そんな時はディメンションに足りない分を追加します。

 

[売上ファクトのデータ]

f:id:crmprogrammer38:20170222235508p:plain

[顧客ディメンションのデータ]

f:id:crmprogrammer38:20170222235705p:plain

売上ファクトの顧客"A000000"に該当する顧客が顧客ディメンションにありません。

なので、顧客ディメンションに追加します。

 

[顧客ディメンションのデータ(加工後)]

f:id:crmprogrammer38:20170222235856p:plain

 

 

[最後に]

外部結合を多用してとても苦労した経験があって、内部結合にして安定させようという気持ちで書いています。

もちろん、外部結合を選択するケースもあると思います。その都度一番いい方法を選択していくことが重要です。