ユーザーがどの記事を読んだかを追跡する機能を実装しています。
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
インデックス作成では順序が重要です。
- 最も選択性の高いフィールド、つまり行数を最も早く絞り込むフィールドを先頭に配置します。
- インデックスは、その列を順番に使用する場合にのみ使用されます。最初から始めるつまり、 にインデックスを付けると、またはに対して
[:user_id, :article_id]
高速クエリを実行できますが、 に対しては実行できません。user_id
user_id AND article_id
article_id
移行add_index
ラインは次のようになります。
add_index :user_views, [:user_id, :article_id]
「ユニーク」オプションに関する質問
Railsでこれを行う簡単な方法は、次のようにvalidates
スコープ付きのモデルを使用することですuniqueness
(ドキュメンテーション):
validates :user, uniqueness: { scope: :article }