Emi*_*äck 91 indexing database-design ruby-on-rails ruby-on-rails-3
我正在实现跟踪用户阅读的文章的功能.
create_table "article", :force => true do |t|
t.string "title"
t.text "content"
end
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的迁移:
create_table :user_views do |t|
t.integer :user_id
t.integer :article_id
end
Run Code Online (Sandbox Code Playgroud)
始终会查询user_views表以查找两列,而不仅仅查找一列.我的问题是我的索引应该是什么样子.这些表的顺序是否存在差异,是否应该有更多选项或其他.我的目标数据库是Postgres.
add_index(:user_views, [:article_id, :user_id])
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新:
因为只有一行在两列中都包含相同的值(因为在知道user_id是否读过article_id时),我应该考虑:unique选项吗?如果我没有弄错,那意味着我不必自己进行任何检查,只需在用户访问文章时插入即可.
ssc*_*rus 198
订单在索引中很重要.
[:user_id, :article_id],你可以在user_id或user_id AND article_id,但不是快速查询article_id.您的迁移add_index行应如下所示:
add_index :user_views, [:user_id, :article_id]
Run Code Online (Sandbox Code Playgroud)
在Rails中执行此操作的简单方法是validates在模型中使用作用域uniqueness如下(文档):
validates :user, uniqueness: { scope: :article }
Run Code Online (Sandbox Code Playgroud)
小智 21
只是关于检查验证时与索引的唯一性的警告:后者由数据库完成,而引物由模型完成.由于可能同时运行模型的多个并发实例,因此验证受竞争条件的影响,这意味着在某些情况下它可能无法检测到重复(例如,在同一时间提交两次相同的表单).
| 归档时间: |
|
| 查看次数: |
49911 次 |
| 最近记录: |