مخطط قاعدة البيانات لأصوات خيط المنتدى/وجهات النظر ، واستراتيجية لزيادة وعرض # من المشاهدات

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

سؤال

إذا كان الأمر مهمًا حتى الآن ، فأنا أستخدم MySQL/Myisam ولكني منفتح على استخدام PostgreSQL. أنا أيضًا منفتح على استخدام memcached.

النظر في جدول يستخدم لتخزين المواضيع المنتدى:

id forum_name post_date
1  Hey!       2009-01-01 12:00:00
  • ما هي أفضل ممارسة لتخزين الكيانات المتعلقة بالخيوط مثل الأصوات والآراء والعدادات؟

هل علي أن..

إنشاء جدول منفصل مثل

id thread_id views
1  1         532

أو احتفظ بها كعمود في جدول المواضيع الأولية؟

id forum_name post_date              views
1  Hey!       2009-01-01 12:00:00    532

آخر ذي صلة ، ما هو الحل العملي لعرض وزيادة طرق عرض الصفحة؟ انا اقرأ هذا مسلك ويبدو أنه يمكنني فقط تخزين قيمة لوقت معين ، لم أكن واضحًا تمامًا في الجزء المتزايد - ربما شيء مثل تخزين القيم في الملفات المسطحة في مكان ما ، ثم بشكل دوري مع Cronjobs تحديث طرق عرض منتدى قاعدة البيانات كل ساعة أو نحو ذلك ؟

تعديل:للتوضيح ، فإن التصويت يشبه ذلك مع تصويت واحد لكل موضوع ويمكن أن يكون هناك انعكاسات. فما بالوجز ما قصدته عن العدادات.

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

المحلول

التصويت

أقترح تحديد جدولين بالإضافة إلى جدول الموضوع - VOTE_CODES و THREAD_VOTES. في لمحة ، قد يظهر على تطبيع ولكن التنسيق سيسمح لك بتغيير قيمة التصويت دون الحاجة إلى تغييرات كبيرة في DML.

VOTE_CODES الطاولة

  • vote_code, ، المفتاح الأساسي ، أي: صعودا ، لأسفل
  • vote_cast_value -القيمة المنسوبة إلى التصويت لأعلى/لأسفل
  • vote_caster_value -الاختياري ، إذا كنت ترغب في الحفاظ على أسلوب التصويت السلبي الذي يؤثر على العجلات.

THREAD_VOTES الطاولة

  • thread_id
  • user_id
  • vote_code

جميع الأعمدة في THREAD_VOTES هي المفتاح الأساسي - الذي سيضمن أنه لا يمكن أن يكون هناك سوى العديد من الصفوف لمستخدم وخيط معين حيث توجد رموز تصويت. على افتراض رمزين فقط ، فإن هذا من شأنه أن يدعم القدرة على عكس التصويت لأنه لا يمكن أن يكون هناك سوى سجلان - واحد مع أي رمز.

الآراء

أود أن أقترح تخزين:

  • معرف الموضوع
  • عنوان IP
  • user_agent -التقاط المتصفح
  • الطابع الزمني

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

نصائح أخرى

من الواضح أن الملفات المسطحة هي فكرة سيئة ، لأنك تحتاج إلى تنفيذ القفل (DB يقوم بذلك بالفعل ، وهناك عدد أقل من الأخطاء في هذا الرمز).

تصميم قاعدة البيانات العلائقية هو أكثر من فن وليس علم: يمكنك الحصول على

CREATE TABLE threads (
  tid THREADID
, title THREADTITLE
, views COUNTER
, PRIMARY KEY (tid)
);

ولن يكون أكثر من "صحيح" من

CREATE TABLE threads (
  tid THREADID
, title THREADTITLE
, PRIMARY KEY (tid)
);

CREATE TABLE views (
  tid THREADID
, views COUNTER
, PRIMARY KEY (tid)
, FOREIGN KEY (tid)
  REFERENCES threads
);

لذلك الأمر متروك لك حقًا.

أود أن أقول: اذهب مع أبسط شيء أولاً ، اجعله أكثر تعقيدًا إذا وجدت أنه ضروري (على سبيل المثال لأسباب الأداء). أيو: ضع views COUNTER ميزة في threads. إذا اتضح أن Trafic يضر بالأداء (الكثير من التحديثات على threads.views السمة تعني أن DBMs يجب أن يتجول حول البيانات غير القابلة للتغيير في السمات الأخرى) ، يمكنك دائمًا تقسيم الجدول إلى اثنين ، واستبداله برؤية تنضم إليها. Voila ، بيانات غير قابلة للتغيير (أو نادراً ما تكون متغيرة) مفصولة عن البيانات المتقلبة ، تظل الواجهة كما هي.

بالطبع ، اذهب مع PostgreSQL. الرمز الموضح أعلاه صالح في DBMS ، فقط أضف هذه:

CREATE DOMAIN threadid
AS INT NOT NULL;

CREATE DOMAIN threadtitle
AS TEXT NOT NULL
CHECK (LENGTH(VALUE) > 0);

CREATE DOMAIN counter
AS INT NOT NULL
CHECK (VALUE > 0);

تعديل لدحض التعليق من قبل OMG Ponies: بالطبع فهو آمن.

UPDATE threads SET
  views = views + 1
WHERE tid = X

إما أن ينجح أو ينفذ.

تحرير 2 لإضافة اعتبار لجانب التصويت

دعنا نقول أن المواصفات هي: يجوز للمستخدم التصويت على مؤشر ترابط (+1) أو أسفل (-1) ، قد لا يتجاوز مجموع أصواته على موضوع معين | 1 | ، والتاريخ غير ذي صلة. يجوز للمستخدم التصويت على موضوع لأعلى ، ثم وصولا لإعادة ضبط تصويته على "عدم التصويت" ، ثم مرة أخرى إلى "التصويت" ، إلخ.

CREATE DOMAIN vote
AS INT NOT NULL
CHECK (VALUE BETWEEN -1 AND 1);

CREATE TABLE votes (
  tid THREADID
, uid USERID
, vote VOTE
, PRIMARY KEY (tid, uid)
);

في MySQL ، يمكنك

INSERT INTO votes (
  tid
, uid
, vote
) VALUES (
  X
, Y
, Z -- +1 or -1
)
ON DUPLICATE KEY UPDATE
vote = vote + Z

للأسف ، لا يوجد (حتى الآن) لمثل هذه الوظائف ، لذلك ستحتاج إلى استخدام تنفيذ مستوى المستخدم الاصطلاحي

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