データベースのテーブル設計において大事なことは、「正規化」という考え方に基き、テーブルを適切に分割することです。そして、そのテーブルを活用するためには、テーブル同士を関連付ける必要があります。
Accessでは、分割したテーブル同士を関連付けることを「リレーションシップ」、その設定画面を「リレーションシップオブジェクト」といいますが、今回の記事ではリレーションシップオブジェクトの具体的な操作手順等について解説します。
使用するサンプルテーブルは次の4つのテーブルです。
- 社員管理テーブル
- 資格取得管理テーブル
- 資格マスタテーブル
- 組織マスタテーブル
※今回の記事は下記の続きとなりますので、併せてご参照いただければ幸いです。
リレーションシップの概要
リレーションシップとは
まず一般的に「リレーション」という言葉があります。意味は「関係」とか「関連」、「つながり」といった感じです。Accessにはテーブルをリレーションする手段に「クエリ」と「リレーションシップ」があります。
| クエリ | クエリのデザインビューでテーブル同士を結合して表示等を行う |
| リレーションシップ | リレーションシップオブジェクト画面で、テーブル同士の結合を行う ただし、データ表示はクエリで行う |
この記事をご覧になっている方の中には、普通にクエリでテーブルを結合すれば、一つのテーブルのようにデータを活用できるので、それで十分では?という意見もあると思います。確かに、それはごもっともな意見です。ですが、リレーションシップを設定することは、クエリだけでは得られない数々のメリットがあります。
リレーションシップのメリット
リレーションシップのメリットを5点ピックアップします。
- データの整合性を維持する
- データベース構造の明確化
- データ入力・更新時の効率化
- クエリ作成の簡略化
- 連鎖更新・連鎖削除の利用
データの整合性を維持する
リレーションシップの機能の一つに「参照整合性」というものがあります。これは結合したテーブル間でデータの矛盾が生じないようにする機能で、リレーションシップを代表するメリットです。クエリの結合だけでは、データの整合性を自動的にチェックするようなことはできません。詳しくは後の項目で説明します。
連鎖更新・連鎖削除の利用
こちらもデータの整合性を維持する機能の一つですが、親テーブルのレコードが更新または削除された際に、関連する子テーブルのレコードも自動的に更新または削除することができます。例えば「売上テーブル」と「明細テーブル」のように、一体的に管理するテーブルの場合、手動で更新や削除を行うことなく、自動で整合性を担保してくれます。クエリではこのようなことはできません。詳しくは後の項目で説明します。
データベース構造の明確化
テーブル間を関連付けている様子は、リレーションシップオブジェクトの設定画面で視覚的に確認することができます。これにより、例えば複数人のチームでシステムの開発作業を行っている場合や、保守作業を後任に引き継ぐ場合に、データベースの設計意図や構造を伝えるのに役立ちます。クエリはあくまで一時的なデータ抽出の定義であり、データベース全体の構造を示すものではありません。

クエリ作成の簡略化
リレーションシップが設定されていると、クエリを作成する際に、自動的にテーブル間の結合を行ってくれます。
サブフォーム作成の簡略化
リレーションシップが設定されていると、フォームウィザードにより、自動的にサブフォームを作成することができます。サブフォームは手動で作成することもできますが、割とややこしい部分もありますので、こちらは大きなメリットだと思います。
リレーションシップを設定する手順
それでは、具体的な設定手順を説明していきます。
リレーションシップオブジェクトにテーブルを追加する
メニュー「データベースツール」→「リレーションシップ」をクリックし、リレーションシップの設定画面を開きます。

次に結合する対象のテーブルを範囲指定し、まとめて設定画面にドラッグ&ドロップします。(設定画面で右クリックし「テーブルの表示」から追加することもできます。)

テーブルが追加されました。今回はこの4つのテーブルを関連付けていきましょう。
結合線を結ぶ
テーブル間の結合は基本的に主キー(鍵マークが付いたフィールド)同士を結びます。まずは「T_資格取得管理」と「M_組織マスタ」の『資格CD』同士を結んでみましょう。

こういった場面で作業をしやすくするためにも、テーブル間でフィールド名を同名に統一することは重要です
結び方は、フィールド同士をマウスでドラッグします。そうすると以下の画面が表示されますので、「参照整合性」にチェックをし、「作成ボタン」をクリックします。
画面上の設定項目である「参照整合性制約」(参照整合性含むチェックボックス群)と「リレーションシップの種類」に関しては後述で詳しく説明します。

下図のとおり、テーブル間が結合されました。

