كيفية تتبع ذلك قام المستخدم بزيارة الموقع كل يوم لأيام X؟

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

  •  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 (معايير المباريات للشارة) أو خطأ (لا معايير المباراة).

الحالة الوحيدة التي كنت أقوم بإنشاء مخطط معين لعقد معلومات كأنها إذا كانت الحسابات المطلوبة طويلة جدا، إما بسبب مقدار البيانات أو التعقيد منه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top