Ruby on Rails中多列的索引

我正在实现跟踪用户阅读的文章的function。

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表以查找两列,而不仅仅查找一列。 我的问题是我的索引应该是什么样子。 这些表的顺序是否存在差异,是否应该有更多选项或其他。 我的目标数据库是Postgres。

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

谢谢。

更新:
因为在两列中只能存在一行包含相同值的行(因为在知道user_id是否已读取article_id时),我应该考虑:unique选项吗? 如果我没弄错的话,这意味着我不必自己进行任何检查,只需在每次用户访问文章时插入即可。

订单在索引方面很重要。

  1. 首先放置最具选择性的字段,即最快缩小行数的字段。
  2. 仅当您从头开始按顺序使用其列时,才会使用该索引。 即如果您在[:user_id, :article_id]上建立索引,则可以对user_iduser_id AND article_id执行快速查询,但不能在article_id

您的迁移add_index行应如下所示:

 add_index :user_views, [:user_id, :article_id] 

关于“独特”选项的问题

在Rails中执行此操作的简单方法是在模型中使用带有作用域uniqueness validates ,如下所示( 文档 ):

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

只是关于检查validation时与索引的唯一性的警告:后者由数据库完成,而引物由模型完成。 由于可能同时运行模型的多个并发实例,因此validation受竞争条件的影响,这意味着在某些情况下它可能无法检测到重复(例如,在同一时间提交两次相同的表单)。