Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

キューブ間のリレーションシップの定義

ここでは、Business Intelligence で使用するために、キューブ間のリレーションシップを定義する方法を説明します。

背景情報は、"モデル・オプションの概要" を参照してください。

キューブ・バージョンとリレーションシップの相互作用の詳細は、"キューブのバージョンとリレーションシップ" を参照してください。

"BI サンプルのアクセス方法" も参照してください。

リレーションシップの概要

キューブ間のリレーションシップは、以下のように定義できます。

  • 一対多のリレーションシップ。両方のキューブで、いずれかのキューブのレベルを使用できます。

    一方のキューブ (片側) では、このリレーションシップはリスト・ベース・レベルとよく似た動作を行います。

  • 一方向、一対多のリレーションシップ。一方のキューブで、このリレーションシップはリスト・ベース・レベルとよく似た動作を行います。他方のキューブでは、このリレーションシップは表示できません。

リレーションシップを定義する際は、レベルを複数回定義するのではなく、1 回だけ定義することで、ファクト・テーブルとインデックスのサイズを最小にできます。

Patients サンプルでは、RelatedCubes フォルダ内に 5 つの関連キューブが提供されています。下図は、これらのキューブの関連状況をまとめたものです。

Two-way arrows between the Patients cube and Allergies and Doctors. One-way arrow from Patients and Cityrainfall to Cities.

単方向の矢印は単方向のリレーションシップを示します。矢印を出してポイントする側のキューブは、相手方のキューブのレベルを認識できます。双方向矢印は双方向リレーションシップを示します。

単方向リレーションシップの確認

ここでは、単方向リレーションシップの機能を調べます。

RelatedCubes/Patients キューブには、RCities キューブへの単方向リレーションシップがあります。RelatedCubes/Patients キューブをアナライザで開くと、以下のキューブ・コンテンツが表示されます。

The Patients cube has relationships to the Allergies, Cities and Doctors cubes. These are shown in italic, colored text.

Cities フォルダは、RelatedCubes/Cities キューブへのリレーションシップです。展開すると、そのキューブで定義されたレベルが表示されます。

In the Patients cube, expanding the Cities folder shows that the Cities cube has a relationship to the Doctors cube.

RelatedCubes/Patients キューブを操作する際は、これらすべてのレベルを、このキューブで直接定義されているレベルを使用するのと同じように使用できます。例えば、[ZIP][行] にドラッグ・アンド・ドロップできます。

Cities 内の Doctors フォルダは、RelatedCubes/Cities キューブから RelatedCubes/Doctors キューブへのリレーションシップです。結果の混乱を招きやすいため、リレーションシップを重ねて使用することは推奨されません。

双方向リレーションシップの確認

RelatedCubes/Cities キューブと RelatedCubes/Doctors キューブの間には双方向リレーションシップがあります。RelatedCubes/Cities キューブを開くと、以下のキューブ・コンテンツが表示されます。

The Cities cube has a relationship to Doctors. Opening the Doctors folder shows it has a relationship to Cities.

同様に、RelatedCubes/Doctors キューブを開くと、以下のキューブ・コンテンツが表示されます。

The Doctors cube has a relationship to Cities. Opening the Cities folder shows it has a relationship to Doctors.

キューブ間のリレーションシップを定義する際の考慮事項

キューブ間の新たなリレーションシップを定義する前に、影響を受けるいずれかまたは両方のキューブが既にキューブ・マネージャに登録されているグループのメンバであるかどうかを考慮する必要があります。

登録したグループ内のキューブにリレーションシップを追加しようとすると、エラーが発生し、そのエラーが解決されるまでキューブ・マネージャのタスクが一時停止されることがあります。この動作を防ぐために、リレーションシップを追加する前に、影響を受けるキューブが属するグループをキューブ・マネージャから登録解除する必要があります。リレーションシップを追加したら、グループを再登録し、元の設定を再作成します。

リレーションシップへのこのような変更はすべて、開発システムで行うことが推奨されます。これにより、キューブ・レジストリが適切に設定されているかが検証され、その後、キューブ定義とキューブ・レジストリ・クラスが一緒にプロダクション・システムにインポートされます。

単方向リレーションシップの定義

