Open5

DBのキー制約(外部キー, 複合主キー, ユニーク制約など)について

まさぴょんまさぴょん

外部キー(foreign key)制約について

リレーショナルデータベース(RDBMS)においては、データを参照される側と参照する側で親子関係が成り立っています。
参照される側の表を親テーブル(またはマスターテーブル)、参照する側の表を子テーブル(またはトランザクションテーブル)と呼びます。

RDBMSでは、外部キー制約(または参照整合性制約)という制約をつけることが出来ます。
外部キー制約は、表作成時に参照する側の表につけます。
また、参照先の列は、そのテーブルの主キーである必要があります。
これは主キーが重複を許さず、「NOT NULL」であるというルールがあるためです。

1対1の関係を確保するためには、子テーブル側の外部キーにユニーク制約を設ける必要があります。

通常、外部キー制約は子テーブルで定義します。
子テーブルの外部キー列が親テーブルの主キーや一意キーを参照することで、データの整合性を保つことができます。
これにより、子テーブルに入力されるデータが、必ず親テーブルの対応するレコードと一致することが保証されます。

https://dream-database-sql-seminar.com/mysql-basic-contents/mb_ch05/mb_0502/

https://zenn.dev/sudoukky/articles/598c85b1123bfe

https://wa3.i-3-i.info/word1992.html

まさぴょんまさぴょん

複合主キー制約と複合ユニーク制約の違い

ユースケースで複合ユニークキーが必要となる場合

複合ユニークキーが必要になるのは、組み合わせによって一意性を保証したい時に使います。

例えば:

  • 多対多の関係を管理する中間テーブルで、特定の2つのIDの組み合わせが一意であることを保証したい場合。
    • 例: ユーザーとロールの関係を管理する user_roles テーブルで、user_id と role_id の組み合わせにユニーク制約を設ける。
  • 同じ外部キーを持つ複数のレコードが存在し得るが、その組み合わせは一意でなければならない場合。

https://honobonolab.com/mysql-primary-unique/

まさぴょんまさぴょん

外部キーでインデックスが貼られるかどうか?

DBによって、外部キー制約を付与で、インデックスが自動で貼られるかどうかに差がある。

  • MySQL は、外部キー制約をつけたカラムにインデックスが貼られる
  • PostgreSQL は、明示的に宣言する必要がある

https://zenn.dev/awonosuke/articles/96b3d580860e4d