سؤال

باستخدام PHP و MySQL ، لدي منتدى نظام أحاول بناء.ما أريد أن أعرفه هو كيف يمكنني ضبط هذا الأمر بحيث عندما يقوم المستخدم يقرأ منتدى دخول هذا قراءة فقط لهذا المستخدم ، بغض النظر عن المنتدى هم فيه ، حتى شخص آخر المشاركات على ذلك.

حاليا بالنسبة لكل موضوع ، لدي جدول مع PostID ، UserID الذي نشره, رقم الموضوع ربطه الفعلية بعد (كنص) ، ثم التاريخ/الوقت الذي تم نشره.

عن قائمة الموضوع في كل منتدى هناك رقم الموضوع (المفتاح الأساسي) ، ThreadName, ForumID تنتمي إليها ، NumPosts, NumViews, LastPostDateTime ، CreateDateTime.أي مساعدة ؟

هل كانت مفيدة؟

المحلول

قد يكون تخزينها في جدول معرف المستخدم آخر، رقم الموضوع، LastReadDateTime عندما يقوم المستخدم قراءة هذا الموضوع.

if (LastPostDateTime > LastReadDateTime) you got an unread post.

وأسف لديك فوق كبير على كل قراءة سيكون لديك الكتابة.

نصائح أخرى

الحل التقليدي هو الانضمام إلى الجدول شيء على غرار:

CREATE TABLE topicviews (
    userid INTEGER NOT NULL,
    topicid INTEGER NOT NULL,
    lastread TIMESTAMP NOT NULL,
    PRIMARY KEY (userid, topicid),
    FOREIGN KEY (userid) REFERENCES users(id),
    FOREIGN KEY (topicid) REFERENCES topics(id)
);

مع lastread تحديثه في كل مرة موضوعا للقراءة.عند عرض قائمة من الموضوعات ، إذا كانت المواضيع.lastupdated هو > topicviews.lastread ، هناك وظائف جديدة.

الحل التقليدي هو القمامة سوف تقتل قاعدة البيانات الخاصة بك!لا تفعل ذلك!

المشكلة الأولى هي أن الكتابة في كل موضوع عرض سيجلب قريبا خادم قاعدة البيانات على ركبتيها على منتدى مشغول ، وخاصة على MyISAM الجداول التي يكون فقط على مستوى الجدول الأقفال.(لا تستخدم الجداول MyISAM استخدام InnoDB في كل شيء ما عدا fulltext البحث).

يمكنك تحسين هذا الوضع قليلا فقط يكلف نفسه عناء الكتابة من خلال lastread الوقت عندما يكون هناك في الواقع رسائل جديدة قراءتها في هذا الموضوع.إذا الموضوع.lastupdated < topicviews.lastread يكون لديك شيء لتكسبه من خلال تحديث القيمة.وحتى مع ذلك ، على بالسلاح المستخدمة المنتدى هذا يمكن أن يكون عبئا.

المشكلة الثانية هو اندماجي الانفجار.صف واحد لكل مستخدم في الموضوع قريبا يضيف:مجرد آلاف المستخدمين و آلاف المواضيع و كنت قد يحتمل مليون topicview الصفوف لتخزين!

يمكنك تحسين هذا الوضع قليلا عن طريق الحد من عدد من المواضيع تذكرت لكل مستخدم.على سبيل المثال هل يمكن إزالة أي موضوع من آراء الجدول عندما يصبح أكبر سنا من سن معينة ، و تتحمل جميع المواضيع القديمة 'قراءة'.عموما هذا يحتاج تنظيف المهام في الخلفية.

