はじめに
RDBにおいて、データの整合性を保つための重要な仕組みである外部キー制約についてまとめてみました
外部キー制約とは?
外部キー制約(Foreign Key Constraint)は、テーブル間のリレーション(関連性)を保証するための仕組みです。具体的には、「親テーブルに存在しないデータを子テーブルが持つことが無いようにするための制約」です。
参照されるのが親テーブル、参照するのが子テーブルと呼ばれます
例えば、部署テーブル(親)と社員テーブル(子)があり、社員テーブルに部署IDのカラムがあった場合、存在しない部署IDで社員テーブルにデータを登録できないようになります。
外部キー制約のメリット
データの一貫性を強化
前述の通り子テーブルのデータが必ず親テーブルの有効なデータを参照するよう強制される
アプリケーションコードの簡略化
データベースが参照整合性を管理するため、アプリケーションでの検証コードが不要
データの削除や更新の安全性向上
親データの削除や更新時の動作を明確に設定できる
外部キー制約の動作
外部キー制約にはいくつか種類があります
-
ON DELETE CASCADE
親テーブルのデータ削除時に、子テーブルの関連データも自動的に削除。 -
ON DELETE SET NULL
親データ削除時に、子テーブルの該当カラムをNULLに設定。 -
RESTRICT
親データ削除時にエラーを発生させ、削除を禁止。 -
NO ACTION
親データ削除時に特定の動作を行わない(デフォルト動作)。
外部キー制約(ON DELETE CASCADE)サンプルコード
CREATE TABLE parent (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
); /* 外部キー制約(ON DELETE CASCADE)
外部キー制約を使用する際の注意点
以下の懸念から、あえて外部キー制約を設定しないという選択肢も生まれてきます。
パフォーマンスの低下
外部キー制約があると新しいレコードを入れたり既存のレコードを更新・削除する時に参照が正しいかどうかチェックするため、パフォーマンスが低下します。1レコードだけであれば大した低下は招かないと思いますが、大量データの挿入・更新だとかなり遅くなる可能性があります。
NULLの扱い
子テーブルの外部キーがNULLを許容する場合、参照整合性が崩れるリスクがあるため、基本的にはNULLを許容しない前提の設計がオススメです。ただドメインの特性上NULLを許容せざるを得ない場合もありますので、その場合は許容して良いかと思います。(NULLは悪ではない)
循環参照のリスク
親と子が互いに参照し合う状態が起きると、外部キー制約で何もできなくなります。(あまりないと思いますが
テーブル設計時に、循環参照が発生しないよう注意が必要。
まとめ
外部キー制約は、RDBでデータの整合性を保証するための仕組みです。適切に活用することで、信頼性の高いデータベース設計が可能になります。一方で、パフォーマンスやドメインの複雑さが原因で外部キー制約を使用しないという選択肢もあるので、これらを踏まえた上で適切に設計できると良さそうです。
読んでいただきありがとうございました!
参考記事