リレーションシップ管理

Java などのオブジェクト指向言語、およびリレーショナル・データベースは、 リレーションシップまたは関連をサポートします。リレーションシップは、オブジェクト参照または外部キーの使用を通して ストレージ量を削減します。

データ・グリッド内でリレーションシップを使用するときには、データはコンストレインド・ツリーに編成されている必要があります。そのツリーには 1 つのルート・タイプがなければならず、 すべての子は 1 つのルートのみに関連付けられていなければなりません。例: 部門には多数の従業員が属し、1 人の従業員が 多くのプロジェクトを持つことができます。しかし、1 つのプロジェクトが異なる部門に属している多くの従業員を 持つことはできません。 ルートが定義されると、ルート・オブジェクトとその子孫へのすべてのアクセスはルートを通して管理されるようになります。WebSphere® eXtreme Scale は、ルート・オブジェクトのキーのハッシュ・コードを使用して区画を選択します。以下に例を示します。

partition = (hashCode MOD numPartitions).

1 つのリレーションシップに関係するすべてのデータが単一のオブジェクト・インスタンスに 結びついている場合、ツリー全体を 1 つの区画内に配列し、1 つのトランザクションを使用して非常に効率的にアクセス することができます。データが複数のリレーションシップにまたがっている 場合は、複数の区画についての処理が必要になるため、追加のリモート呼び出しが必要 になり、結果的にパフォーマンス上のボトルネックとなることがあります。

参照データ

一部のリレーションシップは、ルックアップまたは参照データを 含んでいます。例: CountryName。ルックアップ・データまたは参照データの場合、データはすべての区画に存在していなければなりません。データはどのルート・キーでもアクセスでき、同じ結果が戻ります。このような参照データは、データが相当に静的なケースに限って使用するべきです。このデータを更新する際、すべての区画で更新する必要があるため、コストがかかる場合があります。参照データを最新に保つ手法として、DataGrid API がよく使われます。

正規化のコストと利点

リレーションシップを使用してデータを 正規化することは、データの重複が減るため、データ・グリッドによるメモリー使用量を削減するのに 寄与します。ただし、一般的には、 追加される関係データが多いほど、スケールアウト は少なくなります。データがグループ化されている場合、 リレーションシップを維持し、管理できる程度のサイズに保つために、より多くのコストがかかるようになります。グリッド は、ツリーのルートのキーに基づいてデータを区画に分けるので、ツリーのサイズは考慮には入れられません。したがって、1 つのツリー・インスタンスに 対して多数のリレーションシップがある場合、データ・グリッドは不平衡になり、結果的に 1 つの区画に他の区画よりも 多くのデータが入ってしまうことが起こりえます。

データが非正規化またはフラット化されて いる場合、通常であれば 2 つのオブジェクト間で共有されるデータが、 そうされずに複写され、各表は別々に区画化されるので、 より平衡したデータ・グリッドになります。 これは使用されるメモリー量を増やしますが、必要なデータがすべて入っている単一のデータ行に アクセスできるため、アプリケーションはスケーラブルになります。データ保守にかかるコストは 最近ますます高くなっているため、読み取り主体のグリッドにはこれは理想的です。

詳しくは、 XTP システムの分類およびスケーリングを参照してください。

データ・アクセス API を使用したリレーションシップ管理

ObjectMap API は、最も高速かつ柔軟で粒度の細かい データ・アクセス API であり、マップのグリッド内のデータにアクセスする手段として、トランザクションを使用する、セッション・ベースの方法を 提供します。ObjectMap API によって、クライアントは、 標準 CRUD (作成、読み取り、更新、および削除) 操作を使用して 分散データ・グリッド内のオブジェクトのキーと値のペアを管理することができます。

ObjectMap API を使用 するときには、オブジェクトのリレーションシップが、すべてのリレーションシップ の外部キーを親オブジェクトに埋め込むことによって表される必要があります。

以下に例を示します。

public class Department {
	Collection<String> employeeIds;
}

EntityManager API は、外部キーを含んでいるオブジェクトから永続データを 抽出することにより、リレーションシップ管理を単純にします。以下の例に示すように、オブジェクトが後でデータ・グリッドから取り出されるとき、 リレーションシップ・グラフは再構築されます。

@Entity
public class Department {
	Collection<String> employees;
}

EntityManager API は、JPA や Hibernate といった他の Java オブジェクト・パーシスタンス・テクノロジー (管理対象 Java オブジェクト・インスタンスのグラフはパーシスタント・ストア と同期化されます) にとてもよく似ています。このケースでは、パーシスタント・ストアは eXtreme Scale データ・グリッドであり、 そこでは、各エンティティーがマップとして表され、マップはオブジェクト・インスタンスではなくエンティティー・データを 含みます。