ERD設計における自己参照リレーションシップ
ER図で自己参照(再帰的)リレーションシップをモデリングする方法。社員-上司の階層、カテゴリツリー、コメントスレッドを解説します。
Relationship Types
詳細な説明
テーブルが自分自身を参照する場合
自己参照リレーションシップ(再帰的リレーションシップとも呼ばれる)は、テーブルの外部キーが同じテーブルの主キーを指す場合に発生します。これは単一のエンティティ内で階層的またはツリー状の構造をモデリングするために使用されます。
典型的な例:社員-上司
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
title VARCHAR(255),
manager_id INT,
FOREIGN KEY (manager_id) REFERENCES employees(id)
);
ここでmanager_idはemployees.idを参照します。CEOはmanager_id = NULL(上司なし)で、他のすべての社員は直属の上司を参照します。これによりツリー構造が作成されます:
CEO (manager_id = NULL)
├── VP Engineering (manager_id = 1)
│ ├── Tech Lead (manager_id = 2)
│ └── Tech Lead (manager_id = 2)
└── VP Sales (manager_id = 1)
└── Sales Rep (manager_id = 4)
他の自己参照パターン
カテゴリツリー:
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
コメントスレッド:
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
post_id INT NOT NULL,
parent_comment_id INT,
content TEXT NOT NULL,
FOREIGN KEY (parent_comment_id) REFERENCES comments(id)
);
ソーシャルネットワーク(フォロー):
CREATE TABLE user_follows (
follower_id INT NOT NULL,
following_id INT NOT NULL,
PRIMARY KEY (follower_id, following_id),
FOREIGN KEY (follower_id) REFERENCES users(id),
FOREIGN KEY (following_id) REFERENCES users(id)
);
ERDでの表現
ERDエディタでは、自己参照リレーションシップはエンティティから自分自身へのリレーションシップを作成してモデリングします。Fromカラム(例:manager_id)とToカラム(例:id)は両方とも同じエンティティに属します。リレーションラインはエンティティから自分自身に戻るループを形成します。
重要な考慮事項
- NullableなFK: 外部キーはルートノード(親なし)を許可するためにnullableでなければなりません
- 循環参照: サイクルを作成しないよう注意(社員AがBを管理し、BがAを管理する)
- クエリパフォーマンス: 深い階層には再帰クエリ(SQLの
WITH RECURSIVE)が必要な場合があります
ユースケース
組織階層(社員-上司)、カテゴリツリー(ECサイトの商品カテゴリ)、スレッドコメント(フォーラム、ソーシャルメディア)、または同じ種類のレコードが親子関係を形成するデータ構造をモデリングしている場合。