継承の原則は、複数のコンテキストまたはエンティティによって共有されるリソースを相互化することです。 TIBCO EBX®は、データ値を定義、因数分解、および解決するためのメカニズムを提供します。データセットの継承および継承されたフィールドです。
さらに、値を計算するために関数を定義できます。
この章で説明する継承メカニズムを「構造的継承」と混同しないでください。これは通常、モデルに適用され、たとえばUMLクラスダイアグラムで提案されます。
データセットの継承は、データが子会社やビジネスパートナーなどのグローバルなエンタープライズコンテキストに適用される場合に特に役立ちます。
データセットの階層が与えられると、共通データをルートまたは中間データセットに分解し、特定のコンテキストで特殊なデータを定義することができます。
データセットの継承メカニズムについては、以下のデータセットの継承で詳しく説明しています。
データセット間のグローバルなビルトイン関係を利用するデータセットの継承とは異なり、継承されたフィールドは、データ構造に固有のよりきめ細かい依存関係を利用します。これにより、ビジネスエンティティレベルでデータを因数分解および特殊化できます。
たとえば、モデルで「Product」が「FamilyOfProducts」に関連付けられていると指定されている場合、「Product」の一部の属性は、関連付けられている「FamilyOfProducts」で定義されている属性から値を継承する可能性があります。
同じデータセットで両方の継承メカニズムを使用する場合、フィールドの継承はデータセットの継承よりも優先されます。
データモデルでは、ノードが計算値を保持するように指定することもできます。この場合、指定されたJavaBean関数は、値が要求されるたびに実行されます。
この関数は、現在のレコードの値や別のテーブルに基づく計算など、現在のコンテキストを考慮に入れて、サードパーティのシステムに要求を送信することができます。
データセット継承メカニズムは、DMA からデータ モデル ([構成] > [データ モデル プロパティ]) で宣言するか、XML スキーマ定義で直接宣言します ([アクション] > [データ モデルのインポート])。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ebxbnd="urn:ebx-schemas:binding_1.0"> <xs:annotation> <xs:appinfo> <osd:inheritance> <dataSetInheritance>all</dataSetInheritance> </osd:inheritance> </xs:appinfo> </xs:annotation> ... </xs:schema>
エレメントosd:inheritance
は、プロパティdataSetInheritance
を定義して、このデータモデルに基づくデータセットでの継承の使用を指定します。次の値を指定できます。
all
は、データモデルに基づいてすべてのデータセットで継承が有効になっていることを示します。
none
は、データモデルに基づいてすべてのデータセットの継承が無効になっていることを示します。
指定しない場合、継承メカニズムは無効になります。
値のデータセット継承ルックアップメカニズムは次のように進行します。
値がローカルで定義されている場合は、値が返されます。
明示的にnull
にすることができます。
それ以外の場合は、データセットの階層内のデータセットのビルトインの子と親の関係に従って、最初のローカルで定義された値を検索します。
ローカルで定義された値が見つからない場合は、デフォルト値が返されます。
デフォルト値が定義されていない場合、null
が返されます。
注:デフォルト値は次の場所では定義できません:
単一の主キーノード
自動インクリメントされたノード
計算値を定義するノード
テーブルレコードも値と同様に、複数のコンテクストに1つの単位として継承されますが、部分的に再定義 (上書き)されたり、特定のコンテクストのために定義 (ルートモード)されたり、非表示にされたりすることもあります。
正式には、テーブルレコードには4つの異なる定義モードのいずれかがあります。
ルートレコード | テーブルでローカルに定義されており、親はありません。これは、同じ主キーを持つレコードが親テーブルに存在しないか、この親が非表示レコードであることを意味します。 |
レコードの上書き | テーブルでローカルに定義され、親レコードがあります。これは、同じ主キーを持つレコードが親テーブルに存在し、この親が非表示レコードではないことを意味します。上書きレコードは、明示的に再定義する値を除いて、その値を親から継承します。 |
継承されたレコード | 現在のテーブルでローカルに定義されておらず、親レコードがあります。すべての値が継承されます。 関数は常に現在のレコードコンテキストで解決され、継承されません。 |
非表示レコード | 同じ主キーを持つ親が定義されている場合、この親がテーブルの子孫に表示されないことを指定します。 |
データモデルのテーブルの宣言で管理ルールを指定することもできます。
特定の継承メカニズムにより、他のテーブルとの関係に従ってフィールドの値をフェッチできます。
次のように、特定の継承を指定する必要があります。
基礎となるデータモデルのノードの高度なプロパティ。
基礎となるデータモデルのターミナルノード。次のように宣言されます。
<xs:element name="sampleInheritance" type="xs:string"> <xs:annotation> <xs:appinfo> <osd:inheritance> <sourceRecord> /root/table1/fkTable2, /root/table2/fkTable3 </sourceRecord> <sourceNode>color</sourceNode> </osd:inheritance> </xs:appinfo> </xs:annotation> </xs:element>
エレメントsourceRecord
は、値の継承元のレコードを検索する方法を説明する式です。これは、現在のエレメントからソーステーブルへの外部キーまたは外部キーのシーケンスです。
sourceRecord
がデータモデルで定義されていない場合、継承されたフィールドは現在のレコードからフェッチされます。
エレメントsourceNode
は、ソースレコードで継承するノードのパスです。
特定の継承については、次の条件を満たす必要があります。
エレメントsourceNode
は必須です。
ソースレコードへのパスの式は、現在のエレメントからソースレコードへの外部キーの一貫したパスである必要があります。この式には、1対1および0対1の関係のみが含まれている必要があります。
sourceRecord
には、集約されたリストエレメントを含めることはできません。
sourceRecord
の各エレメントは外部キーである必要があります。
継承されたフィールドが外部キーでもある場合、sourceRecord
はそれ自体を参照して、継承された値のソースレコードへのパスを取得できません。
sourceRecord
のすべてのエレメントが存在する必要があります。
ソースノードは、ソースレコードを含むテーブルに属している必要があります。
ソースノードはターミナルである必要があります。
ソースノードは書き込み可能である必要があります。
ソースノードタイプは、現在のノードタイプと互換性がある必要があります。
ソースノードのカーディナリティは、現在のノードのカーディナリティと互換性がある必要があります。
継承元のフィールドが同じレコードにフェッチされている場合、ソースノードを継承フィールドと同じにすることはできません。
継承されたフィールド値のルックアップメカニズムは、次のように進行します。
値がローカルで定義されている場合は、値が返されます。
明示的にnull
にすることができます
それ以外の場合は、データモデルで定義されているプロパティに従って、継承元のソースレコードと値を検索します。
このプロセスは再帰的です。ソースノードがローカルで値を定義していない場合は、ソースノードの継承動作に従って値が検索されます。
EBX®は、データセットの階層におけるデータセットの継承を最適化するためのビルトインのユーザーサービスを提供します。このサービスは、次の機能を実行します。
重複値の処理:継承された値の重複であるすべてのパラメーター値を検出して削除します。
共通値の相互化:共通の祖先の子孫の間で共通の値を検出し、相互化します。
データセットはボトムアップで処理されます。つまり、レベル Nのデータセットでサービスを実行し、 N+1 がその子のレベル、N+2 がその子の子のレベルである場合、サービスはまずレベル N+2 のデータセットを処理して、レベル N+1のデータセットに対して最適化できるかどうかを判断します。 次に、レベル N+1 の最適化をレベル N に対して行います。
これらの最適化およびリファクタリング関数は、データモデルで宣言されているデフォルト値を処理しません。
最適化手順で考慮される最高レベルは、常にサービスが実行されるデータセットです。これは、ターゲットデータセットとそれ自体の祖先の間で最適化とリファクタリングが実行されないことを意味します。
テーブルの最適化は、同じ主キーを持つレコードに対して実行されます。
継承されたフィールドは最適化されていません。
最適化およびリファクタリング機能は、データセットがアクティブ化されている場合、データセットの解決されたビューを変更しません。
「最適化とリファクタリング」サービスは、子データセットがあり、データセット情報で「アクティブ化」プロパティが「いいえ」に設定されているデータセットで使用できます。
このサービスは、現在のデータセット値への書き込みアクセス権を持つすべてのプロファイルで利用できます。プロファイルに制限付きアクセス権を設定することで無効にできます。
パフォーマンス上の理由から、アクセス権はすべてのノードおよびテーブルレコードで検証されるわけではありません。