سؤال

وأنا أعمل على موقع على شبكة الانترنت مع قاعدة بيانات تطبيع بسيطة.

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

عند عرض صفحة على الموقع، وأنا استخدم الخلية COUNT بسيط () ليصل إجمالي عدد المشاهدات للعرض.

وتصميم قاعدة البيانات ويبدو على ما يرام، باستثناء هذه المشكلة: أنا في حيرة لكيفية استرداد أعلى 10 صفحات الأكثر مشاهدة بين آلاف

هل يجب إلغاء تطبيع جدول الصفحات بإضافة عمود Pages.views لعقد عدد من وجهات النظر لكل صفحة؟ أم أن هناك وسيلة فعالة للاستعلام عن أفضل 10 صفحات الأكثر مشاهدة؟

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

المحلول

   SELECT p.pageid, count(*) as viewcount FROM 
   pages p
   inner join views v on p.pageid = v.pageid
   group by p.pageid
   order by count(*) desc   
   LIMIT 10 OFFSET 0;

وأنا لا يمكن اختبار ذلك، ولكن شيئا من هذا القبيل. وأود أن لا تخزين قيمة إلا إذا لا بد لي من ونظرا لضيق الأداء (I علمت للتو مصطلح "التحسين سابق لأوانه"، ويبدو أن تطبق إذا أردت ذلك).

نصائح أخرى

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

Select pageid, Count(*) as countCol from Views
group by pageid order by countCol DESC
LIMIT 10 OFFSET 0;

وأنا ربما تشمل العمود الآراء في جدول الصفحات.

ويبدو وكأنه كسر معقول تماما التطبيع بالنسبة لي. خاصة وأنني لا يمكن تخيل أنك حذف جهات النظر لذلك كنت لا تتوقع العد للخروج من اجتز. لا يبدو التكامل المرجعي فائقة حاسما في هذه الحالة.

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

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

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

وDenormalizing ستعمل بالتأكيد في هذه الحالة. الخسارة هي غرفة تخزين إضافية المستخدمة من قبل عمود إضافي.

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

في هذه الحالة سيكون لكم فقدان القدرة على الفور معرفة التهم الصفحة الخاصة بك إلا إذا قمت بتشغيل هذا الاستعلام يدويا.

ويمكن بالتأكيد أن تستخدم Denormalization لرفع مستوى الأداء.

و- كريس

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