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対多リレーションシップの理解はリレーショナルデータベース設計の基礎であり、最初にマスターすべきリレーションシップタイプです。