سؤال

أنا أستخدم Firebird 2.1 وأبحث عن أفضل طريقة لحل هذه المشكلة.

أنا أكتب طلب التقويم. يتم تخزين إدخالات تقويم المستخدمين المختلفين في جدول تقويم كبير. يمكن أن يكون لكل إدخال تقويمي مجموعة تذكير - تذكير واحد/إدخال واحد فقط.

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

أحتاج إلى الاستعلام عن التذكير على أساس ثابت.

ما هو الخيار الأفضل؟

أ) قم بتخزين معلومات التذكير في جدول التقويم (وفي هذه الحالة سأستفسر عن مئات الآلاف من السجلات لـ Isreminder = 1)

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

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

ما رأيك؟

وسؤال واحد آخر: سيحتوي جدول التقويم على تقويم المستخدمين المتعددين ، مفصولة فقط بحقل معرف المستخدم. نظرًا لأنه يمكن أن يكون هناك 4-5 مستخدمين فقط ، حتى لو وضعت فهرسًا في هذا الحقل ، ستكون الانتقائية سيئة للغاية - وهو أمر غير جيد لجدول بمئات الآلاف من السجلات. هل هناك حل بديل هنا؟

شكرًا!

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

المحلول

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

إذا كان الأمر أنا ، فسأذهب باختيار B. سأخزن أيضًا أي سمات للتذكير في الجدول للتذكير.

كن حذرًا جدًا بشأن ما إذا كنت تحدد حدثًا حسب EventId وحده أو بواسطة (userId ، EventId). إذا اخترت هذا الأخير ، فسيؤدي ذلك إلى استخدام مفتاح أساسي مركب لجدول الحدث. لا تقلق كثيرًا بشأن المفاتيح الأولية المركبة ، خاصة مع Firebird.
إذا أعلنت مفتاحًا أساسيًا مركبًا ، فاحرص على أن الإعلان (userId ، eventID) لن يكون له نفس العواقب التي يعلنها (EventId ، userId). فهي مكافئة منطقيا ، لكن هيكل الفهرس الذي تم إنشاؤه تلقائيًا سيكون مختلفًا في الحالتين.

وهذا بدوره سيؤثر على سرعة الاستعلامات مثل "العثور على جميع التذكيرات لمستخدم معين".

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

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

نصائح أخرى

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

يمكن أن تحدث فهرسة وتحسين الاستعلام وأنواع نتائج الاستعلام التي تحتاجها فرقًا كبيرًا ، لذلك ليس من السهل تحديد ما هو أفضل دون معرفة المزيد.

عند اختيار الخيار (أ) يجب عليك

  • قدم فهرسًا على "isreminder" (أو فهرس مشترك على isReminder ، userId ، أيا كان الأفضل لاستفساراتك المقصودة)
  • تأكد من استخدام استفساراتك هذا الفهرس

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

إذا أمكنك ذلك ، تجنب الخيار C. إذا كنت لا ترغب في تحديد الحالات الثلاث ، أقترح البدء بـ A أو B ، وفقًا للظروف الموصوفة ، وربما يكون الحل الذي تختاره سريعًا بما فيه الكفاية ، لذلك لا تفعل ذلك يجب أن تهتم بالحالات الأخرى.

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