2

ほとんどのフォーラム、Youtube、その他いくつかのフォーラムのように、ビューカウンターを実装したいと思います。したがって、ユーザーが記事を読むたびに、それは保存され、記憶されます。誰がその記事を見たか知りたいです。

私の質問は次のとおりです。これをどのように効率的に実装しますか?ベストプラクティスは何ですか?

1つの方法は、ビューごとにストアドプロシージャを呼び出すことですが、その場合、データベースへの不要な呼び出しが多数発生します。

もう1つの方法は、これをグローバルアプリケーションオブジェクトに保存し、5分ごとにDBに保存することです(これを適切な方法で行うこともできますか?)

これを行うための最良の方法は何ですか?

4

2 に答える 2

4

データベース操作は驚くほど安価であり、心配する価値はありません。DB操作のコストがわずかでも高い場合は、いつでもブロッキング操作を新しいスレッドに委任して、ページ生成スレッドを解放できます(データベースから何も返さないUPDATEおよびINSERT操作に対してこれを簡単に行うことができます-それらは重要ではありません)。

Sprocは現在、実際には流行していません。最新のサーバーは以前のすべてのクエリからのプランをキャッシュし、些細なSELECT、INSERT、およびUPDATEの場合は苦しみ始めるため、事前に計算された実行プランから得られた可能性のあるパフォーマンス上の利点はほとんどなくなります。コードの複雑さの増加から。現在、インラインSQLコマンドに問題はありません。

とにかく、トピックに戻って要約すると、あなたの仮定は間違っています。UPDATE Pages SET ViewCount = ViewCount + 1 WHERE PageId = @pageIdすべてのページビューで実行しても問題はありません。これを行うことにも問題はありませんINSERT INTO UserPageviews (UserId, PageId, DateTime) VALUES ( @userId, @pageId, NOW() )。どちらの操作も非常に安価で、古くて古いデータベースサーバーでも2〜3ミリ秒未満で実行されます。

于 2012-09-23T22:18:16.747 に答える
1

もう1つの方法は、これをグローバルアプリケーションオブジェクトに保存し、5分ごとにDBに保存することです(これを適切な方法で行うこともできますか?)

この方法では、耐久性のあるキューイングメカニズム(MSMQなど)を使用しない限り、データが失われる可能性が非常に高くなります。あなたが大量のトラフィックを予期しない限り、私はこのアプローチについてさえ考えません。

この性質の書き込みは安価であり、1秒あたり数百回の操作は大したことではありません。私は最近、ローカルのオールインワンワークステーションで毎秒3000以上の完全なトランザクションのスループットを達成するコメント/評価フレームワークを構築しました。これには、リクエストの処理、検証、トランザクション内での複数のレコードの作成が含まれます。

注意として、統計データが人為的なインフレ/操作に対して脆弱でないことを確認するための手順を実行する必要があります。プロセスのこの部分は、ビュートラッキング自体よりもおそらく複雑になります。たとえば、ユーザーがF5キーを押したままにして、動画の視聴回数を増やすことができないようにする必要があります。また、これらの値をHTTPで操作することもできません(たとえば、AJAXリクエストを繰り返し送信するための小さなスクリプトを作成するなど)。

これは、同じユーザーIDまたはIPが一定期間にまだ記録されていないことを確認するために、各INSERTの前にSELECTが付いていることを示しています。もちろん、これは絶対確実ではありませんが(多大な労力を費やさない限り)、通常は良いアプローチである保守主義の側で誤りを犯します。

1つの方法は、ビューごとにストアドプロシージャを呼び出すことですが、その場合、データベースへの不要な呼び出しが多数発生します。

私は定期的に自分自身(および他の開発者)にデータベースを恐れないように注意する必要があります。人々(私を含む)は、いくつかの単純なデータベース呼び出しを避けるために、非常に長い時間を費やすことがあります。テーブルを狭くし、インデックスを適切に作成してください。このような操作は、想像以上に高速です。

于 2012-09-23T22:28:36.023 に答える