フォームのWebサイトアクセスデータsession_id, ip, user_agent
、およびオプションでタイムスタンプを使用して、以下の条件に従って、セッションを一意の訪問者にどのようにクラスター化するのが最適ですか?
session_id
:は、すべての新しい訪問者に与えられるIDです。有効期限はありませんが、ユーザーがCookieを受け入れない/ Cookieをクリアする/ブラウザーを変更する/デバイスを変更すると、ユーザーは認識されなくなります
IP
異なるユーザー間で共有することができ(無料のwi-fiカフェ、またはISPがIPを再割り当てすることを想像してください)、多くの場合、少なくとも2人の自宅と職場があります。
User_agent
ブラウザとOSのバージョンであり、デバイスを区別できます。たとえば、ユーザーは電話とラップトップの両方を使用する可能性がありますが、windows + appleラップトップを使用する可能性は低いです。同じセッションIDに複数のユーザーエージェントが存在することはほとんどありません。
データはフィドルのように見えるかもしれません:http ://sqlfiddle.com/#!2/ c4de40/1
もちろん、私たちは仮定について話していますが、それは可能な限り現実に近づくことです。たとえば、セッションIDが異なる限られた時間枠で同じipとuseragentに遭遇した場合、エッジケースの例外を除いて、それは同じユーザーであるという公正な仮定になります。
編集:問題が解決される言語は無関係であり、それは主に実装ではなくロジックに関するものです。擬似コードは問題ありません。
編集:フィドルの遅い性質のため、代わりにmysqlを読む/実行することができます:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr