13

「Votes」と呼ばれるポリモーフィックテーブルがあり、AnswersとQuestionsからの投票があります。

投票

user_id     voteable_id    voteable_type      value

   1             2            Answer            1
   2             2            Answer            1

この場合、id=2の回答には2票があります。

問題は、このテーブルにインデックスを付ける方法です。

最初のアプローチ:

add_index :votes, [:voteable_id, :voteable_type]

重複するキー値は一意の制約に違反するため、これは機能しません

2番目のアプローチ:

 add_index :votes, :voteable_id, 
 add_index :votes, :voteable_type

これは、idとtypeの複合クエリが同時に発生するため、パフォーマンスはそれほど高くないと思います。

3番目のアプローチ:

add_index :votes, [:user_id, :voteable_id, :voteable_type]

これは最後のものは良いものですか?3つの列のインデックスが多すぎませんか?

ありがとう

4

1 に答える 1

39

あなたの最初のアプローチは正しいものです

add_index :votes, [:voteable_id, :voteable_type]

追加しない限り、:unique => trueそれは一意ではありません。また、それを一意にするべきではありません。これにより、投票ごとに1票しか投票できなくなります。Tashosがコメントで述べているように

3番目のアプローチも機能します。ここではunique制約を使用できるため、すべてのユーザーが投票できるのは投票ごとに1回だけです。

于 2012-11-20T16:47:52.243 に答える