2

最近の 20 件の投稿と、各投稿の最新の 4 件のコメントを表示するためのさまざまなアプローチを分析しています。これは Facebook の壁のようなものですが、いいね、共有、その他はありません。

テーブル構造の例

投稿
  • p_id= その投稿の数
  • user_id= 投稿しているユーザー
  • poster_user_id= 投稿者
  • post
コメント
  • comment_id= そのコメントの数
  • post_id= コメントが関連する投稿の番号
  • commenter_user_id= そのコメントをしている人物
  • comment

アプローチが頭に浮かぶ

1) POST テーブルをクエリして、最近の 20 件の投稿を取得し、投稿 ID をデータベースに送信して、COMMENT テーブルからコメントを取得します。しかし、この合計呼び出しは

1(投稿)+20(コメント)=21 DBコール

2) POST と COMMENT テーブルを結合し、最近の 20 件の投稿のすべてのコメントを取得し、表示時に以前の POST_ID を確認し、同じ場合は投稿を表示せず、コメントのみを表示します。しかし、このアプローチ

多くの不要なデータを取得します

3) POSTテーブルをクエリし、最近の20件の投稿を取得し、投稿IDを取得し、コメントクエリを動的に構築します(以下の種類のクエリを作成するPHPで)

 SELECT comment FROM comments WHERE post_id=<1st latest_id> ORDER BY comment_id desc LIMIT 4
UNION ALL
 SELECT comment FROM comments WHERE post_id=<2nd latest_id> ORDER BY comment_id desc LIMIT 4
UNION ALL
 SELECT comment FROM comments WHERE post_id=<3rd latest_id> ORDER BY comment_id desc LIMIT 4
....................up to 20 

ここでは、

1(投稿)+1(コメント) = 2 つのデータベース呼び出し

このアプローチは問題ないように見えます

4) 3 番目の方法を使用して、結果を memcached に 1 分間または 30 秒間保存します。ユーザーがコメントまたは新しい投稿を行う場合は、jquery を使用して、ブラウザーで自分のエントリを更新します。彼が更新を押した場合、サーバーにフラグを送信してデータベースを再度クエリし、それらを memcached に保存します。

このアプローチでは、1 分間に 1 つまたは 2 つのデータベース呼び出ししか必要ありませんが、ユーザーは最近のものではなく、1 分前に投稿されたデータを取得します。これは、通常のフォーラムでは問題ありません。

5)毎分データベースにクエリを実行する代わりに、最初にデータベースから上位 20 件の投稿を取得し、それらをコメントと共に memcached に保持します。ユーザーが新しい投稿を書くたびに、memcached から 20 番目の投稿を削除し、新しい投稿を 1 番目のトップ投稿として追加します。コメントについても、4 番目のコメントを削除し、新しいコメントを投稿に添付します。ただし、これには開発作業が必要です。もちろん、レコードをデータベースに保存する必要があります (または、必要に応じてグループ コミットに従うこともできます)。

完璧にコーディングすれば、これは私にとって最良のアプローチのように見えます

5番目のアプローチを実装するための他のアプローチや良いリンクはありますか? (memcached の更新)

ご協力ありがとうございます

4

1 に答える 1

2

ユーザー変数トリックの使用:

SELECT   post_id, comment_id
FROM     (
  SELECT   post_id, comment_id,
           @i := IF(@type <=> post_id, @i+1, 0) AS comment_number,
           @p := post_id
  FROM     comments NATURAL JOIN (SELECT * FROM (
             SELECT p_id AS post_id FROM posts ORDER BY p_id DESC LIMIT 20
           ) z) z, (SELECT @type:=NULL) init
  ORDER BY post_id DESC, comment_id DESC
) t
WHERE    comment_number < 4
ORDER BY post_id DESC, comment_id DESC

tこれには、これらの投稿のすべてのコメントから一時テーブルを作成し、(最も外側のクエリで) 上位 4 つだけをフィルター処理する必要があり(post_id, comment_id)ます。

SELECT   post_id, comment_id,
         @i := IF(@type <=> post_id, @i+1, 0) AS comment_number,
         @p := post_id
FROM     comments FORCE INDEX (index_name) NATURAL JOIN (SELECT * FROM (
           SELECT   DISTINCT post_id
           FROM     comments
           ORDER BY post_id DESC
           LIMIT    20
         ) z) z, (SELECT @type:=NULL) init
GROUP BY post_id DESC, comment_id DESC
HAVING   comment_number < 4
于 2012-10-31T15:57:42.660 に答える