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_idemployees.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サイトの商品カテゴリ)、スレッドコメント(フォーラム、ソーシャルメディア)、または同じ種類のレコードが親子関係を形成するデータ構造をモデリングしている場合。

試してみる — ERD Editor

フルツールを開く