أخرى أقل كثافة المناهج ما يلي:

  • فقط تخزين واحد lastread مرة في المنتدى
  • فقط تخزين واحد lastvisit الوقت لكل مستخدم عبر الموقع بأكمله ، التي من شأنها أن تظهر "الجديد" فقط الأشياء المحدثة منذ للمستخدم زيارة سابقة (جلسة)
  • لا تخزين أي lastread المعلومات في كل شيء ، ولكن بما في ذلك آخر تحديث الوقت في موضوع URL نفسه.إذا كان متصفح المستخدم قد رأيت هذا الموضوع في الآونة الأخيرة ، وسوف تذكر URL علامة على أنها زار.ثم يمكنك استخدام CSS أسلوب بزيارة الروابط 'المواضيع التي لا تحتوي على رسائل جديدة'.

والأفكار العامة هنا صحيحة، لكنها قد يغفل بعض الحلول واضحة لقضية تطويره.

<اقتباس فقرة>   

وbobince:   والمشكلة الثانية هي انفجار اندماجي. صف واحد لكل مستخدم في الموضوع قريبا يضيف الأعلى:! مجرد آلاف من المستخدمين وألف المواضيع ويحتمل أن تكون لديك مليون topicview صفوف لتخزين

وأنت لا تحتاج لتخزين سجل في الجدول "topicviews" إذا كان شخص ما لم ينظر أي وقت مضى أن الموضوع. كنت ببساطة عرض موضوع وجود مشاركات جديدة إذا عاد لاغية أو الوقت last_read هو <اقتباس فقرة>   

وgortok: هناك الكثير من الطرق للقيام بذلك، ولكن كل تنمو أكبر أضعافا مضاعفة باسم المستخدم بزيارة الموقع.

في هذه الحالة، يمكنك أرشفة منتدى بعد ن ن وظائف أو أسابيع، وعند قفل، وتقوم بتنظيف "topicviews" الجدول.

وبلدي الاقتراح الأول هو واضح وليس له أي سلبيات. بلدي الثاني يقلل من قابليتها للاستخدام على الموضوعات المؤرشفة، ولكن هذا ثمن قليل لدفع ثمن منتدى العاجل. منتديات بطيئة ليست سوى مؤلمة لقراءة والرد على ل.

ولكن بصراحة؟ وربما كنت لا داعي للقلق حول تطويره. حتى واحد مليون صف في الحقيقة ليست كل ذلك كثيرة.

وليس هناك طريقة سهلة للقيام بذلك. هناك الكثير من الطرق للقيام بذلك، ولكن كل تنمو أكبر أضعافا مضاعفة باسم المستخدم بزيارة الموقع. وأفضل ما يمكن القيام به، ولا تزال تبقي الأداء هو أن يكون طابع زمني وعلامة على أي المحافل التي تم تحديثها منذ آخر زيارة ك "غير مقروءة".

هل يمكن أن مجرد استخدام وظيفة من متصفح المستخدم وإلحاق رقم المشاركة الماضي في الارتباط إلى موضوع مثل هذا: "thread.php معرف = 12 & lastpost = 122"

ومن خلال الاستفادة من: زار في CSS الخاص بك، يمكنك عرض المشاركات من أن المستخدم قراءة بالفعل تختلف عن تلك التي كان لم يقرأ

وBobince لديها الكثير من الاقتراحات الجيدة. تحسينات قليلة أخرى محتملة:

وكتابة الجديد "هو هذا الجديد؟" المعلومات لأعطها وإلى جدول الخلية "أرشيف". ألف وظيفة دفعة يمكن تحديث الجدول "حقيقي".

للكل مستخدم، والحفاظ على "كل شيء قراءة حتى تاريخ $" العلم (لأنه عندما "بمناسبة كل قراءة" النقر).

وعندما يتم نشر شيء جديد، واضحة كل الأعلام "تم قراءتها" - التي تحافظ على عدد من "الأعلام" أسفل والجدول يمكن أن يكون مجرد (topic_id، USER_ID) - لا الطوابع

ووتستخدم متصفح المستخدم وظائف وإضافة آخر مشاركة ID في وصلة من الموضوع. بعد استخدام: زار في CSS يمكنك عرض جميع الخيط الذي لم يقرأ من قبل المستخدم

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