14 شيئًا أتمنى أن أعرفها قبل البدء في استخدام MongoDB

تم إعداد ترجمة المقال عشية بدء الدورة "قواعد البيانات غير العلائقية".

14 شيئًا أتمنى أن أعرفها قبل البدء في استخدام MongoDB

أبرز الملامح:

  • من المهم للغاية تطوير مخطط على الرغم من أنه اختياري في MongoDB.
  • وبالمثل، يجب أن تتطابق الفهارس مع مخططك وأنماط الوصول.
  • تجنب استخدام الكائنات الكبيرة والمصفوفات الكبيرة.
  • كن حذرًا مع إعدادات MongoDB، خاصة عندما يتعلق الأمر بالأمان والموثوقية.
  • لا يحتوي MongoDB على مُحسِّن استعلام، لذا يجب عليك توخي الحذر عند إجراء عمليات الاستعلام.

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

إنشاء خادم MongoDB بدون مصادقة

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

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

لا تنس ربط سطح الهجوم الخاص بك بـ MongoDB

قائمة التحقق من أمان MongoDB يحتوي على نصائح جيدة لتقليل مخاطر اقتحام الشبكة وتسرب البيانات. من السهل تجاهل الأمر والقول إن خادم التطوير لا يحتاج إلى مستوى عالٍ من الأمان. ومع ذلك، الأمر ليس بهذه البساطة وينطبق على جميع خوادم MongoDB. وخاصة إذا لم يكن هناك سبب مقنع للاستخدام mapReduce, group أو $ أين، تحتاج إلى تعطيل استخدام التعليمات البرمجية التعسفية في JavaScript عن طريق الكتابة في ملف التكوين javascriptEnabled:false. نظرًا لأن ملفات البيانات غير مشفرة في MongoDB القياسي، فمن المنطقي تشغيل MongoDB باستخدام مستخدم مخصص، الذي يتمتع بحق الوصول الكامل إلى الملفات، مع وصول محدود إليها فقط والقدرة على استخدام عناصر التحكم في الوصول إلى الملفات الخاصة بنظام التشغيل.

خطأ أثناء تطوير الدائرة

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

مقالة كلاسيكية "6 قواعد أساسية لتصميم مخطط MongoDB" إنه يستحق القراءة، وميزات مثل مستكشف المخطط في أداة Studio 3T التابعة لجهة خارجية، يجدر استخدامها لإجراء فحوصات منتظمة للدوائر.

لا تنسى ترتيب الفرز

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

إنشاء مجموعات بمستندات كبيرة

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

إنشاء مستندات بمصفوفات كبيرة

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

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

لا تنس أن ترتيب المراحل في التجميع مهم

في نظام قاعدة البيانات الذي يحتوي على مُحسِّن الاستعلامات، تكون الاستعلامات التي تكتبها عبارة عن تفسيرات لما تريد الحصول عليه، وليس كيفية الحصول عليه. تعمل هذه الآلية بالقياس على الطلب في المطعم: عادةً ما تقوم ببساطة بطلب طبق، ولا تعطي تعليمات مفصلة للطاهي.

في MongoDB، تقوم بإرشاد الطباخ. على سبيل المثال، تحتاج إلى التأكد من مرور البيانات reduce في أقرب وقت ممكن في خط الأنابيب باستخدام $match и $project، ولا يتم الفرز إلا بعد ذلك reduce، وأن يتم البحث بالترتيب الذي تريده بالضبط. إن وجود مُحسِّن الاستعلام الذي يلغي العمل غير الضروري، ويتسلسل الخطوات على النحو الأمثل، ويحدد أنواع الانضمام يمكن أن يفسدك. مع MongoDB، لديك المزيد من التحكم على حساب الراحة.

أدوات مثل استوديو 3T سوف تبسيط بناء استعلامات التجميع في MongoDB. تتيح لك ميزة محرر التجميع تطبيق بيانات خطوط الأنابيب مرحلة واحدة في كل مرة، وفحص بيانات الإدخال والإخراج في كل مرحلة لتبسيط عملية تصحيح الأخطاء.