あるキューブから別のキューブへの単方向リレーションシップを定義するには、最初のキューブで単一のリレーションシップを定義します。そのためには、最初のキューブで以下の変更を行います。

  1. [要素の追加] を選択します。

    ダイアログ・ボックスが表示されます。

  2. [新規項目名の入力] に、リレーションシップ名を入力します。これにより、リレーションシップの論理名が決まります。これを、他方のキューブの論理名と同じ名前にすると便利です。

  3. [リレーションシップ] を選択します。

  4. [OK] を選択します。

  5. 右側の詳細領域で、以下の値を指定します。

    属性 目的
    表示名 リレーションシップの表示名。これを、他方のキューブの表示名と同じ名前にすると便利です。
    プロパティ これらのいずれかを指定します。この値は、他方のキューブで使用されるベース・クラスのレコードの ID にする必要があります。
    カーディナリティ one
    関連キューブ 他方のキューブの論理名。
    ヌル置換文字列 (オプション) リレーションシップのソース・データが NULL の場合にメンバ名として使用する文字列 (例えば None) を指定します。

    リレーションシップの既定の NULL 置換はありません。

    [逆] は指定しないでください。

  6. アーキテクトでキューブ定義を選択します。次に、右側の詳細領域の [依存] オプションを編集します。このオプションでは、このクラスをコンパイルする前に実行可能にする必要がある 1 つ以上のクラスを指定します。

    既定では、新しいキューブを作成すると、システムは DependsOn キーワードを、キューブのソース・クラスの名前と等しくなるように設定します。

    このオプションを指定するには、コンマで区切られたクラスのリストを指定して、そのリスト内の各クラスの完全なパッケージ名とクラス名を指定します。このリストには、キューブのソース・クラスと、このキューブが依存するキューブ・クラスを含める必要があります。以下に例を示します。

    [ DependsOn = (MyApp.CubeBaseClass, MyApp.OtherCubeClass)]
    
  7. 必要に応じて、スタジオでキューブ・クラスを編集して、このリレーションシップの、同じキューブで定義されている別のリレーションシップへの依存関係を定義します。

    場合によっては、2 つのリレーションシップの間に仮想依存関係が存在します。例えば、Country リレーションシップと Product リレーションシップを持つキューブがあるとします。これらのリレーションシップは、論理的に相互に独立しています。理論上は、任意の製品を任意の国で販売できます。しかし、特定の製品の販売先が特定の国々に限定される場合は、これらのリレーションシップ間に仮想依存関係が存在します。ユーザが国を選択したとき、望ましいのは、その国で販売可能な製品のみが表示されることです。

    そのような場合、リレーションシップ間に依存関係を追加できます。そのためには、"InterSystems Business Intelligence のモデルの定義" の "ディメンジョン、階層およびレベルの定義" の説明に従って、[依存] オプションを指定します。値には、同じキューブで定義されている別のリレーションシップの論理名を指定します。(または、リレーションシップがレベルに依存する場合は、そのレベルの MDX 識別子を指定します。)

    [依存] 属性は、DependsOn コンパイラ・キーワードとはまったく関係ないことに注意してください。

双方向リレーションシップの定義

キューブ間の双方向リレーションシップを定義するには、各キューブに 1 つずつ、計 2 つの補完的な <relationship> 要素を定義します。これらのキューブの一方が依存キューブで、もう一方が独立キューブです。

