ArcMap でのリレーションシップの編集について
このトピックは、ArcGIS for Desktop Standard および ArcGIS for Desktop Advanced にのみ該当します。
リレーションシップについて
リレーションシップ クラスを使用すると、ジオデータベースでオブジェクト間のアソシエーション(関連)を維持することができます。これらのリレーションシップは、シンプルで受動的、あるいはコンポジットです。コンポジット リレーションシップは、親子のリレーションシップ、つまり複合的な関係を意味するため、リレーションシップの一方のオブジェクトを変更すると、もう一方のオブジェクトへの振舞いが引き起こされます。ジオデータベースのフィーチャリンク アノテーションには、コンポジット リレーションシップが使用されます。
リレーションシップ クラスのリレーションシップは、主キーと外部キーを使用して、リレーションシップ クラスのいずれの側のオブジェクト クラスにも格納することができます。また、多対多のリレーションシップ クラスや属性リレーションシップ クラスでは、リレーションシップが別のテーブルに行として格納されます。
[属性] ウィンドウやテーブルを使用すると、選択したオブジェクトに関連するオブジェクトをすべて検出することができます。関連オブジェクトを選択したら、その属性を編集することができます。また、ArcMap の編集ツールを使用して、2 つのオブジェクト間のリレーションシップを削除したり、オブジェクト間に新規リレーションシップを作成することもできます。オブジェクトとリレーションシップをこのように編集すると、参照整合性がすべて維持されます。
リレーションシップの追加と削除
[属性] ウィンドウを使用して、2 つのオブジェクト間のリレーションシップを作成し削除することができます。リレーションシップを主キーと外部キー(1 対 1 または 1 対多の非属性リレーションシップ)で管理している場合は、関連先オブジェクトの外部キーに関連元オブジェクトの主キーの値が読み込まれます。2 つのオブジェクト間のリレーションシップを削除すると、関連先オブジェクトの外部キーの値は NULL に置換されます。関連先オブジェクトの外部キーには、NULL に設定できるフィールドがなければなりません。
リレーションシップ クラスが多対多のリレーションシップまたは属性リレーションシップである場合、リレーションシップはデータベース内の別のテーブルに格納されます。この種のリレーションシップ クラスで 2 つのオブジェクト間に新規リレーションシップを作成すると、そのテーブルに新しい行が追加されます。この新しい行には、関連元オブジェクトと関連先オブジェクトの主キーの値が読み込まれます。2 つのオブジェクト間のリレーションシップを削除すると、そのリレーションシップに対応する行がリレーションシップ テーブルから削除されます。
シンプル リレーションシップ クラスのオブジェクトの編集
他のオブジェクトとのリレーションシップに関与しているオブジェクトがジオデータベースから削除されると、そのリレーションシップもすべて削除されます。削除されるオブジェクトが関連元オブジェクトである場合、すべての関連先オブジェクトの外部キーは NULL に設定されます。関連先オブジェクトを削除した場合、関連元オブジェクトに影響はありません。
リレーションシップがリレーションシップ テーブルで行として維持されている場合(多対多リレーションシップや属性リレーションシップ)に関連元または関連先のオブジェクトとそのリレーションシップを削除すると、そのリレーションシップに対応する行はリレーションシップ テーブルから削除されます。
関連元フィーチャが削除されると、シンプル リレーションシップ クラスは外部キーを NULL に設定するため、リレーションシップの関連先クラスに孤立したオブジェクトが残ることがあります。これが可能なのは、シンプル リレーションシップ クラスは、関連オブジェクトをそれぞれ独立させることができるように設計されているためです。シンプル リレーションシップ クラスの孤立した関連先オブジェクトを特定するには、孤立した関連先オブジェクトを許さないようにリレーションシップ ルールを設定する必要があります。ルールを設定すると、[フィーチャの整合チェック] ツールを使用して、孤立した関連先オブジェクトを特定できます。
リレーションシップ ルールの詳細については、「リレーションシップ ルールの作成」をご参照ください。
関連オブジェクトの新規作成
ArcMap では、オブジェクトを選択した後、[属性] ダイアログ ボックスを使用して、関連クラスに非空間オブジェクトを新規作成することができます。この新規オブジェクトが作成されると、その属性すべてに適切なデフォルト値が読み込まれ、作成元のオブジェクトに対してリレーションシップが確立されます。この方法で作成できるのは非空間オブジェクトのみであり、新規フィーチャを作成することはできません。
リレーションシップが主キーと外部キーを使用して維持されている場合は、[属性] ダイアログ ボックスを使用して関連元オブジェクトと関連先オブジェクトのどちらが作成されたかにかかわらず、関連先オブジェクトの外部キーに関連元オブジェクトの主キーが読み込まれます。リレーションシップがリレーションシップ テーブルの行として維持されている場合(多対多リレーションシップや属性リレーションシップ)は、リレーションシップ クラスのテーブルに新しい行が追加されます。
次に、[属性] ウィンドウを使用して関連オブジェクトを新規作成する際、元のオブジェクトへのリレーションシップが作成される様子を示します。主キーと外部キーを使用してリレーションシップが維持される場合、関連先オブジェクトの外部キーには関連元オブジェクトの主キーが読み込まれます。
コンポジット リレーションシップ クラスのオブジェクトの編集
コンポジット リレーションシップには、特殊な振舞いがいくつかあります。コンポジット リレーションシップに関与しているオブジェクトを編集する場合、この振舞いが編集プロセスに影響を与えます。コンポジット リレーションシップの関連元オブジェクトに対する編集は、多くの場合、関連先オブジェクトにも直接の影響を与えます。この振舞いは、リレーションシップ クラスの情報伝達方向に依存する場合があります。
デフォルトで、コンポジット リレーションシップ クラスのメッセージングは正方向です。つまり、コンポジット リレーションシップの関連元オブジェクトを編集すると、関連先オブジェクトにメッセージが伝達されます。関連オブジェクトは、そのメッセージングに対して標準的な方法で応答します。関連先オブジェクトが非空間オブジェクトである場合、関連先オブジェクトは変化しません。しかし、関連先オブジェクトがフィーチャである場合に関連元オブジェクトを移動すると、関連先オブジェクトも同じ距離だけ移動します。関連元オブジェクトを回転させると、関連先オブジェクトは同じ角度だけ回転します。フィーチャのジオメトリの個々の頂点の編集は、フィーチャのジオメトリの移動ではなく更新と見なされます。この場合、関連オブジェクトは移動しません。
次の例では、青色の選択された電柱は関連元オブジェクト、緑色の変圧器は関連先オブジェクトです。
シンプル リレーションシップと同様に、コンポジット リレーションシップでもオブジェクトの削除時に参照整合性が維持されますが、その方法は異なります。コンポジット リレーションシップの関連元オブジェクトを削除すると、コンポジット リレーションシップを通じて関連付けられていたオブジェクトもすべて削除されます。このカスケード削除は、情報伝達方向が正方向、逆方向、両方向、なしのいずれに設定されている場合でも実行されます。
次に、コンポジット リレーションシップの関連元オブジェクトを削除すると、コンポジット リレーションシップを通じて関連付けられていた関連先オブジェクトもすべて削除される様子を示します。
関連先オブジェクトが削除されると、それと関連元オブジェクトの間のリレーションシップは削除されますが、関連元オブジェクト自体は削除も変更もされません。
コンポジット リレーションシップで関連元オブジェクトを削除すると、関連先オブジェクトは削除されますが、孤立した関連先オブジェクトは関連先クラスに残ります。これは、ジオデータベース モデルで、オブジェクト クラスがコンポジット リレーションシップの関連先である場合、そのオブジェクト クラスに新しいフィーチャを挿入できるためです。作成した関連先オブジェクトを関連元オブジェクトに関連付けなかった場合、[フィーチャの整合チェック] ツールを実行するとエラーが返されます。
フィーチャリンク アノテーションにより、個々のアノテーションとそのアノテーションが付与されるフィーチャとの間のリンクは、コンポジット リレーションシップとしてモデリングされます。リレーションシップの親(または関連元)は通常のフィーチャ、子(または関連先)は関連付けられたアノテーションです。
結合テーブルを使用してモデリングされた多対多リレーションシップがある場合は、[テーブルからリレーションシップ クラスを作成(Table To Relationship Class)] ツールを使用して、2 つの異なるテーブル間の値をリンクするテーブルを属性リレーションシップ クラスに変換することができます。
カスタム属性リレーションシップ クラスを ArcMap にテーブルとして追加することもできます。ArcMap に追加した後は、テーブルを開いて他のテーブルと同様に編集することができます。ただし、属性エディタを使用しない限り、[外部キー] フィールドを編集したり、新しい行を追加したりすることはできません。
リレーションシップに関与しているフィーチャの分割
1 つのジオデータベース フィーチャを 2 つの別個のフィーチャに分割すると、新しいフィーチャが 1 つ作成され、元のフィーチャは維持されます(ただし、ジオメトリは更新されます)。フィーチャが分割されると、大きいほうに元のフィーチャの ObjectID が維持され、小さいほうが新規フィーチャになります。分割されたフィーチャの大きさが等しい場合は、ラインの始点を持つフィーチャが元のフィーチャ(元の ObjectID)になり、もう一方が新規フィーチャになります。これは、分割するフィーチャに、データベース内の他のオブジェクトとのリレーションシップがあることを意味します。
シンプル リレーションシップでは、元のフィーチャが分割されると、元のフィーチャとそれに関連する関連先オブジェクトとの間のリレーションシップが削除されます。分割操作によって新規フィーチャが作成されると、元のフィーチャと新規フィーチャの両方が同じ主キーの値を持つため、両方とも関連先オブジェクトまたはフィーチャに関連付けられます。
コンポジット リレーションシップの場合は、振舞いが異なります。コンポジット リレーションシップでは、元のフィーチャが分割されると、そのコンポジット リレーションシップ クラスによって関連付けられたオブジェクトは削除されません。これは、元のフィーチャが削除されないためです。分割されるのは、元のフィーチャのジオメトリのみです。
シンプル リレーションシップかコンポジット リレーションシップのいずれかの関連先フィーチャを分割しても、元のフィーチャと関連する関連元オブジェクトとのリレーションシップは削除されません。関連元オブジェクトと、分割の結果から作成された新規フィーチャとの間に、新規リレーションシップが作成されます。
ここで説明したリレーションシップを持つオブジェクトを分割した場合の振舞いは、デフォルトの振舞いです。IFeatureClassEdit インタフェースを実装するクラス エクステンションを記述することにより、クラス レベルでこの振舞いを設定することができます。IFeatureClassEdit インタフェースには、CustomSplitPolicyForRelationship というプロパティがあります。これを使用すると、フィーチャを分割した場合のリレーションシップの処理方法を指定することができます。