web-dev-qa-db-ja.com

インデックス:true vs foreign_key:true(Rails)

ガイドに従って、次のコマンドを実行しました。

Rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to

これにより、次の移行が作成されました。

class CreateSnippetsUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :snippets_users do |t|
      t.belongs_to :snippet, foreign_key: true
      t.belongs_to :user, foreign_key: true
    end
  end
end

過去に同じことを見たことがありますが、index: true の代わりに foreign_key: true。 2つの違いは何ですか?

15
Mirror318

インデックスは、データベーステーブルでのデータ取得操作の速度を向上させます。 index: trueを任意の列に書き込むと、この列にデータベースインデックスが追加されます。たとえば、私はテーブルを作成していました:

    create_table :appointments do |t|
      t.references :student, index: true 
    end

appointmentsテーブルにstudent_id列を作成します。

外部キーには異なるユースケースがあり、それはテーブル間の関係です。別のテーブルのインデックスに関連する1つのテーブルのインデックスを宣言し、いくつかの制約を課すことができます。データベースはこの関係のルールを適用して、参照整合性を維持します。たとえば、2つのテーブルprofileseducationsがあり、プロファイルには多くの教育がある場合があります。

create_table :educations do |t| 
  t.belongs_to :profile, index: true, foreign_key: true
end

これで、educationsテーブルの外部キーであるprofilesテーブルにprofile_id列ができました。 educationsテーブルに存在するprofile_id値が含まれていない限り、レコードはprofilesテーブルに入力されません。したがって、参照整合性は維持されます。

13