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