整合性を保つよ!
2つのテーブルの整合性を保つために用いられる工夫の一種だよ!
具体的に見ていこう👍
user_id
カラムでユーザー情報を格納する
例えばあるWebアプリに次のテーブルがあるとする。
- usersテーブル
- ユーザーを管理する
- postsテーブル
- ユーザーの投稿を管理する
注目すべきは、postsテーブルには「誰が投稿したか」が分かるようにuser_id
っていうカラムがあるところだ。
名前から推測できるように、このuser_id
にはユーザーのid
番号が入る。
中々良いアイデアだ。
誰が投稿したかを分かるように、postsテーブルに別のテーブル(今回で言うとusersテーブル)の情報を格納する。
ある投稿のuser_id
カラムが10だったときは、id
が10のユーザーが投稿したんだな、とこれで分かる。
存在しないユーザーのid
この設計には1つ問題が潜んでいる。
というか、余計なことができちゃう隙がある。
例えばそのアプリはユーザーが10人しかおらずid
が1-10までしかないのに、user_id
に例えば20が格納されてしまう可能性がある。
要は実在しないid
番号ががpostsテーブルのuser_id
に入る可能性がある(悪意のあるユーザーによって攻撃することができる)。
これを防ぐ仕組みが「外部キー制約」である。
外部キー制約で制限できるよ!
postsテーブルのuser_id
に外部キー制約をかけて連携対象をusersテーブルにする
すると、postsテーブルのuser_id
にはusersテーブルに存在するid
番号しか格納されないようになる。
外部のキーで制約するから、外部キー制約だよ!