この要領で他のフィールドも結合していきましょう。
結合するフィールドは基本的に主キー同士ですが例外もあります。結合先テーブル「M_組織マスタ」の主キー「部署CD」に対して、結合元の「T_社員管理」の「部署ID」は主キーではありません。こうした、他のテーブルの主キーと結合するフィールドを「外部キー」といいます。
こちらが全てのテーブルについて結合を行った状態です。

リレーションシップ自体はこれで完了です。
最後にリレーションシップを設定したテーブルのデータを表示するために、クエリを作成しましょう。
クエリを作成する
メニュー「作成」→「クエリデザイン」をクリックし、クエリのデザインビューを開きます。

自動的にテーブル一覧が表示されますので、デザインビューのフィールドリストへテーブルをドラッグして追加します。

すると、テーブル間の結合を行われている状態でテーブルが追加されました!これが前述「リレーションシップのメリット」で説明した「クエリ作成の簡略化」です。

あとは、デザイングリッドに表示するフィールドを設定すれば完了です。データシートビューに切り替えて、データを確認してみましょう。

ここまでが、リレーションシップの設定から、クエリによるデータ表示です。
補足解説
前述で別途説明としていた「参照整合性制約」と「リレーションシッの種類」について以下で説明します
参照性整合性制約
「参照整合性」「連鎖更新」「連鎖削除」は、テーブル間のデータ整合性を担保するための仕組みです。これらの機能こそがリレーションシップを行う主な目的といえます。
参照整合性
関連するテーブル間でデータの整合性を維持するための仕組です。
例えば、新しい資格取得のデータを新規入力する際、「M_資格マスタ」に現在登録されていない資格CDを入力しようとすると、こんな感じ↓でエラーになります。

リレーションシップを設定することにより、Access側はテーブル内データのあるべき姿を把握しているので、整合性が取れていないと、こうしてエラーとなるわけです。「参照性整合性」は通常は必ずチェックを入れます。
連鎖更新
「参照整合性」にチェックを付けた状態で、「フィールドの連鎖更新」をチェックすると、親テーブル(主キーを持つテーブル)の主キーの値が変更された場合に、子テーブル(外部キーを持つテーブル)の対応する外部キーの値を自動的に更新する機能です。例えば、「M_組織マスタ」の「組織CD」を変更した場合、「T_社員管理」の「組織CD」も自動的に変更されます。
連鎖削除
「参照整合性」にチェックを付けた状態で、「フィールドの連鎖削除」をチェックすると、親テーブルのレコードが削除された場合に、子テーブルの対応するレコードを自動的に削除する機能です。例えば、「M_組織マスタ」のあるレコードを削除した場合、その値を格納している「T_資格取得管理」のレコードも自動的に削除されます。
データの整合性を図る仕組みではありますが、意図しないデータの削除を引き起こす可能性があるため、チェックするかどうかは慎重に検討する必要があります。
リレーションシップの種類
リレーションシップの種類には「一対一」「一対多」「多対多」の3種類があります。テーブルの主キー設定状況等を元にAccess側が自動的に判定してくれますが、基本的なところは押さえておきましょう。
一対一
結合しているテーブルの両方とも、一意のデータを格納している場合は「一対一」の関係となります。
例えば、製品テーブル (製品ID, 製品名, 価格…)、製品仕様テーブル (製品ID, サイズ, 重量, 材質…)のように、特定の情報だけを別のテーブルに分割して管理する場合などに使用します。
一対多
一方のテーブルは一意のレコードに対して、一方は複数のレコードに関連付いている場合は「一対多」となります。
本記事のサンプルで用いているリレーションシップは、すべて一対多の関係です。これは「T_資格取得管理」が複合主キーであるため、他のマスターテーブルから見ると「多」のレコードとなるからです。
多対多
両方のテーブルの複数のレコードが、互いに複数のレコードに関連付けられている場合は「多対多」となります。
ただし、「多対多」の場合は2つのテーブルの間に結合テーブルと呼ばれる中間テーブルを使用して、二つのテーブル間に一対多のリレーションシップを二つ作成することで、多対多の関係を実現します
リレーションシップの削除方法
最後にリレーションシップの削除方法をご紹介します。
実は、リレーションシップオブジェクト画面に並んでいるテーブルをDELETEキーで削除すると画面上から消えますが、リレーションシップ自体は解除されません。右クリックの表示メニュー「すべてのリレーションシップの表示」をクリックすると、再度関連付けたテーブルが表示されます。

リレーションシップを削除する場合は、結合線上を右クリックして表示されるメニューから「削除」を選択してください。

まとめ
正規化により分割したテーブル同士を関連付ける機能である、「リレーションシップ」について、概要と設定方法を解説しました。
データの矛盾がないデータベースは、業務視点からみると、とても信頼があり仕事もしやすくなります。そういった観点からもリレーションシップを活用して、データの整合性を維持していきましょう。



