Biorąc pod uwagę dane dostępu do witryny w formularzu session_id, ip, user_agent
i opcjonalnie znacznik czasu, zgodnie z poniższymi warunkami, w jaki sposób najlepiej podzielić sesje na unikalnych użytkowników?
session_id
: to identyfikator nadawany każdemu nowemu odwiedzającemu. Nie wygasa, jednak jeśli użytkownik nie zaakceptuje plików cookie / wyczyści pliki cookie / zmieni przeglądarkę / zmieni urządzenie, nie będzie już rozpoznawany
IP
mogą być współużytkowane przez różnych użytkowników (wyobraź sobie bezpłatną kawiarnię Wi-Fi lub zmianę adresu IP przez Twojego dostawcę usług internetowych), a często będą mieli co najmniej 2 osoby, dom i pracę.
User_agent
to wersja przeglądarki + systemu operacyjnego, umożliwiająca rozróżnienie urządzeń. Na przykład użytkownik może używać zarówno telefonu, jak i laptopa, ale jest mało prawdopodobne, aby korzystał z laptopów z systemem Windows i Apple. Jest mało prawdopodobne, aby ten sam identyfikator sesji miał wielu użytkowników.
Dane mogą wyglądać jak skrzypce tutaj: http://sqlfiddle.com/#!2/c4de40/1
Oczywiście mówimy o założeniach, ale chodzi o to, aby zbliżyć się do rzeczywistości tak, jak to możliwe. Na przykład, jeśli napotkamy ten sam adres IP i identyfikator użytkownika w ograniczonym przedziale czasowym z innym identyfikatorem session_id, można założyć, że jest to ten sam użytkownik, z pewnymi wyjątkami dotyczącymi krawędzi.
Edycja: Język, w którym problem został rozwiązany, nie ma znaczenia, dotyczy głównie logiki, a nie implementacji. Pseudokod jest w porządku.
Edycja: ze względu na powolny charakter skrzypiec możesz alternatywnie czytać / uruchamiać 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