사용자가 매일 X 일 동안 사이트를 방문한 것을 추적하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/932610

  •  06-09-2019
  •  | 
  •  

문제

스택 오버플로에는 새로운 배지가 있습니다. "woot"배지는 매일 30 일 동안 사이트를 방문한 사용자에게 수여됩니다. 어떻게 이와 같은 기능을 구현할 수 있습니까? 사용자가 매일 X 일 동안 가장 간단한 방식으로 사이트를 방문한 것을 어떻게 추적 할 수 있습니까?

나는 마지막 로그인의 타임 스탬프를위한 두 개의 필드를 가지고 있고, 다른 하나는 사용자의 날을 계속 방문하여 사이트를 계속 방문했습니다. 논리는 먼저 카운터를 1로 설정하고 로그인 시간도 저장하는 것입니다. 바로 다음 로그인에서 마지막 로그인 이후 하루를 넘지 않아 카운터를 증가 시키거나 1로 다시 설정 한 다음 타임 스탬프 필드를 현재 날짜로 업데이트하십시오.

더 간단하게 할 수 있습니까?

도움이 되었습니까?

해결책

사람들이 그렇지 않을 수도 있기 때문에 쿠키가 필요합니다. 로그인 예를 들어 매일-예를 들어 2 주 동안 자동으로 로그인하거나 사이트에 50 시간 동안 수면 및 점심없이 작업을하지 않기 때문에 사용자가 사이트에 액세스 할 때 실제로 계산하고 싶을 것입니다.

이제 위에서 제안한대로 모든 액세스를 기록하고 데이터베이스 쿼리를 수행 할 수 있지만 유용성과 개인 정보+단순성 사이의 잘못된 균형을 맞이할 수 있다고 생각할 수도 있습니다.

지정된 알고리즘은 명백한 방식으로 부족합니다. 정수 수를 저장하기 때문에 12 시간마다 로그인 및 아웃하는 사용자를 그리워합니다 (알고리즘은 일수를 1로 유지합니다).

가장 깨끗한 솔루션은 다음과 같습니다. 사용자 당 날짜 필드, 일종의 자기 설명이없는 비 객체 지향 파이썬에서 :

# 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 )
    ...

(내 피해자 기술을 용서 해주세요. 저는 학업적이고 처음으로 사이트 사용자입니다)

이 작업을 수행 할 수 없습니다 하나 변하기 쉬운. 나는 누군가이 사실을 증명하는 깨끗한 주장을 쓸 수 있다고 확신합니다.

다른 팁

실제로 회원의 방문이 SQL 데이터베이스에있는 경우 단일 SQL 쿼리로 모든 작업을 수행 할 수 있습니다. 이것은 아마도 모든 데이터를 클라이언트 프로그램으로 넘어서서 어쨌든 확인하는 것보다 더 빠릅니다.

/*
    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- 방문의 날을 가질 수 없습니다 ...

나는 두 번째 로프 스타의 접근 방식. 로그인 시간 등과 같은 사용자 통계는 일반적으로 데이터베이스에서 사용할 수 있습니다. 사용 가능한 데이터에서 특정 사실을 도출해야합니다. 따라서 방문마다 카운터가 있고 물건을 증가시키기보다는 사용자 로그인 데이터에서 실행되는 배치 작업을 선호하고 그 날의 결과를 게시합니다.

그러나 일단 사용자가 "woot"ed, 해당 사용자를위한 "woot"ness 컴퓨팅을 중지 할 수 있습니다. 그렇지 않으면, 로그인의 날이 발생할 때까지 사용자가 매일 "울부 짖는"기회가 있습니다. (그러나 이것은 사소한 문제입니다).

이것이 로그인하고 싶은 유일한 것이라면 아마도 좋은 해결책 일 것입니다. 그러나 나는 논리와 로깅을 분리하여 기존 데이터를 끊지 않고 논리를 조정할 수있을뿐만 아니라 원시 정보의 양을 늘리기 위해 로그와 로깅을 분리하고 싶습니다.

이 경우, 모든 방문 또는 모든 조치 (요구 사항/공간/등에 따라)를 기록한 다음 데이터를 검사하고 true (배지 기준 일치) 또는 False (그렇지 않음)를 검사하는 어딘가에 Sproc 또는 메소드를 작성합니다. 일치 기준).

데이터의 양이나 복잡성으로 인해 필요한 계산이 너무 오래 걸렸을 경우와 같은 정보를 보유하기 위해 특정 스키마를 만들 수있는 유일한 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top