it-swarm.asia

تخزين مقابل حساب القيم الإجمالية

هل هناك أي مبادئ توجيهية أو قواعد عامة لتحديد متى يتم تخزين القيم الإجمالية ومتى يتم حسابها على الطاير؟

على سبيل المثال ، لنفترض أن لدي أدوات يمكن للمستخدمين تقييمها (انظر المخطط أدناه). في كل مرة أقوم بعرض عنصر واجهة مستخدم ، يمكنني حساب متوسط ​​تقييم المستخدم من الجدول Ratings. أو بدلاً من ذلك ، يمكنني تخزين متوسط ​​التقييم على الجدول Widget. هذا سيوفر لي من الاضطرار إلى حساب التقييم في كل مرة أقوم بعرض الأداة ، ولكن بعد ذلك سيتعين علي إعادة حساب متوسط ​​التقييم في كل مرة يقوم فيها مستخدم بتقييم عنصر واجهة مستخدم.

Ratings       Widgets
---------     -------
widget_id     widget_id
user_id       name              
rating        avg_rating  <--- The column in question
100
BenV

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

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

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

في أي حال من الأحوال ، يجب أن تتعامل مع العمود المشتق على أنه عمود "عادي": تأكد من أن البيانات المقدمة في عرض "الأدوات" موجودة في مكان آخر في الجدول ، بحيث يمكن اشتقاق Tuple بالكامل بأي عمليات تضعها في مكانها. هذا السؤال خاص أيضًا بقاعدة البيانات (وإصدار قاعدة البيانات) بشكل خاص ، لذا أوصي باختبار أداء المجموع (مع الفهارس المناسبة) مقابل مجموعة بيانات بالحجم العادي والعرض الملموس.

60
Brian Ballsun-Stanton

عدد المرات التي تحتاج فيها إلى حساب/عرض القيم المتعلقة بعدد المرات التي يتم فيها تغيير/تحديث الأرقام الأساسية.

لذلك ، إذا كان لديك موقع ويب يحتوي على 10 آلاف نتيجة يومية تعرض قيمة ستتغير مرة واحدة فقط في الساعة ، فسوف أحسبها عندما تتغير القيم الأساسية (يمكن أن تكون مشغل قاعدة بيانات ، أيا كان).

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

11
Joe

استخدم جدول StaleWidgets كقائمة انتظار لأدوات "غير صالحة" (يتم إعادة حسابها). استخدم مهمة مؤشر ترابط أخرى (غير متزامنة) يمكنها إعادة حساب هذه القيم. تعتمد فترة أو لحظة إعادة الحساب على متطلبات النظام:

  • فقط للقراءة ،
  • في نهاية الشهر ،
  • لبعض المستخدمين في بداية اليوم
  • ...
4
garik

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

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

2
techExplorer

بالنسبة للحالة على وجه الخصوص ، هناك حل مختلف حيث لا يتعين عليك إضافة جميع التصنيفات وتقسيمها على الإجمالي للعثور على المتوسط. بدلاً من ذلك ، يمكنك الحصول على حقل آخر يحتوي على إجمالي المراجعات ، وبالتالي في كل مرة تضيف فيها تصنيفًا ، تقوم بحساب المتوسط ​​الجديد باستخدام/(avg_rating × total + new_rating)/الإجمالي ، وهذا أسرع بكثير من التجميع ويقلل قراءات القرص منذ ليس عليك الوصول إلى جميع قيم التصنيف. قد تنطبق حلول مماثلة على حالات أخرى.

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

2
Adrian Martinez