Ruby on Rails の複数列のインデックス作成 質問する

Ruby on Rails の複数列のインデックス作成 質問する

ユーザーがどの記事を読んだかを追跡する機能を実装しています。

  create_table "article", :force => true do |t|
    t.string   "title"
    t.text     "content"
  end

これまでの私の移行は次のとおりです。

create_table :user_views do |t|
  t.integer :user_id
  t.integer :article_id
end

user_views テーブルは常に両方の列を検索するようにクエリされ、1 つの列だけを検索することはありません。私の質問は、インデックスがどのようになるかということです。これらのテーブルの順序に違いはありますか。さらにオプションなどが必要ですか。私のターゲット DB は Postgres です。

add_index(:user_views, [:article_id, :user_id])

ありがとう。

更新:
両方の列に同じ値を含む行は 1 つしか存在できないため (user_id が article_id を読み取ったかどうかがわかるため)、:unique オプションを検討する必要がありますか? 間違っていなければ、自分で確認する必要はなく、ユーザーが記事にアクセスするたびに挿入するだけです。

ベストアンサー1

インデックス作成では順序が重要です。

  1. 最も選択性の高いフィールド、つまり行数を最も早く絞り込むフィールドを先頭に配置します。
  2. インデックスは、その列を順番に使用する場合にのみ使用されます。最初から始めるつまり、 にインデックスを付けると、またはに対して[:user_id, :article_id]高速クエリを実行できますが、 に対しては実行できません。user_iduser_id AND article_idarticle_id

移行add_indexラインは次のようになります。

add_index :user_views, [:user_id, :article_id]

「ユニーク」オプションに関する質問

Railsでこれを行う簡単な方法は、次のようにvalidatesスコープ付きのモデルを使用することですuniquenessドキュメンテーション):

validates :user, uniqueness: { scope: :article }

おすすめ記事