2

特定のページのページビュー (特にユニーク) を追跡する最良の方法は何ですか?

例: フォーラムのスレッド、ビデオ Web サイトのビデオ、Q/A スクリプト (SO) の質問。

現在、ビューをカウントしようとしている行ごとに単純な「ビュー」列のアプローチを取っていますが、これが最も効率的な方法ではないことはわかっています。

また、一意のビューについては、「QuestionID」と「UserID」を含む行を保持する別のテーブルがあります。ユーザーが質問/ページにアクセスすると、私のコードはビューテーブルで「UserID」と「QuestionID」を持つ行を見つけようとします。それができない場合は、行を追加してから、質問の Views 値を増やします「質問」表。

4

3 に答える 3

1

ストレージのソリューションは、ユーザーを追跡するための最良の方法のようです. テーブルには冗長なデータがなく、多対多の関係は独自のテーブルで表されます。

別の注意: 匿名ユーザーの場合は、IP アドレスを記録する必要があります。COUNT() sql 関数を使用して、その方法で一意の訪問者の数を取得できますが、IP アドレス自体は「一意」ではありません。

于 2009-09-28T05:51:11.893 に答える
1

First of all when you have a table that stores userid-quesitonid pairs, it means you can count them, adding a views column is against the rules of normalisation I suppose.

Other thing is that I can F5 as much as I want, if you do not implement a cookie solution, if not then add a row to the table.

when it comes to ip address solution, which is far form being a solution at all, it will blcok people behind routers.

I think of (also implementing right now) a solution that checks cookies, sessionIds, DB table for registered users, and if none found, adds a row to the table. Itr also records SessionID and IP addresses anyway, but don't really rely on them.

于 2010-06-21T19:08:50.123 に答える
0

ASP.NET メンバーシップと匿名ユーザー用の匿名プロバイダーを使用している場合、Profile.Save() を実行するとすぐに、匿名ユーザーごとに aspnet_Users テーブルに行が作成されます。その場合、特定のページを閲覧している匿名ユーザーと登録ユーザーの両方を追跡できます。aspnet_user の UserID と QuestionID を記録するだけです。

ただし、データベースを破壊する可能性があるため、データベース レベルでこれを行うことは強くお勧めしません。10,000 の質問と 1,000 の登録ユーザーと 100,000 の匿名ユーザーがあり、各ユーザーが平均で 10 の質問にアクセスすると仮定すると、追跡テーブルには 100 万行が存在することになります。かなりの負荷。

さらに、追跡テーブルで SELECT COUNT() を実行すると、データベースにかなりの負荷がかかります。特に、フォーラムのほぼすべてのページ ビューでこれを実行しています。最良の方法は、各質問に対して質問テーブルに合計カウンターを保持することです。ページを閲覧しているユニーク ユーザーを獲得するたびに、カウンターを増やすだけです。

また、追跡テーブルからユーザー テーブルへの FK リレーションシップを作成しないでください。aspnet_users テーブルをクリーンアップする必要があります。時間の経過とともに、二度と戻ってこない可能性が高い多くの匿名ユーザーが積み重なっていくからです。したがって、追跡ページには userID フィールドのみが必要で、FK は必要ありません。さらに、何百万もの行を取得し続けるだけでなく、時間の経過とともに追跡テーブルをクリーンアップする必要があります. そのため、TotalView カウンターを質問テーブルに配置する必要があり、ページの表示中にビュー数を計算するために SELECT COUNT() を使用しないでください。

これはあなたの質問に答えていますか?

于 2011-05-07T21:23:56.373 に答える