أفضل الممارسات لبنية قاعدة بيانات التصويت على التعليقات

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعمل على تطبيق PHP يحتوي على العديد من الكائنات التي يمكن التعليق عليها.يمكن التصويت على كل تعليق، حيث يستطيع المستخدمون منحه +1 أو -1 (مثل Digg أو Reddit).أخطط الآن للحصول على جدول "الأصوات" الذي يحمل معرف المستخدم ومعلومات تصويته، والذي يبدو أنه يعمل بشكل جيد.

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

هل هناك طريقة أبسط للقيام بذلك أقل كثافة في قاعدة البيانات؟هل بنية قاعدة البيانات الحالية هي أفضل طريقة؟

لكي تكون أكثر وضوحًا بشأن بنية قاعدة البيانات الحالية:

جدول التعليقات:

  • معرف المستخدم
  • معرف الكائن
  • مجموع الأصوات

جدول الأصوات:

  • comment_id
  • معرف المستخدم
  • تصويت

هدف نهائي:

  • السماح للمستخدم بالتصويت مرة واحدة فقط على كل تعليق مع # من استعلامات MySQL على الأقل (يحتوي كل كائن على تعليقات متعددة)
هل كانت مفيدة؟

المحلول

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

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

هل هذا يساعد؟

نصائح أخرى

لماذا لا تقوم بحفظ مجموع الأصوات لكل تعليق؟قم بزيادة/إنقاص هذا عند إجراء تصويت جديد.

ثم يتعين عليك التحقق مما إذا كان المستخدم قد قام بالتصويت خصيصًا لهذا التعليق للسماح بصوت واحد فقط لكل تعليق لكل مستخدم.

يمكنك وضع شرط ربط SQL والذي يُرجع جميع الأصوات على التعليقات التي أجراها المستخدم الحالي لهذا الكائن، إذا لم تحصل على أي صفوف، فهذا يعني أن المستخدم لم يصوت.وهذا يختلف قليلًا عن قيامك بفحص كل تعليق واحدًا تلو الآخر في البرنامج.

وفيما يتعلق ببنية قاعدة البيانات، فإن إبقاء هذه الأشياء منفصلة يبدو منطقيًا تمامًا.التصويت {معرف_المستخدم، معرف_الكائن، نوع_الكائن، معلومات_التصويت...)

ربما كنت تفعل هذا بالفعل، آسف ولكن لم أتمكن من تفسير منشورك إذا كان هذا هو الحال.

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