ユーザーが X 日間毎日サイトにアクセスしたことを追跡するにはどうすればよいですか?
-
06-09-2019 - |
質問
Stack Overflow に新しいバッジが追加されました。」ウート」バッジは、30 日間毎日サイトにアクセスしたユーザーに付与されます。このような機能を実装するにはどうすればよいでしょうか?最も簡単な方法で、ユーザーが X 日間毎日サイトにアクセスしたことを追跡するにはどうすればよいでしょうか?
私は 2 つのフィールドを用意することを考えました。1 つは最終ログインのタイムスタンプ用、もう 1 つはユーザーがサイトを継続的に訪問した日数をカウントするためです。このロジックでは、まずカウンターを 1 に設定し、ログイン時刻も保存します。次回のログイン時に、最後のログインから 1 日以内かどうかを確認し、カウンターをインクリメントするか、1 に戻します。次に、タイムスタンプ フィールドを現在の日付に更新します。
もっと簡単にできますか?
解決
Cookie が必要です。人々はそうしないかもしれないからです。 ログイン 毎日 -- たとえば、ユーザーが 2 週間自動的にログインしているため、またはユーザーが 50 時間睡眠と昼食なしでノンストップでサイト上で作業を行っているためです :) 実際には、ユーザーがいつサイトにアクセスしたかをカウントしたいと思うでしょう。
さて、上で提案したように、理論的にはすべてのアクセスを記録し、データベース クエリを実行できますが、(私と同じように) それは有用性とプライバシー + シンプルさの間のバランスが間違っていると考えるかもしれません。
指定したアルゴリズムには明らかな欠陥があります。整数の日数のみを保存するため、12 時間ごとにログインおよびログアウトするユーザーを見逃します (アルゴリズムでは日数のカウントが 1 に維持されます)。
これが私が最もクリーンだと思う解決策です 二 ユーザーごとの日付フィールド。一目瞭然の非オブジェクト指向 Python の場合:
# user.beginStreak----user.lastStreak is the last interval when
# user accessed the site continuously without breaks for more than 25h
def onRegister (user):
...
user.beginStreak = user.endStreak = time() # current time in seconds
...
def onAccess (user):
...
if user.endStreak + 25*60*60 < time():
user.beginStreak = time()
user.endStreak = time()
user.wootBadge = ( user.endStreak-user.beginStreak > 30*24*60*60 )
...
(Python のスキルについてはご容赦ください。私は学者であり、サイトを初めて使用します)
このタスクは次の場合には実行できません 1つ 変数。この事実を証明する明確な議論を誰かが書けると私は確信している。
他のヒント
実際には、あなたは、単一のSQLクエリを使用して全体のことを行うことができます。これは、とにかくそれをチェックするためにも、クライアントプログラムに上のすべてのデータをschleppingよりも、おそらく高速です。
/*
Find all members who visited at least once every day
for 30 or more days. --RBarryYoung, 2009-05-31
*/
;WITH
cteVisitDays as (
Select
MemberID
, DATEDIFF(dd,'2008-06-01',VisitTime) as VisitDay
From tblMembersLog
Where Not Exists( Select * From tblMemberTags T
Where T.MemberID = tblMembersLog.MemberID
And T.TagName = 'WOOT!' )
Group By MemberID
, DATEDIFF(dd,'2008-06-01',VisitTime)
)
, cteVisitRunGroups as (
Select
MemberID
, VisitDay - Row_Number() Over(
Partition By MemberID
Order By VisitDay
) as RunGrouping
From cteVisitDays
)
SELECT Distinct
MemberID
From cteVistRunGroups
Group By MemberId, RunGrouping
Having COUNT(*) >= 30
(あなたはおそらくすでにとにかくやる)のタイムスタンプを使用して、データベース内の各訪問を追跡します。あなたが訪問その日の数をカウントしながら、日によってSQL文およびグループの結果を作成します。過去30日間の期間では、0 - 訪問日を持つことが許可されていません...
I二ropstahのアプローチ。ログイン時間などのようなユーザー統計は、データベース内の通常利用可能です。私たちは、利用可能なデータのうち、特定の事実を導出する必要があります。そうではなく、各訪問のためのカウンタを有するものをインクリメントするよりも、私は、ユーザーのログインデータ上で実行するバッチ・ジョブを好むだろうし、その日の結果を公開します。
しかし、ユーザー「woot」編たら、そのユーザのために、「woot」らしさを計算停止する場合があります。 そうでなければ、ノーログイン日に遭遇するまで、毎日「wooted」ばかりのユーザーのチャンスがあります。 (しかし、これはマイナーな問題です)。
、多分それは良い解決策です。しかし、私は私の処分で、生の情報量を増やすだけでなく、既存のデータを壊すことなく、ロジックの微調整を可能にするために、両方の、ロジックとログイン別々に維持したい。
この場合、私は(すべての訪問またはすべてのアクション(要件に応じて/スペース/など)をログに記録し、その後のSPROCやデータを検査し、真(バッジのための条件と一致する)またはfalseを返されたどこかの方法を記述します)の基準に一致していません。
必要な計算があまりにも長い間、いずれかのためにデータの量やその複雑さを取った場合は、私はそのような情報を保持するために、特定のスキーマを作成した場合のみでした。