本ホームページでは、これまでにデータベース設計において、「正規化」の重要性について紹介をしてきました。詳しくは以下の記事を参照にしていただければと思いますが、正規化とはデータの重複を無くし効率的にデータを取得することを可能にするために、データを分割、整理することであり、リレーショナルデータベースを構築する上では必要不可欠な概念です。
実際にリレーショナルデータベースを構築する上では「リレーション」という考え方の理解が求められます。本記事では、「リレーション」の基本的な考え方について紹介をしていきますが、Accessを含む一般的なリレーショナルデータベースにおいて、テーブル リレーションシップには3種類存在しますので、これらがどのようなものなのかを一つずつ見ていきましょう。
一対多リレーションシップ
はじめに、「一対多」のリレーションシップを考えていきましょう。表1のような第1正規形のテーブルがあったとし、データの繰り返しを解消するために第2正規化を行うと、表2のように2つのテーブルに分割することができます(「T_購入」テーブル(上)と 「T_担当者」テーブル(下)とします。)。このとき、2つのテーブルは「担当者ID」フィールドでリレーションを設定することになります。
つまり、「担当者ID」フィールドで「T_購入」テーブルと「T_担当者」テーブルを連結させることで、表1を構築することができるのです。
ここで、1人の担当者は何件でも物品の購入ができるため、表2の「T_担当者」テーブルで表されている1人の担当者が表2の「T_購入」テーブルで表されている多数の購入を担当する可能性があります。したがって、これらテーブル間では一対多リレーションシップが成立し、概念としては図1のように示されます。
表1 第1正規形のテーブルのサンプル
担当者ID | 担当者 | 部署コード | 部署 | 購入品 | 数量 | 購入日 |
11AA | 鈴木 | Z0 | 営業 | えんぴつ | 10 | 2022/7/10 |
11AA | 鈴木 | Z0 | 営業 | ノート | 2 | 2022/7/10 |
11AA | 鈴木 | Z0 | 営業 | 消しゴム | 5 | 2022/7/15 |
12AB | 山下 | Z1 | 製造 | えんぴつ | 20 | 2022/7/1 |
13AC | 佐藤 | Z9 | 経理 | ノート | 5 | 2022/7/14 |
表2 第2正規形のテーブル(「T_購入」テーブル(上)と 「T_担当者」テーブル(下))
担当者ID | 購入品 | 数量 | 購入日 |
11AA | えんぴつ | 10 | 2022/7/10 |
11AA | ノート | 2 | 2022/7/10 |
11AA | 消しゴム | 5 | 2022/7/15 |
12AB | えんぴつ | 20 | 2022/7/1 |
13AC | ノート | 5 | 2022/7/14 |
担当者ID | 担当者 | 部署コード | 部署 |
11AA | 鈴木 | Z0 | 営業 |
12AB | 山下 | Z1 | 製造 |
13AC | 佐藤 | Z9 | 経理 |
Accessのデータベース デザインで一対多リレーションシップを設定するには、一対多リレーションシップの「一」側の主キーを「多」側のテーブルにフィールドとして追加します。前述の例では、「T_担当者」テーブルの「担当者ID」フィールドを「T_購入」テーブルの「担当者ID」フィールドに連携させます。
多対多リレーションシップ
図2に示すような「商品」テーブルと「注文」テーブルの2テーブルが存在するとします。このとき、注文側の視点から見ると1つの注文には複数の商品が含まれる可能性があります。一方で、商品側の視点から見ると1つの製品は複数の注文に出現する可能性があります。つまり、「注文」テーブルの各レコードは「商品」テーブルの複数のレコードとなり、「商品」テーブルの各レコードは「注文」テーブルの複数のレコードになることが考えられます。
このような場合に、「多対多」リレーションシップが成立し、2つのテーブルの間に「多対多」リレーションシップが存在することを検出するには、リレーションシップの両側を考慮する必要があります。
実際の多対多リレーションシップを設定するには、「結合テーブル」と呼ばれる3番目のテーブルを作成し、多対多リレーションシップを2つの一対多リレーションシップに分解します。3番目のテーブルには、2つのテーブルの主キーをそれぞれ挿入します。その結果、3番目のテーブルには2つの一対多リレーションシップが設定されます。
図3の場合、「商品」テーブルと「注文」テーブルを多対多リレーションシップ設定するために、3番目のテーブルとして「受注明細」テーブルなるものを作成します。そして、「受注明細」テーブルへの2つの一対多リレーションシップを作成することで、全体としては「商品」テーブルと「注文」テーブルの多対多リレーションシップが定義されます。
一対一リレーションシップ
一対一リレーションシップは、1つ目のテーブル中のある1つのレコードと2つ目のテーブルのある1つのレコードが対応するような場合に成立しますが、このような方法で関連しているほとんどの情報は1つのテーブルを用意することで役割を果たすことができます。このため、一対一リレーションシップは一般的ではありません。
多数のフィールドを持つテーブルを分割したり、主テーブルのサブセットのみに適用される情報を保存したりする場合、一対一リレーションシップを使用することがあります。このリレーションシップを使用する場合は、両方のテーブルに同じフィールドが存在する必要があります。一例を図4として示します。
まとめ
今回はリレーションについて基本的な考え方を紹介しました。
各テーブルで保存するデータと各テーブル間の関係性を考慮してリレーションを設定することは、適切なリレーショナルデータベースを構築する上での勘所となりますので、まずは本記事で基本的な事項を理解していただければと思います。
データベース設計について学習されたい方は専門書なども参考にされると良いかと思います。
スポンサーリンク
コメント