外部キー制約とインデックスについて

はじめに

フィヨルドブートキャンプの「ユーザーフォロー機能を実装しよう」を、調べながら進めようと思った矢先、最初の「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テーブルを参照するように設定される)

外部キーの概要と制約を使うことのメリット・デメリット - Qiita

インデックス

テーブルを作成する時、カラムそれぞれに「インデックス」を付与することができる。 インデックスを付与すると、 付与されたカラムを内部で複製し、検索が行いやすいように準備される。

これによって、以下のメリットとデメリットが生じる。

  • メリット → データの「読み込み・取得」が早くなる
  • デメリット → データの「書き込み」に倍の時間がかかる

なので、全てのカラムに付ければ良いというわけではなく、以下のようなカラムに付与するのが望ましい。

多くのデータを格納するテーブルの、格納される値がそれぞれ異なるカラムでかつ、検索がよく行われるカラム

データベースにindexを張る方法 - Qiita