Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

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

この章では、キューブ間のリレーションシップを定義する方法を説明します。以下のトピックについて説明します。

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

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

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

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

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

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

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

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

generated description: rel cubes

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

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

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

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

generated description: rel rpatients

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

generated description: rel rpatients cityrel expand

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

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

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

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

generated description: rel rcities

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

generated description: rel rdoctors

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

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

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

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

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

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

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

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

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

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

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

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

    既定では、このオプションは空白です。この場合、DeepSee は自動的に DependsOn キーワードを、キューブのソース・クラスの名前と等しくなるように設定します。

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

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

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

    そのような場合、リレーションシップ間に依存関係を追加できます。そのためには、"DeepSee モデルの定義" の “ディメンジョン、階層およびレベルの定義” の説明に従って、[依存] オプションを指定します。値には、同じキューブで定義されている別のリレーションシップの論理名を指定します。(または、リレーションシップがレベルに依存する場合は、そのレベルの 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 つ以上のクラスを指定します。

    既定では、このオプションは空白です。この場合、DeepSee は自動的に DependsOn キーワードを、キューブのソース・クラスの名前と等しくなるように設定します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SAMPLES>d ##class(%DeepSee.CubeManager.Utils).GetCubeGroups(.groups)
 
SAMPLES>zw groups
groups=14
groups(1,"AVIATIONAIRCRAFT")=2
groups(1,"AVIATIONCREW")=3
groups(1,"AVIATIONEVENTS")=1
groups(2,"CITIES")=1
groups(3,"CITYRAINFALL")=1
...

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

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

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

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

この例では、1 つのグループが AVIATIONAIRCRAFTAVIATIONCREW、および AVIATIONEVENTS というキューブで構成されています。このグループでは、AVIATIONEVENTS が最初に構築される必要があり、それに続いて AVIATIONAIRCRAFTAVIATIONCREW という順序で構築される必要があります。

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

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

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

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

モデル・ブラウザの使用

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

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

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

generated description: model browser

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

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

generated description: model browser2

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

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

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

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

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

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

FeedbackOpens in a new tab