データベース設計入門:多対多(Many-to-Many)の関係モデルの実装方法
多対多(Many-to-Many)の関係モデルとは
「商品販売」データベースでは、一人の顧客による注文に1つ以上の商品が含まれる一方で、同じ商品が複数の注文に現れることがあります。また「書店」データベースでは、1冊の本に1人以上の著者が関わり、逆に1人の著者は0冊以上の本を執筆します。
このように、両方向において複数のレコードが対応し合う関係を「多対多(many-to-many)」の関係と呼びます。
商品販売データベースを例に考えてみる
ここでは「商品販売」データベースを例に、多対多の関係をどのように実装するかを見ていきましょう。まず基本となるのは、次の2つのテーブルです。
- Products(商品)テーブル:商品名・説明文・在庫数(quantityInStock)などの商品情報を格納し、productID を主キーとします。
- Orders(注文)テーブル:customerID、dateOrdered(注文日)、dateRequired(希望納期)、status(状態)といった顧客の注文情報を格納します。
ここで問題になるのが、注文された商品(明細)の扱いです。Orders テーブルに注文明細を直接保存することはできません。1つの注文に何個の商品が含まれるかは事前に分からないため、必要な列の数をあらかじめ確保できないからです。もちろん、逆に Products テーブル側へ注文情報を持たせることもできません。
中間テーブル(ジャンクションテーブル)を作成する
多対多の関係を実現するには、3つ目のテーブル、いわゆる「中間テーブル(ジャンクションテーブル / junction table)」を作成します。ここでは例として OrderDetails(または OrderLines)という名前のテーブルを用意し、各行に「特定の注文における1つの商品明細」を表すレコードを格納します。
OrderDetails テーブルの主キーは orderID と productID の2列からなる複合主キーとし、この組み合わせによって各行を一意に識別できるようにします。さらに、orderID と productID の2列は、それぞれ Orders テーブルと Products テーブルへの参照として機能するため、同時に外部キー(foreign key)でもある点に注目してください。

多対多は「2つの1対多」の組み合わせである
実際のところ、多対多の関係は、中間テーブルを導入することで、2つの「1対多」の関係として実装されます。具体的には次のようになります。
- 1つの注文(Order)は、OrderDetails テーブル内に複数の明細を持ちます。逆に、各明細は必ず1つの特定の注文にのみ属します。
- 1つの商品(Product)は、OrderDetails テーブル内の複数の明細に現れることがあります。逆に、各明細は1つの商品のみを指定します。
この構造により、「注文」と「商品」という多対多の関係を、リレーショナルデータベースで自然かつ柔軟に扱うことができるのです。
-
ピボットテーブルのデータモデルで計算フィールド(メジャー)を作成する方法
ピボットテーブルのデータモデルで計算フィールドを作成したいとお考えの方に向けて、この記事では具体的な手順を詳しく解説します。計算フィールドの基本概念から、実際の作成・削除・数式確認の方法まで、実例を交えてわかりやすくご紹介します。 計算フィールドとは? 計算フィールド(Calculated Field)は、ピボットテーブルやピボットグラフに組み込める重要な機能で、「メジャー(Measure)」とも呼ばれます。計算フィールドはDAX数式を使用して作成されるフィールドです。ピボットテーブルの作成後に、元のデータセットにはない追加の指標(例:ボーナス額や利益率など)を計算したい場合に、この計算フィ
-
Excelでデータモデルを作成する3つの方法|リレーションシップ・Power Query・Power Pivot
データモデルは、Excelでのデータ分析に欠かせない機能です。データモデルを活用すると、テーブルなどのデータをExcelのメモリ上に読み込み、共通の列を基準に複数のデータ同士を関連付けることができます。各テーブル間のつながり(関係性)こそが、「データモデル」という言葉が示す「モデル」の正体です。Excelにはデータモデルを作成するための方法が複数用意されており、本記事では3つの異なるアプローチをわかりやすく解説します。 Excelでデータモデルを作成する3つの便利な方法 本記事では、Excelでデータモデルを作成する3つの実用的な手法をご紹介します。まず「リレーションシップ」ダイアログを使う