外部キー制約とインデックスについて
はじめに
フィヨルドブートキャンプの「ユーザーフォロー機能を実装しよう」を、調べながら進めようと思った矢先、最初の「Relationshipテーブルの作成」で、いくつかわからない単語が出てきたので調べた。
その忘備録。
「外部キー制約」と「インデックス」
外部キー制約
「外部キー制約」と一言で表すと、 データベースの参照整合性を担保する制約
外部キー制約をしておくことで、参照先のテーブルの値が変更になったら、それに合わせて変更したり等、データベース内で矛盾が生じないようにしてくれる。 (もし参照先テーブルにない値を入れようとしたり、参照されている値を削除したり等矛盾が生じることをしようとするとエラーになる。この辺の設定もできるがここでは割愛)
def change create_table :relationships do |t| t.references :user, foreign_key: true t.references :follow, foreign_key: { to_table: :users} t.timestamps end end
とすると、Relationshipsテーブルに、user_idカラムと、followカラムが生成され、かつ、両カラムに外部キー制約が付く。(followカラムはusersテーブルを参照するように設定される)
インデックス
テーブルを作成する時、カラムそれぞれに「インデックス」を付与することができる。 インデックスを付与すると、 付与されたカラムを内部で複製し、検索が行いやすいように準備される。
これによって、以下のメリットとデメリットが生じる。
- メリット → データの「読み込み・取得」が早くなる
- デメリット → データの「書き込み」に倍の時間がかかる
なので、全てのカラムに付ければ良いというわけではなく、以下のようなカラムに付与するのが望ましい。
多くのデータを格納するテーブルの、格納される値がそれぞれ異なるカラムでかつ、検索がよく行われるカラム