如何索引rails中的多态表而不是唯一的"association_type"和"association_id"

Luc*_*cas 11 ruby database polymorphism ruby-on-rails

我有一个名为"Votes"的多态表,其中有来自Answers和Questions的投票.

投票

user_id     voteable_id    voteable_type      value

   1             2            Answer            1
   2             2            Answer            1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,id = 2的答案有两票.

问题是:如何索引此表?

第一种方法:

add_index :votes, [:voteable_id, :voteable_type]
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为重复键值将违反唯一约束

第二种方法:

 add_index :votes, :voteable_id, 
 add_index :votes, :voteable_type
Run Code Online (Sandbox Code Playgroud)

由于同时对id和type进行复合查询,我认为这个性能不会太高.

第三种方法:

add_index :votes, [:user_id, :voteable_id, :voteable_type]
Run Code Online (Sandbox Code Playgroud)

这是最后一个好吗?是否有三列要编入索引?

谢谢

jig*_*fox 34

你的第一种方法是正确的

add_index :votes, [:voteable_id, :voteable_type]
Run Code Online (Sandbox Code Playgroud)

只要你不添加:unique => true它就不会是唯一的.而且你不应该让它独一无二,因为这将导致每个投票只能投一票.正如塔索斯在评论中所述.

第三种方法也可以,在这里你可以使用一个unique约束,所以每个用户只能投票一次.

  • 我知道这是旧的,但是 `add_index :votes, [:voteable_id, :voteable_type], :unique => true` 不会禁止对 id = 2 的 `Answer` 创建新投票吗?一旦有人对答案 2 进行投票,其他人就无法做同样的事情。您实际上正在寻找的是第三次迁移,这也将使用户不​​可能(因为它实际上是在数据库级别上)对答案进行双重投票。此外,如果您查询特定用户的投票,索引也会有所帮助。 (2认同)
  • 我认为索引 `add_index :votes, [:voteable_type, :voteable_id]` 更有意义、更高效。 (2认同)