مخطط قاعدة البيانات لأصوات خيط المنتدى/وجهات النظر ، واستراتيجية لزيادة وعرض # من المشاهدات
-
20-09-2019 - |
سؤال
إذا كان الأمر مهمًا حتى الآن ، فأنا أستخدم 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
للأسف ، لا يوجد (حتى الآن) لمثل هذه الوظائف ، لذلك ستحتاج إلى استخدام تنفيذ مستوى المستخدم الاصطلاحي