DB Stories

DBに関する過去、現在、未来の話題をプロフェッショナルの視点で紹介

スタースキーマとキューブ(6)

前回に引き続きファクトテーブルについて解説してきます。

非正規化ディメンション(Degenerate Dimensions)

分析したい項目はディメンションテーブルに保持するのが原則ですが、現実的に全てのデータを保持することができない場合があります。そのとき、ファクトテーブルの中に分析項目(ディメンション項目)を保持する場合があります。このファクトテーブルのディメンション項目の列を非正規化ディメンションと呼びます。(原文はdegenerate dimensionです。日本語表現に悩むところです)

このディメンション項目の列は、「抽出条件」「集約レベルの制御」「データのソート順」「ヘッダと明細の関連」を示します。この非正規化ディメンションは例外ケースですので利用は慎重に検討する必要があります。ファクトテーブルは膨大な行数を保持するのが一般的なため、容量という点でふさわしくありません。(ファクトテーブルは数値型データのため、レコードサイズは小さいのが普通ですが、ディメンション項目列はテキスト型となるためレコード長が大きくなります)このような項目は通常はジャンクディメンションテーブルを利用することになりますが、「トランザクション固有のものか」というのが非正規化ディメンション採用の基準となります。具体的にはファクトテーブルの行(トランザクション)固有の値に該当するものとなります。以下の図にある「受注番号(order_id)」「受注明細番号(order_line_id)」がそれに対応します。

f:id:good-value:20170223215612p:plain

この図でファクトテーブルは受注明細レベルのデータを保持しているため、ファクトテーブルに受注明細に該当するorder_id, order_line_idの2つの項目を保持することができます。

これとは別に、受注明細に関連するディメンションテーブルを作成する方法もあります。このディメンションテーブルはorder_id, order_line_idを持つことになります。この項目はジャンクディメンションテーブル(order_info)に保持することも可能です。わかりやすい方法であると言えますが、この場合ファクトテーブルと同じレコード数を保持することから容量を削減するという目的には即していません。

f:id:good-value:20170223220444p:plain

(次回はディメンションのデータ保持についてです)