#概要
とあるCognos Analyticsのプロジェクトで、逆スタースキーマモデルを実践してみましたので、学んだ事を何回かに分けて投稿しておきます。
要件として、以下の様な要件があっため、逆スタースキーマモデルを選択しました。
① データベースのテーブル構造として、ファクトデータが正規化された多数の表に分散していて、分析向けのデータウェアハウスのテーブル構造ではなく、オペレーショナルモデル構造であった。
② ETLを行いファクト表をまとめ、データウェアハウスを構築していくという要員も時間も無かった
③ 定型レポートだけでなく、エンドユーザーによる自由分析も要件として存在した
#逆スタースキーマモデルとは
逆スタースキーマモデルの前に、スタースキーマモデルのおさらいです。
スタースキーマモデルとは、ラルフ・キンボールが提唱したBIのデータ分析向けのモデルで、こんな感じに巨大な1つのファクト表の周りを複数のディメンション表(マスター表)が取り囲むモデルで、通常のCognosのプロジェクトでは、できる限りこのモデルになるように意識して、テーブル構造の設計を行います。
それに対して、逆スタースキーマモデルとは、1つのディメンション表の回りを、複数のファクト表が囲むモデルになります。
要件にあった、オペレーショナルモデルでの多数のファクト表があるテーブル構造での分析を行うため、このモデルを選択しました。
ちなみに、ディメンション表が複数ある場合、こういうモデルになり、Customer Type Dimensionの様な、個々のファクトにユニークなディメンション(Customer Typeデータ列は、Bad Debt Fact表にしか存在せず、他のファクト表には存在しない状態)は、個々のファクト表とのみリレーションを張ります。
Time Dimensionの様な、複数のファクトで使用されるディメンションは、青枠の様にエリアスを作成して、各ファクト表とリレーションを張ります。
参考:THE REVERSE STAR SCHEMA
http://www.digitalviper.co.uk/documents/The_Reverse_Star_Schema_v2.1.pdf
#とりあえず検証してみてわかった事
まず、こんな感じの簡単なテーブル構造を作成して検証してみました。
DIMA1表が逆スタースキーマの中心で、FACTA1、FACTA2、FACTA3表が回りを取り囲みます。
FACTA1とFACTA2にのみ保持されているYEAR列を持つDIMA2表は、エリアスを作成しFACTA2表に接続しています。
DIMA1.PROD、FACTA1.SALES、FACTA2.PLAN、FACTA3.STOCK をリストに配置
問題なく正常な値が表示されました。
DIMA1.PROD、FACTA1.SALES、FACTA2.PLAN、FACTA3.STOCK をリストに配置し、DIMA2.YEAR='2017'でフィルター
DIMA2と接続されているFACTA1表のSALESに対しては、しっかりとフィルターが効きますが、FACTA2表のPLANに対してはフィルターが効かない事が分かります。
DIMA1.PROD、FACTA1.SALES、FACTA2.PLAN、FACTA3.STOCK をリストに配置し、DIMA2.YEAR='2017'でフィルター、DIMA2(Alias).YEAR='2017'でフィルター
DIMA2のエリアスのYEARの方からもフィルターを設定すると、PLANに対してもフィルターがかかります。
DIMA1.PROD、FACTA2.PLAN、FACTA3.STOCK をリストに配置し、DIMA2.YEAR='2017'でフィルター
以下のエラーメッセージで、エラーになります。
フィルターのDIMA2から接続されているFACTA1のデータがリストのクエリーに存在しないため、こういう組み合わせはNGのようです。
XQE-PLN-0084 SQL を生成できません。フィルター条件 [DatabaseView].[DIMA2].[YEAR]='2017' を、ファクト射影を含まない次のファクト・ストリームに適用できませんでした: (DIMA2)。
#この時点での問題点
周りに配置したディメンション表のデータをフィルター等で使用する場合は、どのファクト表とリレーションがあるのか、ファクト表のデータがクエリーに入っているのか、というのをしっかり意識してレポートを作る必要があります。
定型レポートであれば、そこを理解している開発者が行えば良いですが、自由分析が要件にあるので、エンドユーザーにこれを理解して使ってもらうのは無理ですね。
さてどうするか、というのは第②回に投稿させていただきます!
#目次
第①回:基本的なモデルの動作検証
https://qiita.com/shinyama/items/0567425a4a47ad7d6efa
第②回:自由分析への対応
https://qiita.com/shinyama/items/5bb75bae2e67d6e9cac0
第③回:属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b
第④回:パフォーマンス・チューニング
https://qiita.com/shinyama/items/b4b28844b4235db70032