استخدام التسجيل السريع

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

تستخدم محركات التخزين MMAPv1 وWiredTiger التسجيل لمنع ذلك، على الرغم من أن WiredTiger يمكنه التعافي حتى آخر مرة متسقة نقطة تحكم، إذا تم تعطيل التسجيل.

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

للتأكد من الإدخالات، تأكد من تمكين التسجيل في ملف التكوين (storage.journal.enabled)، ويتوافق تكرار التسجيلات مع كمية المعلومات التي يمكنك تحمل خسارتها.

الترتيب بدون فهرس

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

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

البحث بدون دعم الفهرس

تؤدي استعلامات البحث وظيفة مشابهة لعملية JOIN في SQL. للعمل بشكل أفضل، يحتاجون إلى فهرس قيمة المفتاح المستخدم كمفتاح خارجي. وهذا ليس واضحا لأن الاستخدام لا ينعكس في explain(). هذه المؤشرات بالإضافة إلى الفهرس المكتوب فيه explain()والذي بدوره يستخدمه مشغلو خطوط الأنابيب $match и $sort، عندما يجتمعون في بداية خط الأنابيب. يمكن للفهارس الآن أن تغطي أي مرحلة خط أنابيب التجميع.

إلغاء الاشتراك في استخدام التحديثات المتعددة

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

لا تنس أهمية ترتيب المفاتيح في جدول التجزئة

في JSON، يتكون الكائن من مجموعة غير مرتبة بحجم صفر أو أكثر من أزواج الاسم/القيمة، حيث الاسم عبارة عن سلسلة والقيمة عبارة عن سلسلة أو رقم أو منطقية أو فارغة أو كائن أو صفيف.

لسوء الحظ، BSON يركز كثيرًا على الترتيب عند البحث. في MongoDB، ترتيب المفاتيح داخل الكائنات المضمنة المسائلأي { firstname: "Phil", surname: "factor" } - ليس هو نفسه { { surname: "factor", firstname: "Phil" }. أي أنه يجب عليك تخزين ترتيب أزواج الاسم/القيمة في مستنداتك إذا كنت تريد التأكد من العثور عليها.

لا تخلط بين "باطل" и "غير معرف"

قيمة "غير معرف" لم يكن صالحًا أبدًا في JSON، وفقًا لـ المعيار الرسمي JSON (ECMA-404 القسم 5)، على الرغم من استخدامه في JavaScript. علاوة على ذلك، بالنسبة لـ BSON فقد عفا عليه الزمن وتم تحويله إلى $null، وهو ليس حلاً جيدًا دائمًا. تجنب استخدام "غير معرف" في مونغو دي بي.

استخدام $limit() بدون $sort()

في كثير من الأحيان، عندما تقوم بالتطوير في MongoDB، من المفيد رؤية عينة من النتيجة التي سيتم إرجاعها من استعلام أو تجميع. لهذه المهمة سوف تحتاج $limit()، ولكن لا يجب أن يكون موجودًا في الكود النهائي إلا إذا استخدمته من قبل $sort. تعد هذه الآلية ضرورية لأنه بخلاف ذلك لا يمكنك ضمان ترتيب النتيجة، ولن تتمكن من عرض البيانات بشكل موثوق. في الجزء العلوي من النتيجة سوف تحصل على إدخالات مختلفة اعتمادا على الفرز. للعمل بشكل موثوق، يجب أن تكون الاستعلامات والتجميعات حتمية، أي أن تنتج نفس النتائج في كل مرة يتم تنفيذها. الكود الذي يحتوي على $limit()، لكن لا $sort، لن تكون حتمية وقد تتسبب لاحقًا في حدوث أخطاء سيكون من الصعب تعقبها.

اختتام

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

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

14 شيئًا أتمنى أن أعرفها قبل البدء في استخدام MongoDB

اقرأ أكثر:

المصدر: www.habr.com

إضافة تعليق