ファクト・テーブルおよびディメンジョン・テーブルの詳細
システムの内部ではスター・スキーマが使用されます。これは、ファクト・テーブルと、ファクト・テーブルが参照するディメンジョン・テーブルで構成されます。ディメンジョン・テーブルはスター・テーブルとも呼ばれることに注意してください。これらのテーブルには、直接クエリを実行することができます。これらは、キューブを構築する際にシステムによって生成され、変更が発生するとシステムによって更新されます。
許可されたインタフェースを使用する場合を除き、これらのテーブルの再定義やこれらへのデータの書き込みはしないでください。"InterSystems Business Intelligence の実装" の "キューブの最新状態の維持" を参照してください。
キューブ定義クラスをコンパイルすると、Listing という名前のテーブルもファクト・テーブルと同じパッケージ内に生成されます。この Listing テーブルは内部使用専用のため、使用しないでください。
"このドキュメントに示したサンプルのアクセス方法" も参照してください。
ファクト・テーブル
キューブ定義クラスをコンパイルすると、システムによって Package_CubeClass.Fact という名前の対応するファクト・テーブルが生成されます。Package_CubeClass は、パッケージとクラス名をテーブル名に変換する際の通常のルールに従い、キューブ定義のパッケージとクラスに対応します。スター・テーブル ID へのリンクを宣言する外部キー定義も、ファクト・テーブル内に生成されます。
キューブを構築したり、インクリメンタルに更新すると、常にファクト・テーブルが更新されます。
このテーブルおよびそれを使用するクラス定義を調べると、役に立ちます。
このファクト・テーブルには以下のフィールドがあります。
-
ID — この行の ID。行の作成時に割り当てられます。
-
%dspartition — 将来使用予定。このフィールドは無視してください。
-
%sourceID — このレコードの基となるベース・クラスにおけるレコードの ID。このフィールドは、ソース・テーブルを参照するポインタです。
-
メジャーごとにフィールドが 1 つ存在し、このレコードに対するこのメジャーの値が格納されます (ただし、1 つ例外があります。このページで後述の "ファクト・テーブルにおけるソース・プロパティの再使用" を参照してください)。
このフィールドには、実際のメジャー値が格納されます。ファクト・テーブル・クラスは、これらの値にビットスライス・インデックスを定義します。以下はその例です。
/// Index for measure M1. Index MxAge On MxAge [ Type = bitslice ]; /// Measure: MxAge <br/> /// Source: Age Property MxAge As %Integer;
-
レベルごとにフィールドが 1 つ存在し、このレコードが属するレベル・メンバを示します (ただし、1 つ例外があります。このページで後述の "ファクト・テーブルにおけるソース・プロパティの再使用" を参照してください)。
-
データ・ディメンジョン内のレベルの場合、ファクト・テーブルにはレベル・メンバの ID が格納されます。この ID は、メンバを定義するテーブルへのポインタです。
ファクト・テーブル・クラスは、これらの値にビットマップ・インデックスを定義します。以下はその例です。
/// Index for fact 1. Index DxGender On DxGender [ Type = bitmap ]; /// Dimension: DxGender <br/> /// Source: Gender Property DxGender As Test.TestCube.DxGender;
このディメンジョンが別のキューブによって共有される場合、このポインタは他方のキューブの該当するディメンジョン・テーブルのレコードを参照します。共有ディメンジョンの詳細は、"InterSystems Business Intelligence の上級モデリング" を参照してください。
-
時間タイプおよび年齢タイプのレベルでは、ファクト・テーブルに整数が格納されます。
ファクト・テーブル・クラスは、対応するプロパティを計算値として定義し、そのビットマップ・インデックスを定義します。 以下はその例です。
/// Index for fact 4. Index DxBirthDateFxYear On DxBirthDateFxYear [ Type = bitmap ]; /// Dimension: DxBirthDateFxMonthYear<br/> /// Source: BirthDate Property DxBirthDateFxMonthYear As %Integer [ details omitted ]; Property DxBirthDateFxYear As %Integer [ Calculated, SqlComputeCode = ... , SqlComputed ];
-
キューブ間の <relationship> の場合、このキューブでリレーションシップの sourceProperty または sourceExpression が指定されているときは、ファクト・テーブルに他方のファクト・テーブルの対応する行の ID が格納されます。この ID は、他方のファクト・テーブルへのポインタです。
-
-
時間タイプ・ディメンジョンまたは年齢タイプ・ディメンジョンごとにフィールドが 1 つ存在し、このレコードの時刻ディメンジョンまたは年齢ディメンジョンの完全な値が格納されます (ただし、1 つ例外があります。このページで後述の "ファクト・テーブルにおけるソース・プロパティの再使用" を参照してください)。
この値は %DeepSee.Datatype.dateTimeOpens in a new tab という形式で、インデックスは作成されません。
このクラスには、NLP レベルまたは NLP メジャーのプロパティは含まれません。これらは別の方法で処理されます。
レベルに dependsOn 属性を指定した場合、ファクト・テーブルにレベルの組み合わせに対する追加のインデックスが格納されます。
Index DxPostalCodeViaHomeCityANDDx2642257510 On (DxPostalCodeViaHomeCity, Dx2642257510) [ Type = bitmap ];
<cube> に <index> 要素を定義した場合は、ファクト・テーブルに追加のカスタム・インデックスが格納されます。以下はその例です。
Index %UserIndexName On (MxAge, DxGender) [ Type = bitmap ];
これらのカスタム・インデックスは、独自で使用するためのものです。システムはこのようなインデックスを使用しません。
フィールド名
以下の表に、システムでメジャー、レベル、およびディメンジョンの各フィールドの名前を決定する方法をまとめます (factName 属性が指定されない場合)。
項目およびシナリオ | ファクト・テーブルのフィールド名 (factName 属性でオーバーライドされていない場合) | 例 |
---|---|---|
ソース・プロパティに基づくメジャー | Mxprop_name。prop_name はプロパティの名前です。 | MxAge |
別のテーブルのソース・プロパティに基づくメジャー、via ドット構文を使用 (まれなケース) | Mxother_prop_nameViaprop_name。other_prop_name は、他のクラスのプロパティの名前です。ただし、生成されるフィールド名が長すぎる場合は、一意の番号が生成されます。 | MxAgeViaOtherTable |
ソース式に基づくメジャー | MxnnnnnnnnnT。nnnnnnnnn は整数、T はメジャー・タイプを示します (例えば、I は整数メジャーを表します)。 | Mx1968652733I |
ソース・プロパティに基づくデータ・レベル (範囲式は不使用) | Dxprop_name | DxGender |
範囲式を使用するソース・プロパティに基づくデータ・レベル | Dxprop_nameRgnnnnnnnnnn。nnnnnnnnn は整数です。 | DxAgeRg855025875 |
別のテーブルのソース・プロパティに基づくデータ・レベル、via ドット構文を使用 | Dxother_prop_nameViaprop_name
ただし、生成されるフィールド名が長すぎる場合は、一意の番号が生成されます。 |
DxPostalCodeViaHomeCity |
ソース式に基づくデータ・レベル | Dxnnnnnnnnnn | Dx2163088627 |
時間タイプ・ディメンジョンまたは年齢タイプ・ディメンジョン | Dxdim_name。dim_name はディメンジョンの名前です(このフィールドはこのディメンジョンのレベルによって使用されます)。 | DxBirthDate |
時間タイプ・レベルまたは年齢タイプ・レベル | Dxdim_nameFxfunc_name。func_name はこのレベルの timeFunction 属性で指定されている名前です。 | DxBirthDateFxYear |
リレーションシップ | Rxgenerated_name。generated_name は、ソース・プロパティの名前またはソース式に基づいて生成された名前です。 | RxMainCity |
ファクト・テーブルにおけるソース・プロパティの再使用
キューブに、(sourceProperty を介して) 同じプロパティを使用する複数のメジャーが存在する場合、ファクト・テーブルにはこれらのメジャーの 1 つ (キューブ定義内の最後のメジャー) のフィールドのみが格納されます。例えば、キューブに以下のメジャー定義が含まれているとします。
<measure name="Age" sourceProperty="Age" aggregate="SUM" factName="AgeFact"/>
<measure name="Avg Age" sourceProperty="Age" aggregate="AVG" factName="AvgAgeFact"/>
これら 2 つのメジャーは複数のレコード間の集約方法のみが異なります。ファクト・テーブルでは、どのレコードについてもこれらのメジャーに同じ値が格納されることになります。このシナリオでは、エイリアスの競合を警告するために、コンパイル・エラーがスローされます。エイリアスの競合を防ぐために、関連するメジャーのすべての factNames を空白のままにするか、同じ factName 値を指定する必要があります。
キューブに同じプロパティを使用する複数のレベルが存在する場合、またはキューブに同じプロパティを使用する複数の年齢または時間ディメンジョンが存在する場合も同じロジックが適用されます。
指定のメジャー、レベル、またはディメンジョンに対して sourceExpression を使用し、%source.propertyname を介してプロパティにアクセスする場合、システムは、常にその値に対して別個のフィールドを生成します。
ディメンジョン・テーブル
キューブ定義クラスをコンパイルする際、年齢タイプおよび時間タイプのレベル以外の各レベルにもテーブルが生成されます。これらのテーブルは、ファクト・テーブルと同じパッケージ内に存在します。モデル・スキーマ内で他のディメンジョン・テーブル ID へのリンクを宣言する外部キー定義も、ディメンジョン・テーブル内に生成されます。
キューブを構築したり、インクリメンタルに更新すると、常にディメンジョン・テーブル (スター・テーブルとも呼ばれる) が更新されます。
レベルのディメンジョン・テーブルには、そのレベルのメンバごとに 1 つの行が含まれます。ディメンジョン・テーブルは、システムがベース・テーブルのレコードを処理する際に動的に作成されます。指定のレベルに対して、新たな一意の値が検出されるたびに、適切なディメンジョン・テーブルにその値が新しい行として追加されます。つまり、ディメンジョン・テーブルには必要な時点で行が自動的に追加され、特に操作する必要はありません。
ディメンジョン・テーブルの名前
キューブ定義で対応するレベルに factName 属性が指定されている場合、その値が該当するディメンジョン・テーブルの名前として使用されます。
この指定がない場合、ディメンジョン・テーブルの名前の形式は以下のとおりです。
Stargenerated_name
generated_name はファクト・テーブルの対応するフィールド名で、先頭に Dx は使用されません。例えば、ファクト・テーブル内で、Home City レベルのフィールド名が DxPostalCodeViaHomeCity であるとします。この場合、対応するディメンジョン・テーブルは StarPostalCodeViaHomeCity と名付けられます。
同じソース・プロパティまたはソース式を使用する 2 つのレベルは、同じ factName を持つ必要があります。
ディメンジョン・テーブル内の列
この行の列は以下のようになります。
-
ID — この行の ID。行の作成時に割り当てられます。
-
列が 1 つ存在し、このメンバのキーが格納されます。このフィールドの名前は、このレベルに対応するファクト・テーブルの列名のフィールドと同じになります。前のセクションを参照してください。
-
このレベルのプロパティごとに 1 つの列が存在し、このメンバの実際のプロパティ値が格納されます。
このフィールド名は Dx で始まり、前述したように、ソース・プロパティ名に基づくか、一意の番号として生成されます。
linkClass と linkProperty を使用して、プロパティと、そのプロパティが属するレベルの両方を定義する場合、プロパティとレベルのフィールドの名前は同じものになります。このシナリオでは、システムによりプロパティのフィールド名の末尾に _Link が追加されます。
-
このレベルの親レベルごとに 1 つの列が存在し、このメンバの親の ID が格納されます。
このフィールドの名前は、親レベルに対応するファクト・テーブルの列名と同じになります。
レベルの定義方法に応じて、メンバ名は以下のように確認できます。
-
既定では、キーが名前として使用され、その名前は個別には格納されません。
-
レベルに isName="true" で定義されているプロパティが含まれる場合、(1 つの例外を除いて) メンバ名はそのプロパティが含まれる列に格納されます。例外は、プロパティが isReference="true" でも定義されている場合です。この場合、フィールドは実行時に計算されます。