12

さまざまなカテゴリのホームページを持つ Digg のような Web サイトを作成しています。最も人気のある投稿を表示したい。

私たちの評価システムは、単に「いいね」、「これが好き」などです。基本的には、時間ごとの「いいね」の数が最も多い投稿を表示したいと考えています。3 つのカテゴリが必要です: 史上最高の人気、先週、最終日です。

誰か助ける方法を知っていますか?これを実行して効率的にする方法がわかりません。ある種の cron ジョブを使用して 10 分ごとに実行し、過去 10 分間の「いいね!」の数を取得できると考えましたが、それはかなり非効率的だと言われました。

ヘルプ?

ありがとう!

4

5 に答える 5

9

通常、Digg や Reddit のようなサイトは、投票の時間ではなく、提出日までに更新されます。このように、単純な SQL クエリを実行するだけで、X 期間の上位の送信を見つけることができます。このメソッドを使用して、過去 24 時間で最も人気のある 10 個のリンクを検索する疑似クエリを次に示します。

select * from submissions
 where (current_time - post_time) < 86400
 order by score desc limit 10

基本的に、このクエリは、現在から投稿された時刻までの秒数が 86400 (UNIX 時間で 24 時間) 未満であるすべての送信を検索するように指示します。

X 時間間隔内で人気を本当に測定したい場合は、別のテーブルにすべての投票の投稿と時間を保存する必要があります。

create table votes (
 post foreign key references submissions(id),
 time datetime,
 vote integer); -- +1 for upvote, -1 for downvote

次に、次のように X 回と Y 回の間で最も人気のある投稿のリストを生成できます。

select sum(vote), post from votes
 where X < time and time < Y
 group by post
 order by sum(vote) desc limit 10;

ここからは、返された ID に関連付けられた投稿データを取得することから離れて、ホップ、スキップ、内部結合を行うだけです。

于 2009-06-22T04:27:42.530 に答える
3

適切な DB セットアップはありますか? CREATE TABLE詳細と指標について教えてください。適切なセットアップを想定すると、DB は必要なカウントを必要な速度で取得できるはずです。たとえば (使用している DB エンジンに多少依存するインデックスとキーのネット)、次の 2 つのテーブルが与えられます。

CREATE TABLE submissions (subid INT, when DATETIME, etc etc)
CREATE TABLE likes (subid INT, when DATETIME, etc etc)

これまでに人気の上位 33 作品を次のように取得できます。

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

一定の時間範囲内で投票されたもの

SELECT *, COUNT(likes.subid) AS score
FROM submissions
JOIN likes USING(subid)
WHERE likes.when BETWEEN initial_time AND final_time
GROUP BY submissions.subid
ORDER BY COUNT(likes.subid) DESC
LIMIT 33

「投票」(正または負) を に格納している場合はlikes、各エントリを としてカウントするのではなく、単に s の代わりに+1使用できます。SUM(likes.vote)COUNT

于 2009-06-22T04:34:43.517 に答える
0

alltime、lastweek のような安定したリストの場合、それらは非常に速く変更されると想定されていないため、有効期限が約 1 日以上のリストをキャッシュに保存する必要があると思います。

リアルタイムでの正確なカウントが気になる場合は、ページをキャッシュ内の最も低いページと比較することで、すべてのページ ビューで確認できます。

必要なのは、キャッシュと実際のデータベースの間の同期に注意することだけです。

テタンフン

于 2009-06-22T04:41:14.860 に答える
0

順序が現在の時間の関数であるクエリは、実際のパフォーマンスの問題になる可能性があります。カレンダーの時間ごとにバケット化し、人々が投票するたびに各バケットのスコアを更新できれば、物事ははるかに簡単になります。

于 2009-06-22T22:12:13.960 に答える
-1

nobody_ の回答を完了するには、ドキュメントを読むことをお勧めします(もちろん MySQL を使用している場合)。

于 2009-06-22T04:31:19.160 に答える