0

投稿が読まれたときに (Google リーダーが行ったように) 記録する RSS リーダーを構築しています。下にスクロールすると、「記事を読んだ」テーブルに行を挿入して投稿を既読としてマークする程度まで機能していciidます。uiddateRead

現在、「すべて既読にする」機能を提供する方法を考えています。たとえば、未読の記事が 25 件しかない場合、それは簡単なことです。メインの article テーブルに 25 個の記事をクエリします。サブクエリを使用して、現在のユーザーが未読の記事を特定し、ciid既読としてマークする必要がある を収集し、新しい既読エントリを挿入します。しかし、未読のエントリが 20,000 件ある場合はどうなるでしょうか。20,000 の未読エントリを取得し、それらを収集ciidしてから MySQL サーバーに 20,000 の挿入コマンドを送信するのは、かなり非効率的です。

おそらくこれらすべてを直接処理する SQL クエリを使用して、これを行うためのより効率的な方法はありますか? システムに 1 人か 2 人のユーザーしかいない場合は、私の非効率的な方法は問題にならないと思いますが、システムを比較的適切に拡張したいと考えています。

4

1 に答える 1

2

次のようなことができます

REPLACE INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles

挿入するユーザー ID を指定する必要がある場所。REPLACE INTO は、既存の日付読み取りを削除します。この動作が望ましくない場合は、これを行うことができます

INSERT INTO read_articles (uid, dateread, ciid) 
SELECT <user-id>, NOW(), id FROM articles
ON DUPLICATE KEY UPDATE uid=uid;

ただし、あなたが取っているアプローチ(記事ごとに読んだ記事を保存する)はスケーラブルではないと思います。ユーザーが [すべてマーク] をクリックすると、そのイベントの日時を users テーブルに保存できます。最後の mark-all-date より古い記事はすべて既読と見なされます。

おそらく、テーブル内の過去 7 日間の記事のみを考慮する必要があります。1 週間以上前の read_articles レコードを定期的に削除します。7 日以上前のすべての記事は無視します (つまり、実際にはそれらが読まれていると想定します)。

于 2013-07-07T23:41:05.480 に答える