外部キーとは?
外部キー(Foreign Key, FK)は、一つのテーブルのカラムが別のテーブルの主キーを参照する制約です。外部キーはテーブル間のリレーションシップを定義し、参照整合性(Referential Integrity)を保証します。
ON DELETEオプション
- RESTRICT(デフォルト): 子レコードがあれば親の削除を拒否
- CASCADE: 親削除時に子も一緒に削除
- SET NULL: 親削除時に子のFKをNULLに変更
- NO ACTION: RESTRICTに類似、トランザクション終了時に検査
3種類のテーブルリレーション
1:1(一対一)リレーション
CREATE TABLE user_profiles (
user_id UUID PRIMARY KEY, -- FKかつPK(1:1を保証)
full_name VARCHAR(200),
bio TEXT,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
1:N(一対多)リレーション
CREATE TABLE orders (
id UUID PRIMARY KEY,
customer_id UUID NOT NULL, -- 1:NのN側にFK
total_amount DECIMAL(15, 2) NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE RESTRICT
);
CREATE INDEX idx_orders_customer ON orders(customer_id);
N:M(多対多)リレーション
中間テーブルを通じて実装します。
CREATE TABLE enrollments (
student_id UUID NOT NULL,
course_id UUID NOT NULL,
enrolled_at TIMESTAMPTZ DEFAULT NOW(),
grade VARCHAR(2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
);
自己参照リレーション
同じテーブル内のレコードが互いにリレーションを持つ場合です。
CREATE TABLE comments (
id UUID PRIMARY KEY,
post_id UUID NOT NULL,
parent_id UUID, -- NULLなら最上位コメント
content TEXT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
);
まとめ
外部キーとリレーション設計はデータベースの骨格を構成します。最初は複雑に見えますが、3つの基本リレーションパターン(1:1、1:N、N:M)を理解すれば、どんなドメインのデータもモデリングできます。