1. ホーム
  2. ruby-on-rails

[解決済み] Ruby on Railsで複数カラムのインデックスを作成する。

2022-09-11 12:05:17

質問

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

  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 テーブルは常に両方のカラムを探すためにクエリされ、決して一方だけを探すことはありません。私の質問は、私のインデックスがどのように見えるべきかということです。これらのテーブルの順序に違いはありますか、それにいくつかのより多くのオプションがあるべきですか、または何か。私のターゲットDBはPostgresです。

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

ありがとうございます。

UPDATEです。

両方のカラムに同じ値を含む1つの行だけが存在することができるので(user_id HAS read article_idを知ることから)、私は :unique オプションを考慮すべきでしょうか?私が間違っていなければ、それは私が自分自身でチェックを行う必要がなく、ユーザーが記事を訪問するたびに挿入を行うだけでよいことを意味します。

どのように解決するのですか?

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

  1. 最も選択的なフィールド、つまり行数を最も速く絞り込むフィールドを最初に置く。
  2. インデックスは、そのカラムを順番に使用する限りにおいてのみ、使用されます。 から始まる ...すなわち、もしインデックスを [:user_id, :article_id] に対してインデックスを作成すれば、以下のような高速なクエリを実行できます。 user_id または user_id AND article_id には適用されませんが article_id .

マイグレーション add_index の行は次のようなものになるはずです。

add_index :user_views, [:user_id, :article_id]


unique」オプションに関する質問

Railsでこれを行う簡単な方法として validates をスコープとしたモデルで uniqueness を次のように指定します ( ドキュメント ):

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