AとBの2つのオプションの間で投票できる機能をアプリケーションに追加するように求められました。これらの質問の表は非常に基本的です。データベース設計/ SQL最適化:WHERE <id>(何千ものID)
QUESTIONS
question_id (PK)
option_id_1(FK)
option_id_2(FK)
urgent (boolean)
たびにユーザーの投票、投票したユーザーは均等に単純なテーブルに格納されていること:
USER VOTES
vote_id (PK)
user_id (FK)
question_id (FK)
ユーザーは新しいものが複雑で要求したときに質問が表示される選択するためのアルゴリズム、私たちの目的のために、それはランダムであると仮定することができます。だから、問題?
各ユーザーは多くの質問に投票します。おそらく数百、おそらく数千ユーザーには既に投票した質問は表示されないようにする必要があります。私が考えることができると思う唯一の方法は、サーバーを忘れてしまいます。具体的には、のようなもの:
SELECT * from questions WHERE question_id NOT in (SELECT question_id from user_votes WHERE user_id = <user_id>) ORDER BY RAND() LIMIT 1.
[注:RAND()は、クエリでは、実際にはない - それはちょうどそこに少し複雑な(ORDER_BY)の代用として'S]
ので、それを念頭において多くのユーザーが何千もの質問ではなく、何千もの質問に投票することができました。また、質問をセットオーダーで提示することはできません。投票した質問をサーバーを倒すことなく除外する方法に関するアイディア
すべてのアドバイスをいただきありがとうございます。
RAND()は潜在的に大きなパフォーマンスの落とし穴です。ちょうどFYI –
Cheers simonです。 rand()はデモンストレーションのためだけにそこにあり、order_by [フィールドの束]です。上記で編集されました。 – PlankTon
RAND()が特定の基準を見るのとは違っているのを見て:) –