良いデータベース デザインの目的の 1 つはデータの重複 (重複データ) を取り除くことです。 この目的を達成するには、データを主題ごとの複数のテーブルに分割し、各情報が 1 回だけ表現されるようにします。 次に、分割した情報を一緒に取り出すための手段を Access に用意しますが、 このためには、関連する複数のテーブルに共通のフィールドを配置します。 ただし、この手順を正しく実行するためには、テーブル間のリレーションシップについて理解したうえで、データベースでテーブルのリレーションシップを指定する必要があります。
この記事の内容
概要
主題ごとのテーブルをデータベースに作成したら、それぞれの情報を必要に応じて一緒に取り出すための手段を Access に用意しておく必要があります。 そのためには、関連のある複数のテーブルに共通のフィールドを配置し、テーブル間にリレーションシップを定義します。 これにより、複数のテーブルからの情報を同時に表示するクエリ、フォーム、およびレポートを作成できるようになります。 たとえば、次に示すフォームには複数のテーブルから取得した情報が含まれています。
1. このフォームは、[得意先] テーブルと、
2. [受注] テーブル、
3. [商品] テーブル、
4. [受注明細] テーブルの情報を表示しています。
[得意先] ボックスの得意先名は [得意先] テーブルから、受注 ID と受注日の値は [受注] テーブルから、商品名は [商品] テーブルから、単価と数量の値は [受注明細] テーブルからそれぞれ取得されます。 これらのテーブルは、各テーブルの情報を一緒にフォームに取り込むために、さまざまな方法で相互にリンクしています。
前の例では、テーブルのフィールドを相互に連携させて、同じ受注に関する情報を表示できるようにする必要があります。 テーブルの連係は、テーブルのリレーションシップを使用して行われます。 テーブルのリレーションシップが機能するためには、"キー フィールド" (多くの場合、関連する両方のテーブルに存在する同じ名前のフィールド) のデータが一致している必要があります。 ほとんどの場合、このフィールドには、一方のテーブルの各レコードを一意に識別する "主キー" と、もう一方のテーブルの "外部キー" が使用されます。 たとえば、[社員 ID] フィールドを使用して [社員] テーブルと [受注] テーブル間にリレーションシップを設定し、社員の氏名とその社員が担当した受注を関連付けることができます。
1. EmployeeID は、一方のテーブルに主キーとして、
2. もう一方のテーブルに外部キーとして表示されます。
テーブル リレーションシップの種類
Access のテーブル リレーションシップは 3 種類あります。
-
一対多リレーションシップ
受注管理データベースに、[得意先] テーブルと [受注] テーブルがある例を考えます。 1 つの得意先へは、何件でも注文を発注できます。 この場合、[得意先] テーブルで表されている 1 つの得意先が、[受注] テーブルで表されている多数の受注に対応する可能性があります。 [得意先] テーブルと [受注] テーブルの間のリレーションシップは一対多リレーションシップになります。
データベース デザインで一対多リレーションシップを設定するには、一対多リレーションシップの "一" 側の主キーを "多" 側のテーブルにフィールドとして追加します。 前述の例では、[得意先] テーブルの [ID] フィールドを [得意先 ID] フィールドとして [受注] テーブルに追加します。 Access は、[受注] テーブルの得意先 ID を使用して、各受注の正しい得意先を特定します。
-
多対多リレーションシップ
[商品] テーブルと [受注] テーブルの間の関係を考えてみましょう。 1 つの注文には、複数の商品が含まれる可能性があります。 一方で、1 つの製品は、複数の注文に出現します。 つまり、[受注] テーブルの各レコードは [商品] テーブルの複数のレコードとなり得ます。 また、[商品] テーブルの各レコードは、[受注] テーブルの複数のレコードとなり得ます。 このリレーションシップは、多対多リレーションシップと呼ばれます。 2 つのテーブルの間に多対多リレーションシップが存在することを検出するには、リレーションシップの両側を考慮する必要があります。
多対多リレーションシップを設定するには、結合テーブルと呼ばれる 3 番目のテーブルを作成し、多対多リレーションシップを 2 つの一対多リレーションシップに分解します。 3 番目のテーブルには、2 つのテーブルの主キーをそれぞれ挿入します。 その結果、3 番目のテーブルには 2 つの一対多リレーションシップが設定されます。 たとえば、[受注] テーブルと [商品] テーブルの間には多対多リレーションシップがあり、これは、[受注明細] テーブルへの 2 つの一対多リレーションシップを作成して定義されます。 1 つの注文には、複数の商品が含まれる可能性があり、1 つの商品は複数の注文に含まれる可能性があります。
-
一対一リレーションシップ
一対一リレーションシップでは、最初のテーブルの各レコードは 2 番目のテーブルの 1 つのレコードに対応し、2 番目のテーブルの各レコードは最初のテーブルの 1 つのレコードに対応します。 このような方法で関連しているほとんどの情報は 1 つのテーブルに格納されるため、このようなリレーションシップは一般的ではありません。 多数のフィールドを持つテーブルを分割したり、主テーブルのサブセットのみに適用される情報を保存したりする場合、一対一リレーションシップを使用することがあります。 このリレーションシップを使用する場合は、両方のテーブルに同じフィールドが存在する必要があります。
テーブル リレーションシップを作成する理由
リレーションシップ ウィンドウを使用するか、[フィールド リスト] ウィンドウからフィールドをドラッグすることにより、テーブルのリレーションシップを明示的に作成できます。 Access では、1 つのデータベース オブジェクトで複数のテーブルを使用する必要がある場合に、テーブルのリレーションシップを使用してテーブルの結合方法を決定します。 いくつかの理由から、テーブルのリレーションシップは、フォーム、クエリ、レポートなどの他のデータベース オブジェクトより先に作成する必要があります。
-
テーブルのリレーションシップがクエリ デザインに反映される
多くの場合、複数のテーブルのレコードを操作するには、それらのテーブルを結合するクエリを作成する必要があります。 クエリは、最初のテーブルの主キー フィールドの値を 2 番目のテーブルの外部キー フィールドに対応させることにより機能します。 たとえば、各得意先のすべての注文を示す行を返すには、[得意先 ID] フィールドに基づいて [得意先] テーブルと [受注] テーブルを結合するクエリを作成します。 リレーションシップ ウィンドウでは、結合するフィールドを手動で指定できます。 ただし、2 つのテーブル間に既にリレーションシップが定義されている場合、Access では、既存のテーブルのリレーションシップに基づいて、既定の結合が行われます。 また、いずれかのクエリ ウィザードを使用する場合、Access では既に定義されているテーブルのリレーションシップに基づいて収集された情報を使用して選択肢が示され、適切な既定値を使用してプロパティの設定値が定義されます。
-
テーブルのリレーションシップがフォーム デザインとレポート デザインに反映される
フォームまたはレポートをデザインする場合、Access では既に定義されているテーブルのリレーションシップに基づいて収集された情報を使用して選択肢が示され、適切な既定値を使用してプロパティの設定値が定義されます。
-
テーブルのリレーションシップは参照整合性を適用するための基礎であり、データベースに孤立したレコードが発生するのを防ぎます。 孤立化したレコードとは、存在しない別のレコードを参照しているレコードのことで、 たとえば、存在しない得意先レコードを参照している受注レコードがこれに該当します。
データベースをデザインするときは、情報を複数のテーブルに分割し、各テーブルに主キーを設定します。 次に、これらの主キーを参照する外部キーを関連テーブルに追加します。 主キーと外部キーの組み合わせにより、テーブルのリレーションシップおよび、複数テーブルのクエリの基礎が形成されます。 これらの外部キーと主キーの参照の同期が保たれている必要があります。 テーブルのリレーションシップに依存する参照整合性は、参照を確実に同期しておくのに役立ちます。
参照整合性について
データベースをデザインする場合、データベースの情報を主題ごとの多数のテーブルに分割して、データの重複をできるだけ少なくします。 次に、関連のある複数のテーブルに共通のフィールドを配置することにより、分割した情報を一緒に取り出すための手段を Access に用意します。 たとえば、一対多リレーションシップを設定するには、"一" 側のテーブルの主キーを "多" 側のテーブルのフィールドとして追加します。 データを一緒に取り出すために、Access では "多" 側のテーブルの値から、"一" 側の対応する値が参照されます。 このようにして、"多" 側のテーブルの値は、"一" 側のテーブルの対応する値を参照します。
[運送会社] と [受注] の間に一対多リレーションシップが設定されているとします。 削除しようとしている運送会社の注文が [受注] テーブルにある場合、運送会社レコードを削除すると、この注文が "孤立" した状態になります。 注文には運送会社 ID が含まれていますが、参照先のレコードが存在しないため、この ID は有効ではなくなります。
参照整合性の目的は、参照の同期を保ち、このような孤立した状態が発生しないようにすることです。
参照整合性を適用するには、テーブルのリレーションシップで参照整合性を有効にします。 いったん有効にすると、Access ではテーブルのリレーションシップに設定した参照整合性に違反する操作はすべて拒否されるようになります。 つまり、Access では参照先を変更する更新操作と、参照先を削除する操作の両方が拒否されます。 [受注] テーブルに注文が存在する運送会社の主キーをどうしても変更しなければならない場合もあります。 このような場合は、Access で 1 回の操作で関連するすべての行が自動的に更新されるようにする必要があります。 この方法であれば更新が完全に完了するので、Access の中でデータベースに更新された行と更新されていない行が混在するような矛盾した状態になることはありません。 このため、 Access は [カスケード更新関連フィールド] オプションをサポートしています。 参照整合性を適用し、[フィールドの連鎖更新] オプションを有効にすると、Access では主キーを更新した場合に、その主キーを参照しているすべてのフィールドが自動的に更新されます。
また、1 つの行と関連するすべてのレコードをどうしても削除しなければならない場合があります (たとえば、特定の運送会社レコードとその運送会社に関連するすべてのレコードを削除する必要がある場合)。 このため、Access では、[フィールドの連鎖更新] オプションがサポートされています。 参照整合性を適用し、[フィールドの連鎖更新] を有効にすると、リレーションシップの主キー側のレコードを削除した場合、Access によってその主キーを参照しているすべてのレコードが削除されます。
テーブル リレーションシップを表示する
テーブル リレーションシップを表示するには、[データベース ツール] タブの [リレーションシップ] をクリックします。 リレーションシップ ウィンドウが開き、既存のリレーションシップが表示されます。 定義済みのテーブル リレーションシップがなく、リレーションシップ ウィンドウを初めて開いた場合は、テーブルまたはクエリをウィンドウに追加するよう求めるメッセージが Access によって表示されます。
リレーションシップ ウィンドウを開く
-
[ ファイル] をクリックし、[ 開く] をクリックし、データベースを選択して開きます。
-
[データベース ツール] タブの [リレーションシップ] グループで [リレーションシップ] をクリックします。
-
[ リレーションシップ デザイン] タブの [ リレーションシップ ] グループで、[ すべてのリレーションシップ] をクリックします。
これにより、データベースに定義されているすべてのリレーションシップが表示されます。 ただし、隠しテーブル (テーブルの [プロパティ] ダイアログ ボックスで [隠しオブジェクト] チェック ボックスがオンになっているテーブル) とそれらのリレーションシップは、[ナビゲーション オプション] ダイアログ ボックスで [隠しオブジェクトの表示] チェック ボックスをオンにしない限り表示されません。
テーブルのリレーションシップは、リレーションシップ ウィンドウで 2 つのテーブルの間に描画されたリレーションシップ ラインで表現されます。 参照整合性が適用されないリレーションシップは、リレーションシップの基礎となる共通のフィールドを結ぶ細線で表現されます。 リレーションシップ ラインをクリックしてリレーションシップを選択すると、リレーションシップが選択されていることを示すためにラインが太い線に変わります。 このリレーションシップに参照整合性を適用すると、ラインの両端が太く表示されます。 また、リレーションシップ ラインの "一" 側の太い部分の上に数字 "1" が表示され、ラインの反対側の太い部分の上には無限大記号 (∞) が表示されます。
リレーションシップ ウィンドウがアクティブなときは、リボンの次のコマンドから選択できます。
[ リレーションシップ デザイン ] タブの [ツール] グループで、次の 操作を行 います。
-
[リレーションシップ] [リレーションシップ] ダイアログ ボックスを開きます。 リレーションシップ ラインを選択したときは、[リレーションシップ] をクリックしてテーブルのリレーションシップを変更できます。 リレーションシップ ラインをダブルクリックすることもできます。
-
[レイアウトのクリア] リレーションシップ ウィンドウの表示からすべてのテーブルとリレーションシップが削除されます。 このコマンドは単にテーブルとリレーションシップを非表示にするだけであり、 削除するわけではありません。
-
[リレーションシップ レポート] データベースのテーブルとリレーションシップを表示するレポートが作成されます。 このレポートには、リレーションシップ ウィンドウで非表示になっていないテーブルとリレーションシップだけが表示されます。
[ リレーションシップ デザイン ] タブの [リレーションシップ] グループで、次の 操作 を行います。
-
テーブルの追加 [リレーションシップ] ウィンドウに表示するテーブルの選択を有効にします。
-
[テーブルを表示しない] 選択したテーブルがリレーションシップ ウィンドウで非表示になります。
-
[直接リレーションシップ] 選択したテーブルのすべてのリレーションシップおよび関連テーブルがリレーションシップ ウィンドウに表示されていない場合、これらが表示されます。
-
[すべてのリレーションシップ] データベースのすべてのリレーションシップおよび関連テーブルがリレーションシップ ウィンドウに表示されます。 ただし、隠しテーブル (テーブルの [プロパティ] ダイアログ ボックスで [隠しオブジェクト] チェック ボックスがオンになっているテーブル) とそれらのリレーションシップは、[ナビゲーション オプション] ダイアログ ボックスで [隠しオブジェクトの表示] チェック ボックスをオンにしない限り表示されません。
-
[終値] リレーションシップ ウィンドウを閉じます。 リレーションシップ ウィンドウのレイアウトを変更した場合は、変更を保存するかどうかの確認を求めるメッセージが表示されます。