キューブ A (ソース・クラス A のレコードに基づく) とキューブ B (ソース・クラス B のレコードに基づく) について考えてみましょう。これらのキューブ間の双方向リレーションシップを定義するには、以下の手順を使用します。

  1. ソース・クラス間のリレーションシップを評価します。これを使用し、以下のようにして、どちらのキューブが依存キューブなのかを判断します。

    • クラス A 内の 1 つのレコードがクラス B の複数のレコードに対応しているかどうか。

      この場合、キューブ B が依存キューブです。

    • クラス B 内の 1 つのレコードがクラス A の複数のレコードに対応しているかどうか。

      この場合、キューブ A が依存キューブです。

    • クラス間に1 対 1 のリレーションシップが存在するかどうか。

      この場合、どちらのキューブも依存キューブである可能性があります。

  2. アーキテクトで、依存キューブに以下の変更を加えます。

    1. [要素の追加] を選択します。

      ダイアログ・ボックスが表示されます。

    2. [新規項目名の入力] に、リレーションシップ名を入力します。これにより、リレーションシップの論理名が決まります。これを、他方のキューブの論理名と同じ名前にすると便利です (例 : IndependentCubeName)。

    3. [リレーションシップ] を選択します。

    4. [OK] を選択します。

    5. 右側の詳細領域で、以下の値を指定します。

      属性 目的
      表示名 リレーションシップの表示名。これを、他方のキューブの表示名と同じ名前にすると便利です。 独立キューブの表示名
      プロパティ これらのいずれかを指定します。この値は、他方のキューブで使用されるベース・クラスのレコードの ID にする必要があります。  
      カーディナリティ one  
      他方のキューブの逆リレーションシップの値。リレーションシップの名前を、ポイントするキューブの論理名と同じにすると便利であるため、このキューブの論理名を使用します。 DependentCubeName
      関連キューブ 他方のキューブの論理名。 IndependentCubeName
      ヌル置換文字列 (オプション) リレーションシップのソース・データが NULL の場合にメンバ名として使用する文字列を指定します。

      リレーションシップの既定の NULL 置換はありません。

      なし
  3. アーキテクトでキューブ定義を選択します。つまり、中央の領域の最上行を選択します。次に、右側の詳細領域の [依存] オプションを編集します。このオプションでは、このクラスをコンパイルする前に実行可能にする必要がある 1 つ以上のクラスを指定します。

    既定では、新しいキューブを作成すると、システムは DependsOn キーワードを、キューブのソース・クラスの名前と等しくなるように設定します。

    このオプションを指定するには、コンマで区切られたクラスのリストを指定して、そのリスト内の各クラスの完全なパッケージ名とクラス名を指定します。このリストには、キューブのソース・クラスと、このキューブが依存するキューブ・クラスを含める必要があります。以下に例を示します。

    [ DependsOn = (MyApp.CubeBaseClass, MyApp.OtherCubeClass)]
    
  4. アーキテクトで、独立キューブに以下の変更を加えます。

    1. [要素の追加] を選択します。

      ダイアログ・ボックスが表示されます。

    2. [新規項目名の入力] に、リレーションシップ名を入力します。これにより、リレーションシップの論理名が決まります。このときに、他方のキューブの論理名と同じ名前にすると便利です (例 : DependentCubeName)。

    3. [リレーションシップ] を選択します。

    4. [OK] を選択します。

    5. 右側の詳細領域で、以下の値を指定します。

      属性 目的
      表示名 リレーションシップの表示名。これを、他方のキューブの表示名と同じ名前にすると便利です。 依存キューブの表示名
      カーディナリティ many  
      他方のキューブの逆リレーションシップの値。リレーションシップの名前を、ポイントするキューブの論理名と同じにすると便利であるため、このキューブの論理名を使用します。 IndependentCubeName
      関連キューブ 他方のキューブの論理名。 DependentCubeName
    6. 必要に応じて、スタジオでキューブ・クラスを編集して、このリレーションシップの、同じキューブで定義されている別のリレーションシップへの依存関係を定義します。

      場合によっては、2 つのリレーションシップの間に仮想依存関係が存在します。例えば、Country リレーションシップと Product リレーションシップを持つキューブがあるとします。これらのリレーションシップは、論理的に相互に独立しています。理論上は、任意の製品を任意の国で販売できます。しかし、特定の製品の販売先が特定の国々に限定される場合は、これらのリレーションシップ間に仮想依存関係が存在します。ユーザが国を選択したとき、望ましいのは、その国で販売可能な製品のみが表示されることです。

      そのような場合、リレーションシップ間に依存関係を追加できます。そのためには、"InterSystems Business Intelligence のモデルの定義" の "ディメンジョン、階層およびレベルの定義" の説明に従って、[依存] オプションを指定します。値には、同じキューブで定義されている別のリレーションシップの論理名を指定します。(または、リレーションシップがレベルに依存する場合は、そのレベルの MDX 識別子を指定します。)

      [依存] オプションは、DependsOn コンパイラ・キーワードとはまったく関係ないことに注意してください。

リレーションシップを持つキューブの構築

リレーションシップを持つキューブを構築する際は、独立キューブを最初に構築します。これはリレーションシップのソース・プロパティまたはソース式を定義しないほうのキューブです。より一般的には、独立したキューブを再構築したときには、必ずその次に、依存するキューブを再構築する必要があるということです。推奨される最善の手段は、適切な順序でキューブを構築するユーティリティ・メソッドまたはルーチンを作成することです。

プロダクション・システムでは、キューブ・マネージャを使用し、指定に従ってキューブを構築または同期する自動化タスクを作成することをお勧めします。詳細は、"InterSystems Business Intelligence の実装" を参照してください。

関連キューブの構築順序の決定

