テーブルの結合とリレートについて
ほとんどのデータベース設計ガイドラインでは、1 つの大きなテーブルに必要なフィールドをすべて含めるのでなく、特定のトピックに焦点を絞った複数のテーブルにデータベースを整理することを奨励しています。複数のテーブルを使用すると、1 つのテーブルに情報が 1 つだけ格納されるため、データベースでの情報の重複を避けることができます。現在のテーブルに格納されていない情報が必要な場合は、2 つのテーブルをリンクすることができます。
たとえば、組織内の他の部署からデータを取得したり、市販のデータを購入したり、またはインターネットからデータをダウンロードすることがあります。この情報を dBASE、INFO、またはジオデータベース テーブルなどのテーブルに格納すると、データを地理フィーチャに関連付けてマップ上に表示することができます。
ArcGIS では、キーと呼ばれる共通のフィールドを通じて、あるテーブル内のレコードを別のテーブル内のレコードに関連付けることができます。これらの関連付けは、マップ内で一時的にテーブルを結合またはリレートする、より永続的な関連性を維持するリレーションシップ クラスをジオデータベースで作成するなど、さまざまな方法で行うことができます。たとえば、土地区画の所有情報のテーブルと土地区画レイヤは土地区画 ID フィールドを共有するため、これら 2 つを関連付けることができます。
2 つのテーブルを結合する際には共通のフィールドに基づいて、1 つのテーブルの属性をもう 1 つのテーブルに付加します。テーブルのリレートも、共通フィールドに基づいて 2 つのテーブル間のリレーションシップを定義しますが、1 つのテーブルの属性をもう 1 つのテーブルの属性に付加するのではなく、必要に応じて関連データにアクセスできるようにします。
テーブル内の属性の結合
一般に、結合する両方のテーブルに存在するフィールドの値に基づいて、データ テーブルをレイヤに結合します。フィールドの名前は同じでなくてもかまいませんが、データ タイプは同じでなければなりません。つまり、数値どうし、文字列どうしを結合します。結合は、ArcMap のレイヤを右クリックしてアクセスする [結合] ダイアログ ボックス、または [テーブル結合(Add Join)] ツールを使用して実行できます。
たとえば、都道府県別の人口変化率を示すデータが手元にあり、この情報を基にして人口増加マップを生成したいとします。人口データがデータベース内のテーブルに格納されていて、レイヤと共通のフィールドが存在する限りデータを地理フィーチャに結合し、追加フィールドのいずれかを使用して、レイヤのフィーチャのシンボル表示、ラベル付け、検索、または解析を行うことができます。
1 対 1 または多対 1 のリレーションシップ
ArcMap 内でテーブルを結合する際には、レイヤの属性テーブルと結合する情報が含まれたテーブルとの間で、1 対 1 または多対 1 のリレーションシップを確立します。次の例は、各都道府県とその都道府県の人口変化データとの 1 対 1 のリレーションシップを示しています。つまり、都道府県ごとに人口変化データが 1 つずつあります。
次に、多対 1 のリレーションシップの例を示します。各ポリゴンを土地利用タイプに従って分類するレイヤがあるとします。レイヤの属性テーブルは、土地利用コードを格納するだけです。各土地利用タイプの完全な説明は、別のテーブルに格納されています。これら 2 つのテーブルを結合すると、レイヤの属性テーブルにある複数のレコードが土地利用の説明テーブルにある同じレコードに結合されるため、多対 1 のリレーションシップが確立されます。マップの凡例を生成する際に、さらに説明テキストを使用することができます。
1 対多および多対多のリレーションシップ
1 対多または多対多のリレーションシップが存在するデータを使用する場合は、リレートまたはリレーションシップ クラスを使用して、データセット間のリレーションシップを確立します。ただし、このような状況で結合を作成することも可能です。このような場合に結合を作成すると、データ ソースに応じて、ツールとその他のレイヤ固有の設定の動作に違いが生じます。ジオデータベース データを使用して結合を作成する場合は、すべての一致するレコードが返されます。データベース以外のデータ(シェープファイルや dBASE テーブルなど)を使用して結合を作成する場合は、最初に一致したレコードのみが返されます。
つまり、ジオデータベース データを使用して 1:M または M:M の結合を作成しているときにレポートを生成すると、レポートには複数の(一致ごとに 1 つの)レコードが含まれます。複数の一致は、結合されたレイヤのシンボル表示、ラベリング、フィーチャの識別、グラフの生成、および [検索] または [ハイパーリンク] ツールの使用中に、結合フィールドを使用する場合にも発生します。結合されたレイヤをジオプロセシング ツールへの入力として使用しているか、エクスポート操作で使用している場合は、複数の一致レコードが使用されます。
1:M 結合の場合はいずれも、最初に一致したレコードのみが結合され、レイヤの属性テーブルに表示されます。
(空間)位置によるデータの結合
マップのレイアウト間で共通の属性フィールドが共有されていない場合、その属性フィールドを結合するには空間結合を使用します。空間結合はレイヤ内のフィーチャの位置に基づいて、2 つのレイヤの属性を結合します。
空間結合は、ArcMap のレイヤを右クリックしてアクセスする [結合] ダイアログ ボックス、または [空間結合(Spatial Join)] ツールを使用して実行できます。
空間結合では、次のいずれかの情報を見つけることができます。
- フィーチャに最も近い場所にある他のフィーチャ
- フィーチャ上にあるもの
- フィーチャと交差するもの
- 各ポリゴン内に含まれるポイントの数
位置による結合(空間結合)は、対象のレイヤ間の空間的な関連性を使用して、1 つのレイヤから別のレイヤにフィールドを付加します。属性結合やリレーションシップ クラスの結合とは異なり、空間結合は静的であり、結果を新しい出力レイヤに保存します。
空間結合の実行には、次に説明する 3 種類の関連付けのいずれかを使用することができます。
- 各フィーチャと、最も近くに位置する 1 つ以上のフィーチャとを結合する: この関連付けでは、最も近くに位置するフィーチャの属性を付加するか、最も近くに位置するフィーチャの数値属性の集約値(最小値、最大値など)を付加することができます。
- 各フィーチャと、そのフィーチャを包含するフィーチャとを結合する: この関連付けでは、各フィーチャの属性に、そのフィーチャを領域内に含むフィーチャの属性を付加します。この照合は、ポリゴン内に位置するポイント、または別のラインに完全に含まれる(つまり、重なり合う)ラインなどで発生します。
- 各フィーチャと、交差する 1 つ以上のフィーチャとを結合する: 上記の最近隣フィーチャの関連付けと同様に、交差する単一のフィーチャの属性、または交差する複数のフィーチャの数値属性の集約値を付加することができます。
結合ダイアログ ボックスでは、ポイント、ポリゴン、ラインの各組み合わせに対して、これらの関連付けのうち最もよく使用されるものだけを利用することができます。ただし、VBA を使用する場合は、任意の関連付けに基づいて、ポイント、ライン、またはポリゴンの各フィーチャ レイヤを任意の組み合わせで結合することが可能です。
テーブルのリレート
テーブルの結合とは異なり、テーブルのリレートは、2 つのテーブル間のリレーションシップを定義するだけです。結合の場合とは異なり、関連データがレイヤの属性テーブルに付加されることはありません。レイヤの属性を操作する際に、関連データにアクセスできます。
たとえば、建物を選択する場合、その建物のテナントをすべて検出することができます。同様に、テナントを選択すると、そのテナントが属する建物(複数のショッピング センターのチェーン店、つまり多対多のリレーションシップの場合は、複数の建物)を検出することができます。ただし、このようなデータで結合を実行すると、各建物に属する最初のテナントだけが検出され、その他のテナントは無視されます。
ArcMap で定義されるリレートは、ジオデータベースで定義される単純なリレーションシップ クラスと基本的に同じですが、ジオデータベースではなくマップとともに保存されます。
データがジオデータベースに格納され、リレーションシップ クラスが定義されている場合は、ArcMap でリレートを確立しなくても、それらを直接使用することができます。リレーションシップ クラスは、リレーションシップ クラスに属するレイヤをマップに追加すると、自動的に利用できるようになります。多対多のリレーションシップは、データをジオデータベースに格納する際に個別に定義されることに注意してください。一般に、ジオデータベースで定義されたリレーションシップ クラスがある場合は、ArcMap で新しいリレーションシップ クラスを作成せずに、それらを使用してください。
ジオデータベース内のリレーションシップ クラス
リレーションシップ クラスは、ジオデータベース内のフィーチャとレコードの関連付けに関する情報を格納し、データの整合性を維持するのに役立ちます。
結合とリレート
データを結合するかリレートするかを選択する際には、次の原則に従います。
- テーブル内のデータが 1 対 1 または多対 1 の関係にある場合は、2 つのテーブルを結合します。
- テーブル内のデータが 1 対多または多対多の関係にある場合は、2 つのテーブルをリレートします。
結合とリレートの保存
結合やリレートが含まれたマップを保存すると、ArcMap はリンクされたデータ自体ではなく、2 つの属性テーブルのリンク方法の定義を保存します。次回マップを開いたときに、ArcMap がデータベースからテーブルを読み取り、(結合かリレートかに関係なく)テーブル間のリレーションシップを再確立します。このため、マップを最後に表示した後にソース テーブルに行われた変更はすべて、マップに自動的に追加され、反映されます。
結合は、ArcMap ドキュメントまたはレイヤ ファイルに格納することができます。何らかの時点でデータを移動する場合は、ArcMap ドキュメントを相対パスで保存してください。データを移動する場合は、ドキュメントを開いた後にテーブルやレイヤを修復することが可能ですが、ターゲット テーブルと結合テーブルが同じディレクトリまたはワークスペースに存在しない場合、結合は修復されません。ドキュメントを相対パスで保存すると、データの移動先を基準にドキュメントが移動されていれば、テーブルおよびレイヤは結合とともに自動的に復元されます。
レイヤをエクスポートするだけで、結合データを持つレイヤの永続的なディスク コピーを作成することができます。レイヤをエクスポートするには、コンテンツ ウィンドウでレイヤを右クリックし、[データ] → [データのエクスポート] の順にクリックします。これにより、結合フィールドを含めすべての属性を持つ新しいフィーチャクラスが作成されます。
結合、リレート、およびリレーションシップ クラスの同時使用
データが結合とリレートの両方に関与する場合は、結合とリレートが作成される順序が重要になります。リレートを持つレイヤまたはテーブルにデータを結合すると、リレートが削除されます。結合されたレイヤまたはテーブルをリレートすると、結合を削除したときにリレートも削除されます。原則として、結合を作成した後にリレートを追加することが推奨されます。
テーブル A を結合し、テーブル B とレイヤ C をリレートする場合は、3 つの方法のうちの 2 つがうまくいきます。次に、それぞれのケースについて説明します。
- テーブル A をレイヤ C に結合した後、テーブル B をレイヤ C にリレートします。この方法はうまくいきます。テーブル B へのリレートを持つ、結合されたレイヤが作成されます。
- レイヤ C をテーブル B にリレートした後、テーブル A をレイヤ C に結合します。この方法もうまくいきます。リレートは双方向に作用するため、リレートに関与するテーブルは、リレートがどちらのテーブルに含まれていても、どちらもリレートを使用することができます。このケースでは、リレートはテーブル B に含まれているため、テーブル A をレイヤ C に結合したときにリレートは削除されません。
- テーブル B をレイヤ C にリレートした後、テーブル A をレイヤ C に結合します。この方法はうまくいきません。これは、リレートがレイヤ C に含まれる先のケースとは異なります。このため、テーブル A をレイヤ C に結合すると、リレートが削除されます。
結合テーブルに含まれているリレートは、結合による影響を受けません。ただし、これらのリレートにターゲット テーブルまたはレイヤからアクセスすることはできません。
リレーションシップ クラスが結合または結合解除の結果として削除されることはありません。リレーションシップ クラスはデータが結合またはリレートに関与しているかどうかに関係なく使用することができます。