كيفية تتبع ذلك قام المستخدم بزيارة الموقع كل يوم لأيام X؟
-
06-09-2019 - |
سؤال
هناك شارة جديدة على تجاوز المكدس. ال "ووت"يتم منح الشارة للمستخدمين الذين قاموا بزيارة الموقع كل يوم لمدة 30 يوما. كيف يمكنك تطبيق ميزة مثل هذا؟ كيف يمكنك تتبع ذلك المستخدم الذي قام بزيار الموقع كل يوم لأيام x في أبسط طريقة؟
فكرت في وجود حقلين - واحد لزيمق تسجيل الدخول الأخير، وأخرى لحساب الأيام على المستخدم قام بزيارة الموقع باستمرار. من المنطق هو إعداد العداد أولا إلى 1، وتخزين وقت تسجيل الدخول أيضا. في تسجيل الدخول التالي، تحقق من تسجيل الدخول منذ آخر تسجيل دخول آخر أكثر من يوم واحد، وزيادة العداد، أو أعد تشغيله إلى 1. ثم قم بتحديث حقل الطابع الزمني إلى التاريخ الحالي.
يمكنك أن تفعل ذلك أكثر بساطة؟
المحلول
تحتاج إلى الحصول على ملف تعريف ارتباط، لأن الناس قد لا تسجيل دخول كل يوم - على سبيل المثال لأنهم يتم تسجيل الدخول تلقائيا لمدة أسبوعين، أو لأنهم في موقعك يقومون بأشياء لا تتوقف دون النوم والغداء لمدة 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 )
...
(أرجو أن يغفر مهاراتي في الثيثونيون، أنا مستخدم موقع أكاديمي وأول مرة)
لا يمكنك القيام بهذه المهمة واحد عامل. أنا متأكد من أن شخصا ما يمكنه كتابة حجة نظيفة تثبت هذه الحقيقة.
نصائح أخرى
في الواقع، إذا كانت زيارات الأعضاء في قاعدة بيانات SQL، فيمكنك القيام بالأشياء بأكملها باستخدام استعلام 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 ومجموعة النتيجة بحلول اليوم، بينما تحسب عدد الزيارات في ذلك اليوم. في الفترة من الثلاثين يوما الماضية، لا يسمح له بيوم 0 زيارة ...
أنا نهج روبستاه الثاني. عادة ما تتوفر إحصائيات المستخدم مثل وقت تسجيل الدخول وغيرها في قاعدة البيانات. نحن بحاجة إلى استخلاص بعض الحقائق من البيانات المتاحة. لذلك بدلا من وجود عداد لكل زيارة وزيادة الأشياء، أود أن أفضل وظيفة دفعية تعمل على بيانات تسجيل دخول المستخدم ونشر النتائج لهذا اليوم.
ولكن بمجرد قيام مستخدم "Woot" إد، فقد ترغب في التوقف عن الحوسبة "Woot" NESS لهذا المستخدم. آخر، هناك فرصة للمستخدم الحصول على "Wooted" كل يوم، حتى تتم مصادفة يوم عدم تسجيل الدخول. (ولكن هذه مشكلة بسيطة).
إذا كان هذا هو الشيء الوحيد الذي تريد تسجيل الدخول، فربما يكون ذلك حلا جيدا. ومع ذلك، أحب أن أحفظ المنطق والخروج منفصل، سواء لزيادة كمية المعلومات الخام تحت تصرفي، وكذلك السماح بالتبديل من المنطق دون كسر البيانات الموجودة.
في هذه الحالة، أود تسجيل كل زيارة أو كل إجراء (اعتمادا على المتطلبات / الفضاء / إلخ)، ثم اكتب بائعا أو طريقة في مكان ما الذي تفقد البيانات وعاد true (معايير المباريات للشارة) أو خطأ (لا معايير المباراة).
الحالة الوحيدة التي كنت أقوم بإنشاء مخطط معين لعقد معلومات كأنها إذا كانت الحسابات المطلوبة طويلة جدا، إما بسبب مقدار البيانات أو التعقيد منه.