キューブ・マネージャを使用していない場合は、正しい構築順序を決定する必要があります。そのためには、前述のルールに従うか、%DeepSee.CubeManager.UtilsOpens in a new tabGetCubeGroups() メソッドを使用します。1 つ目の引数は、参照によって返され、指定されたネームスペース内のキューブの自然なグループ分けを示す配列です。次に例を示します。

SAMPLES>d ##class(%DeepSee.CubeManager.Utils).GetCubeGroups(.groups)
 
SAMPLES>zw groups
groups=11
groups(1,"CITIES")=1
groups(2,"CITYRAINFALL")=1
groups(3,"COMPOUNDCUBE/CITYRAINFALL")=1
groups(4,"COMPOUNDCUBE/DOCTORS")=1
groups(5,"COMPOUNDCUBE/PATIENTS")=1
groups(6,"CONNECTORCUBE")=1
groups(7,"HOLEFOODS")=1
groups(8,"HOLEFOODSBUDGET")=1
groups(9,"PATIENTS")=1
groups(10,"PATIENTSQUERYCUBE")=1
groups(11,"RELATEDCUBES/ALLERGIES")=5
groups(11,"RELATEDCUBES/CITIES")=1
groups(11,"RELATEDCUBES/CITYRAINFALL")=2
groups(11,"RELATEDCUBES/DOCTORS")=3
groups(11,"RELATEDCUBES/PATIENTS")=4

この配列の説明は以下のとおりです。

  • 1 つ目の添字は、このネームスペース内のキューブの一意のグループを識別します。1 つ目のグループには 1、2 つ目のグループには 2 というように番号が付けられています。これらの番号は任意です。

  • 2 つ目の添字は、このネームスペース内のキューブを識別します。このキューブは、1 つ目の添字で識別されたグループに含まれています。

  • このノードの値は、このグループ内の指定されたキューブの構築順序です。

この例では、1 つのグループが RELATEDCUBES/ALLERGIESRELATEDCUBES/CITIESRELATEDCUBES/CITYTRAINFALLRELATEDCUBES/DOCTORS、および RELATEDCUBES/PATIENTS というキューブで構成されています。このグループでは、RELATEDCUBES/CITIES を最初に構築し、その後、RELATEDCUBES/CITYTRAINFALLRELATEDCUBES/DOCTORSRELATEDCUBES/PATIENTS と続き、最後に RELATEDCUBES/ALLERGIES を構築する必要があります。

関連キューブを間違った順序で構築した場合のエラー

関連キューブを間違った順序で構築した場合、%BuildCube() は以下のようなエラーを生成します。

ERROR #5001: Missing relationship reference in RelatedCubes/Patients: source ID 1 missing reference to RxHomeCity 4

構築エラーおよびそれらを確認できる場所に関する一般情報は、"InterSystems Business Intelligence のモデルの定義" の "構築エラー" を参照してください。

モデル・ブラウザの使用

システムには、キューブ定義を表示するために使用できる補助ツール (モデル・ブラウザ) が用意されています。モデル・ブラウザは、キューブ間のリレーションシップの表示および移動が可能であるため、リレーションシップを持っているキューブに対して特に役に立ちます。

このツールにアクセスするには、[Analytics][ツール][モデル・ブラウザ] の順に選択します。

モデル・ブラウザにアクセスしたら、右側のドロップダウン・リストを使用して、キューブの名前を選択します。モデル・ブラウザに次のような画面が表示されます。

The label AviationEvents(1) has a dashed line to a yellow circle, which in turn has a solid line to a blue circle.

中央の黄色の円は、選択したキューブを表します。図の上部のラベルは、このキューブの名前 (この例では AviationEvents) を示しており、続いてかっこ内に関連キューブの数 (1) が示されています。中央の円の周囲にある円それぞれは、選択したキューブに関連する 1 つのキューブを表します。これらの円に対して、ラベルがキューブ名および関連キューブの数を示します。例えば、AviationAircraft というラベルが付いている円は、AviationAircraft キューブを表します。Referrals に関連するキューブは 2 つあります。

任意の円を選択すると、新しく選択したキューブが中央に表示されるように図が変化し、残りの図も適宜更新されます。

ページの右側には、選択したキューブの詳細が表示されます。この領域には、アナライザの左側の領域での表示方法とまったく同じ方法でキューブのコンテンツが表示されます。

リレーションシップの削除

後でリレーションシップを削除する場合は、以下の手順を実行します。

  1. そのリレーションシップを両方のキューブ定義から削除します。

  2. 両方のキューブ定義をリコンパイルします。

  3. すべての変更済みキューブを正しい順序で再構築します。

FeedbackOpens in a new tab