0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

RDBにおいて、データの整合性を保つための重要な仕組みである外部キー制約についてまとめてみました

外部キー制約とは?

外部キー制約(Foreign Key Constraint)は、テーブル間のリレーション(関連性)を保証するための仕組みです。具体的には、「親テーブルに存在しないデータを子テーブルが持つことが無いようにするための制約」です。
参照されるのが親テーブル、参照するのが子テーブルと呼ばれます
例えば、部署テーブル(親)と社員テーブル(子)があり、社員テーブルに部署IDのカラムがあった場合、存在しない部署IDで社員テーブルにデータを登録できないようになります。

外部キー制約のメリット

データの一貫性を強化

前述の通り子テーブルのデータが必ず親テーブルの有効なデータを参照するよう強制される

アプリケーションコードの簡略化

データベースが参照整合性を管理するため、アプリケーションでの検証コードが不要

データの削除や更新の安全性向上

親データの削除や更新時の動作を明確に設定できる

外部キー制約の動作

外部キー制約にはいくつか種類があります

  • ON DELETE CASCADE
    親テーブルのデータ削除時に、子テーブルの関連データも自動的に削除。

  • ON DELETE SET NULL
    親データ削除時に、子テーブルの該当カラムをNULLに設定。

  • RESTRICT
    親データ削除時にエラーを発生させ、削除を禁止。

  • NO ACTION
    親データ削除時に特定の動作を行わない(デフォルト動作)。

外部キー制約(ON DELETE CASCADE)サンプルコード

sql
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でデータの整合性を保証するための仕組みです。適切に活用することで、信頼性の高いデータベース設計が可能になります。一方で、パフォーマンスやドメインの複雑さが原因で外部キー制約を使用しないという選択肢もあるので、これらを踏まえた上で適切に設計できると良さそうです。
読んでいただきありがとうございました!

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?