ERD設計における1対1リレーションシップ
ER図で1対1(1:1)リレーションシップをモデリングする方法。テーブル分割のタイミング、UNIQUE制約付き外部キーの配置、実際の例を解説します。
Relationship Types
詳細な説明
1つのレコードが正確に1つの他のレコードとペアになる場合
1対1(1:1)リレーションシップは、テーブルAの各レコードがテーブルBの最大1つのレコードと関連付けられ、その逆も同様であることを意味します。1対多より少ないですが、特定の設計シナリオで重要です。
なぜ2つのテーブルに分割するのか?
「1対1なら、なぜすべてを1つのテーブルに入れないのか?」と思うかもしれません。いくつかの正当な理由があります:
- パフォーマンス: アクセス頻度の低いカラム(例:ユーザープロフィール詳細)を頻繁にアクセスされるカラム(例:ログイン情報)から分離
- セキュリティ: 機密データ(例:SSN、支払い情報)を異なるアクセス制御を持つ別テーブルに分離
- 任意データ: 関連データがすべてのレコードに存在しない場合(例:すべてのユーザーがプロフィールを持つわけではない)
- レガシー統合: 異なるシステムからのデータを統合する場合
実装
外部キーは「依存」テーブル(もう一方なしでは存在できないテーブル)に配置し、UNIQUE制約が必須です:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(320) NOT NULL UNIQUE
);
CREATE TABLE user_profiles (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
bio TEXT,
avatar_url VARCHAR(512),
FOREIGN KEY (user_id) REFERENCES users(id)
);
user_idのUNIQUE制約がプロフィール側の「1」を強制します。これがないと、リレーションシップは1対多になります(1人のユーザーが複数のプロフィールを持てる)。
代替パターン:共有主キー
もう1つのパターンは、両方のテーブルで同じ主キー値を使用します:
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY,
bio TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
ここでuser_idは主キーと外部キーの両方であり、厳密な1:1マッピングを保証します。
ERDエディタでの操作
両方のエンティティを作成し、それらの間に1対1リレーションシップを追加します。ダイアグラムはリレーションラインの両側に単線マーカーを表示し、1対多で使用されるクロウズフットとは視覚的に区別されます。
ユースケース
ユーザーアカウントに別のプロフィールテーブルが必要なシステムや、支払い詳細などの機密データをセキュリティ上の理由からメインエンティティから分離する必要がある場合を設計しています。1対1リレーションシップは、元のテーブルを変更せずに既存のスキーマを拡張する場合にも一般的です。