سؤال

غالبا ما أتعامل مع كيانات إجمالية أو الوالدين التي كانت سمات مشتقة من أعضاءهم المكونة أو الأطفال. علي سبيل المثال:

  • ال byte_count و packet_count من أ TcpConnection يتم حساب الكائن من نفس سماتها من اثنين من المكونات TcpStream الكائنات، والتي بدورها محسوبة من المكونات الخاصة بهم TcpPacket أشياء.

  • أ Invoices كائن قد يكون total وهو أساسا مجموع () من مكونها InvoiceLineItems"الأسعار، مع القليل من الشحن والخصم ومنطق الضرائب التي ألقيت فيها.

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

كيف تقرر، قبل أن تجبر الأداء على يدك، سواء "تشجيع" سمات مشتقة إلى الحقول المعبدة مسبقا؟

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

المحلول

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

  1. راحة: على سبيل المثال إذا كانت تطبيقان عميلان مختلفان تريد حساب نفس السمات المشتقة، فسيحصل كلاهما على الاستعلامات لحسابها. يوفر Denormalization تطبيقات العميل السمة المشتقة بطريقة أبسط.
  2. الاستقرار مع مرور الوقت: على سبيل المثال إذا كانت الصيغة لحساب السمة المشتقة قابلة للتغيير، تتيح لك التشكيز التقاط وتجرها القيمة المشتقة في نقطة في الوقت المناسب، لذا فإن الحسابات المستقبلية لن تحصل على خطأ
  3. استفسارات أبسط: إضافة تعقيد إلى هيكل DB، يمكن أن يعني استعلام SELECT الخاص بك هو أبسط في نهاية العميل.
  4. أداء: حدد الاستعلامات على البيانات الشورمية يمكن أن تكون أسرع.

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

نصائح أخرى

أساسا، أنت لا تفعل ذلك. تركت مخاوف الأداء تجبر يدك.

هذا هو أفضل إجابة لأن 99٪ من الوقت، يجب عليك ليس كن مسبقا مثاليا مثل هذا، من الأفضل أن يحملها على الطيران.

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

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

كيف يجب أن تحدد البيانات الحالية كيفية تطبيقها، حقا.

سأفترض 2 ولايات بسيطة: الحالية أو غير التيار.

  • الحالي: المشاهدات المفهرسة، المشغلات، المخزنة Procs للحفاظ على الجداول الإجمالية وغيرها
  • غير موجود: لقطات خدمة التقارير، سجل الشحن / النسخ المتماثل، مستودع البيانات وغيرها

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

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