ERD設計における1対多リレーションシップ

ER図で1対多(1:N)リレーションシップをモデリングする方法。外部キーの配置、クロウズフット記法、実際の例を解説します。

Relationship Types

詳細な説明

最も一般的なリレーションシップ

1対多(1:N)リレーションシップは、リレーショナルデータベースで最も頻繁に使用されるリレーションシップタイプです。あるテーブルの1つのレコードが別のテーブルの複数のレコードと関連付けられますが、2番目のテーブルの各レコードは最初のテーブルの正確に1つのレコードと関連付けられます。

仕組み

ユーザーと投稿を考えます。1人のユーザーは多くの投稿を書けますが、各投稿は正確に1人のユーザーによって書かれます。

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(255) NOT NULL
);

CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  user_id INT NOT NULL,
  title VARCHAR(255) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

外部キー(user_id)は「多」側のテーブル(posts)に配置されます。これが基本ルールです:外部キーは常に「多」側に配置する

1対多リレーションシップの識別

自分に問いかけてください:「1つのXは多くのYを持てるか?」答えがYesで、「1つのYは1つのXにのみ属するか?」もYesなら、1対多リレーションシップです。

「1」側 「多」側 外部キーの場所
departments employees employees.department_id
categories products products.category_id
authors books books.author_id
customers orders orders.customer_id

クロウズフットでの表現

ERDエディタでは、1対多リレーションシップは「1」側に単線、「多」側にクロウズフット(三又のフォーク)で表示されます。接続ラインにはラベル「one : many」が表示されます。

カスケード動作

1対多リレーションシップを設計する際、「1」側のレコードが削除された場合の動作を検討してください。一般的な戦略:

  • CASCADE: 関連するすべてのレコードを削除(例:ユーザー削除時にすべての投稿を削除)
  • SET NULL: 外部キーをNULLに設定(例:投稿は残すが著者を削除)
  • RESTRICT: 関連レコードが存在する場合は削除を防止

ユースケース

ブログシステム、ECプラットフォーム、または親レコードが複数の子レコードを所有するアプリケーションを設計している場合。1対多リレーションシップの理解はリレーショナルデータベース設計の基礎であり、最初にマスターすべきリレーションシップタイプです。

試してみる — ERD Editor

フルツールを開く