1

データベースからランク付けされたオブジェクト (ユーザーが投票した記事など) を選択する場合、どのように表示するのが最適ですか?

  • アイテムの現在のページ
  • アイテムごとのユーザーの評価 (投票した場合)

大まかなスキーマ:

articles: id, title, content, ...
user: id, username, ...
votes: id, user_id, article_id, vote_value

それはより良い/理想的ですか:

  1. アイテムの現在のページを選択する
  2. ユーザーの投票を選択し、「IN」句を含むアイテムのページに限定します

また

  1. アイテムの現在のページを選択し、ユーザー投票のテーブルから投票データを「結合」するだけです

または、まったく異なるものですか?

これは理論的にはトラフィックの多い環境で、mysql のような rdbms を使用しています。fwiw、私はこれを「時期尚早の最適化」ではなく「実行する前に考える」側に見ています。

ありがとう!

4

2 に答える 2

1

JOIN の方が高速です。データベースへの往復を節約できます。

ただし、実際にトラフィックが発生するまでは、これについてはまったく心配しません。多くの人が時期尚早の最適化に反対してきました。ランダムに引用します。

盲目的な愚かさを含む他の単一の理由よりも、効率の名の下に(必ずしもそれを達成する必要はありません)、より多くのコンピューティングの罪が犯されています。

于 2009-05-25T20:14:09.837 に答える
0

投票で注文する必要がある場合は、これを使用します。

SELECT  *
FROM    (
        SELECT  a.*, (
                SELECT  SUM(vote_value)
                FROM    votes v
                WHERE   v.article_id = a.id
                ) AS votes
        FROM    article a
        )
ORDER BY
        votes DESC
LIMIT 100, 110

これにより、単一のクエリで投票とページネーションがカウントされます。

ユーザー自身の投票のみを表示する場合は、次を使用しますLEFT JOIN

SELECT  a.*, vote_value
FROM    articles a
LEFT JOIN
        votes v
ON      v.user_id = @current_user
        AND v.article_id = a.id
ORDER BY
        a.timestamp DESC
LIMIT 100, 110

インデックスをオンに(vote_user, vote_item)すると、このクエリが大幅に改善されます。

(vote_user, vote_item)投票を行うことができることに注意してくださいPRIMARY KEY。これにより、このクエリがさらに改善されます。

于 2009-05-25T20:15:38.227 に答える