多くの場合、コネクターはすべての個別ビジネス・オブジェクトが 1 つのデータベース表またはビューによって表され、オブジェクト内部のそれぞれの単純属性 (つまり、String または Integer または Date などの単一値を表す属性) はその表またはビュー内の列によって表されると想定します。したがって、同じ個別ビジネス・オブジェクトに含まれる属性を、別々のデータベース表に格納することはできません。ただし、次のような状態は可能です。
ビジネス・オブジェクトは、フラットなものと階層のものがあります。フラットなビジネス・オブジェクトのすべてとの属性は単純属性で、単一の値を表します。
階層ビジネス・オブジェクトには、1 つの子ビジネス・オブジェクト、子ビジネス・オブジェクトの配列、またはその両方の組み合わせを表す属性があります。そして、子ビジネス・オブジェクトも、それぞれ自身の子ビジネス・オブジェクトまたはビジネス・オブジェクトの配列を持つことができます。この関係は階層の下に向かって続きます。単一カーディナリティー関係は、親ビジネス・オブジェクト内の属性が単一の子ビジネス・オブジェクトを表すときに発生します。この場合、その属性は、その子ビジネス・オブジェクトと同じタイプです。
複数カーディナリティー関係は、親ビジネス・オブジェクト内の属性が子ビジネス・オブジェクトの配列を表すときに発生します。この場合、この属性は子ビジネス・オブジェクトと同じタイプの配列です。
コネクターでは、ビジネス・オブジェクト間での以下の関係がサポートされます。
カーディナリティーのタイプを問わず、親ビジネス・オブジェクトと子ビジネス・オブジェクトの間の関係は、その関係が保管されるビジネス・オブジェクトのキー属性に含まれるアプリケーション固有情報に記述されています。このアプリケーション固有情報の詳細は、FK=[fk_object_name.]fk_attribute_nameを参照してください。
通常、単一カーディナリティーの子ビジネス・オブジェクトを含むビジネス・オブジェクトには、関係を表すための属性が 2 つ以上含まれます。一方の属性のタイプは、子ビジネス・オブジェクトのタイプと同じになります。もう一方の属性は、子の基本キーを、外部キーとして親に格納するための単純属性です。親には、子に含まれる基本キー属性と同数の外部キー属性が含まれます。
関係を設定する外部キーが親に保管されるため、各親には特定のタイプの単一カーディナリティーの子を 1 つだけ格納できます。
図 2 に一般的な単一カーディナリティー関係を示します。この例では、fk1 が子ビジネス・オブジェクトの基本キーを格納するための単純属性であり、child[1] が子ビジネス・オブジェクトを表す属性です。
通常、各親ビジネス・オブジェクトは、その親ビジネス・オブジェクトに含まれる子ビジネス・オブジェクトの内部のデータを所有しています。例えば、Customer ビジネス・オブジェクトのそれぞれに Address ビジネス・オブジェクトが 1 つずつ含まれる場合、新しいカスタマーが作成されると、Customer 表と Address 表の両方に新しい行が挿入されます。挿入された新しい住所は、その新しいカスタマーに固有です。同様に、Customer 表からカスタマーを削除すると、そのカスタマーの住所も Address 表から削除されます。
ただし、複数の階層ビジネス・オブジェクトに同一のデータが含まれ、そのデータがそれらのビジネス・オブジェクトのいずれにも所有されていない場合があります。例えば、Address ビジネス・オブジェクトに StateProvince[1] 属性があり、単一カーディナリティーの StateProvince 索引表を表しているとします。この索引表は、ほとんど更新されることがないものであり、住所データからは独立して保守されています。このため、住所データの作成または変更により、この索引表内のデータが影響を受けることはありません。コネクターは、既存の州名を検出するか、検出に失敗するかのいずれかです。この索引表内の値を追加または変更することはありません。
複数のビジネス・オブジェクトに同一の単一カーディナリティーの子ビジネス・オブジェクトが含まれている場合、各親ビジネス・オブジェクトの外部キー属性では、関係が NO_OWNERSHIP に設定されていなければなりません。統合ブローカーからコネクターに、階層ビジネス・オブジェクトが Create、Delete、または Update 要求とともに送信された場合、コネクターは所有関係にない単一カーディナリティーの子を無視します。コネクターは、それらのビジネス・オブジェクトに対しては、検索のみを実行します。そのような単一カーディナリティーのビジネス・オブジェクトの検索に失敗した場合、コネクターはエラーを戻して処理を停止します。
所有権なしの関係を指定する方法については、単一カーディナリティーの子ビジネス・オブジェクトを表す属性を参照してください。外部キーの関係の指定については、属性の外部キーの指定を参照してください。
所有関係を伴わない包含関係は、静的索引表の使用を容易にするだけでなく、正規化データと非正規化データの同期も可能にします。
関係を NO_OWNERSHIP に設定すると、正規化アプリケーションから非正規化アプリケーションへの同期を行うときに、データを作成または変更することができます。例えば、正規化されたソース・アプリケーションで、A と B という 2 つの表にデータが格納されているとします。また、非正規化されている宛先アプリケーションでは、単一の表にすべてのデータが格納され、エンティティー A のそれぞれにエンティティー B のデータが重複して格納されているとします。
この例では、表 B のデータの変更をソース・アプリケーションから宛先アプリケーションに同期するには、表 B のデータが変更されるたびに表 A のイベントを起動する必要があります。さらに、表 B のデータは表 A に重複して格納されているので、表 A の行ごとに、表 B で変更されたデータが含まれるビジネス・オブジェクトを送信しなければなりません。
非正規化されているソース・アプリケーションから正規化されている宛先アプリケーションにデータを同期する場合、コネクターは、正規化されているアプリケーションに含まれる所有関係にないデータに関しては、作成、削除、または更新しません。
正規化されているアプリケーションにデータを同期する場合、コネクターは、所有関係にない単一カーディナリティーの子をすべて無視します。そのような子のデータを作成、除去、または変更するには、データを手動で処理する必要があります。
通常、子ビジネス・オブジェクトの配列を含むビジネス・オブジェクトには、関係を表すための属性が 1 つだけ含まれています。この属性のタイプは、子ビジネス・オブジェクトと同じタイプの配列です。親が複数の子を含むことができるようにするため、関係を設定する外部キーはそれぞれの子に保管されます。
したがって、どの子にも、親の基本キーを外部キーとして含む単純属性が 1 つ以上存在します。子には、親に含まれる基本キー属性と同数の外部キー属性が含まれます。
関係を設定する外部キーが子に保管されるので、親は、それぞれ、1 つ以上の子を持つことができます (子を持たないことも可能です)。
図 3 に複数カーディナリティー関係を示します。この例では、parentId が親ビジネス・オブジェクトの基本キーを格納するための単純属性であり、child[n] が子ビジネス・オブジェクトを表す属性です。
図 3. 複数カーディナリティー・ビジネス・オブジェクト関係
一部のアプリケーションでは、子エンティティーが 1 つだけ格納されていて、関係が親ではなくこの子エンティティーに保管されます。つまり、子には、親の基本キーに格納されている値と同一の値の外部キーが格納されます。
図 4 に、特別なタイプの単一カーディナリティー関係を示します。
図 4. 関係を子に格納している単一カーディナリティー・ビジネス・オブジェクト
このタイプの単一カーディナリティーの関係がアプリケーションで使用されるのは、子のデータが親から独立して存在しておらず、親を介してのみそのデータにアクセスできる場合です。このような子のデータは、複数の親によって所有されることはありません。また、子とその外部キー値の作成は、親とその基本キー値があらかじめ存在していなければ実行できません。
このようなアプリケーションに対応するため、コネクターでは、単一カーディナリティーの関係で子を含んでいるにもかかわらず (親ではなく) 子に関係を保管する階層ビジネス・オブジェクトも、サポートしています。
このような特殊な方法で親ビジネス・オブジェクトに単一カーディナリティーの子を含めるには、子が格納される属性のアプリケーション固有情報を指定するときに、CONTAINMENT パラメーターを含めないようにします。詳細については、単一カーディナリティーの子ビジネス・オブジェクトを表す属性を参照してください。
ラッパー・オブジェクトは、どのデータベース表またはビューにも対応しない最上位のビジネス・オブジェクトです。ラッパー・オブジェクトは、true の値を持つ最上位ビジネス・オブジェクト・プロパティー WRAPPER によって示されます。ラッパー・オブジェクトは関連のない子のコンテナーとして使用されるダミーの親です。ラッパー・オブジェクトの処理中、コネクターは最上位ビジネス・オブジェクトを無視し、子のみを処理します。ラッパー・オブジェクトには N のカーディナリティーを持つエンティティーまたは N-1 のカーディナリティーを持つエンティティー、あるいはその両方を含めることができます。
N のカーディナリティーを持つエンティティーは、最低でも 1 つの固有属性が基本キーとしてマークされ、最低でも 1 つの属性が外部キーとしてマークされている必要があります。この外部キーは、次に基本キーとしてラッパー・オブジェクトに追加されます。エンティティーの外部キーは、ここで追加されたラッパー・オブジェクトの基本キーを参照します。
N-1 のカーディナリティーを持つエンティティーの場合、基本キーは基本キーとしてマークされると同時に、ラッパーの基本キーを参照する外部キー (N-1 のエンティティーの基本キーと同じ) としてマークされる必要があります。