14 πράγματα που θα ήθελα να ήξερα πριν ξεκινήσω με το MongoDB

Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος "Μη σχεσιακές βάσεις δεδομένων".

14 πράγματα που θα ήθελα να ήξερα πριν ξεκινήσω με το MongoDB

Χαρακτηριστικά:

  • Είναι εξαιρετικά σημαντικό να αναπτύξετε ένα σχήμα παρόλο που είναι προαιρετικό στο MongoDB.
  • Ομοίως, τα ευρετήρια πρέπει να ταιριάζουν με το σχήμα και τα μοτίβα πρόσβασης.
  • Αποφύγετε τη χρήση μεγάλων αντικειμένων και μεγάλων συστοιχιών.
  • Να είστε προσεκτικοί με τις ρυθμίσεις MongoDB, ειδικά όταν πρόκειται για ασφάλεια και αξιοπιστία.
  • Το MongoDB δεν διαθέτει βελτιστοποιητή ερωτημάτων, επομένως πρέπει να είστε προσεκτικοί όταν εκτελείτε λειτουργίες ερωτήματος.

Δουλεύω με βάσεις δεδομένων για πολύ καιρό, αλλά μόλις πρόσφατα ανακάλυψα το MongoDB. Υπάρχουν μερικά πράγματα που θα ήθελα να ήξερα πριν ξεκινήσω να ασχολούμαι με αυτό. Όταν ένα άτομο έχει ήδη εμπειρία σε έναν συγκεκριμένο τομέα, έχει προκαταλήψεις σχετικά με το τι είναι οι βάσεις δεδομένων και τι κάνουν. Με την ελπίδα να διευκολύνω τους άλλους να καταλάβουν, παρουσιάζω μια λίστα με κοινά λάθη.

Δημιουργία διακομιστή MongoDB χωρίς έλεγχο ταυτότητας

Δυστυχώς, το MongoDB είναι εγκατεστημένο χωρίς έλεγχο ταυτότητας από προεπιλογή. Για έναν σταθμό εργασίας με τοπική πρόσβαση, αυτή η πρακτική είναι φυσιολογική. Αλλά επειδή το MongoDB είναι ένα σύστημα πολλών χρηστών που του αρέσει να χρησιμοποιεί μεγάλες ποσότητες μνήμης, θα είναι καλύτερο να το τοποθετήσετε σε έναν διακομιστή με όσο το δυνατόν περισσότερη μνήμη RAM, ακόμα κι αν πρόκειται να το χρησιμοποιήσετε μόνο για ανάπτυξη. Η εγκατάσταση στον διακομιστή μέσω της προεπιλεγμένης θύρας μπορεί να είναι προβληματική, ειδικά εάν μπορεί να εκτελεστεί οποιοσδήποτε κώδικας javascript στο αίτημα (για παράδειγμα, $where ως ιδέα για ενέσεις).

Υπάρχουν πολλές μέθοδοι ελέγχου ταυτότητας, αλλά η πιο εύκολη είναι να ορίσετε ένα αναγνωριστικό χρήστη/κωδικό πρόσβασης. Χρησιμοποιήστε αυτήν την ιδέα ενώ σκέφτεστε τον φανταχτερό έλεγχο ταυτότητας βάσει LDAP. Όσον αφορά την ασφάλεια, το MongoDB θα πρέπει να ενημερώνεται συνεχώς και τα αρχεία καταγραφής θα πρέπει πάντα να ελέγχονται για μη εξουσιοδοτημένη πρόσβαση. Για παράδειγμα, μου αρέσει να επιλέγω μια διαφορετική θύρα ως προεπιλεγμένη θύρα.

Μην ξεχάσετε να συνδέσετε την επιφάνεια επίθεσης στο MongoDB

Λίστα ελέγχου ασφάλειας MongoDB περιέχει καλές συμβουλές για τη μείωση του κινδύνου εισβολής στο δίκτυο και διαρροής δεδομένων. Είναι εύκολο να το ξεπεράσεις και να πεις ότι ένας διακομιστής ανάπτυξης δεν χρειάζεται υψηλό επίπεδο ασφάλειας. Ωστόσο, δεν είναι τόσο απλό και αυτό ισχύει για όλους τους διακομιστές MongoDB. Ειδικότερα, εάν δεν υπάρχει επιτακτικός λόγος χρήσης mapReduce, group ή $όπου, πρέπει να απενεργοποιήσετε τη χρήση αυθαίρετου κώδικα σε JavaScript γράφοντας στο αρχείο διαμόρφωσης javascriptEnabled:false. Δεδομένου ότι τα αρχεία δεδομένων δεν είναι κρυπτογραφημένα στο τυπικό MongoDB, είναι λογικό να εκτελείτε το MongoDB με Αφιερωμένος χρήστης, το οποίο έχει πλήρη πρόσβαση σε αρχεία, με περιορισμένη πρόσβαση μόνο σε αυτό και δυνατότητα χρήσης των στοιχείων ελέγχου πρόσβασης αρχείων του ίδιου του λειτουργικού συστήματος.

Σφάλμα κατά την ανάπτυξη του κυκλώματος

Το MongoDB δεν χρησιμοποιεί σχήμα. Αυτό όμως δεν σημαίνει ότι το σύστημα δεν χρειάζεται. Εάν θέλετε απλώς να αποθηκεύσετε έγγραφα χωρίς σταθερό μοτίβο, η αποθήκευση τους μπορεί να είναι γρήγορη και εύκολη, αλλά η ανάκτησή τους αργότερα μπορεί να είναι δύσκολη. καταρα σκληρα.

Κλασικό άρθρο "6 εμπειρικοί κανόνες για τη σχεδίαση σχήματος MongoDB" Αξίζει να το διαβάσετε και χαρακτηριστικά όπως Schema Explorer στο εργαλείο τρίτου κατασκευαστή Studio 3T, αξίζει να το χρησιμοποιήσετε για τακτικούς ελέγχους κυκλωμάτων.

Μην ξεχνάτε τη σειρά ταξινόμησης

Το να ξεχάσετε τη σειρά ταξινόμησης μπορεί να προκαλέσει περισσότερη απογοήτευση και χάσιμο περισσότερου χρόνου από οποιαδήποτε άλλη εσφαλμένη διαμόρφωση. Από προεπιλογή χρησιμοποιεί MongoBD δυαδική ταξινόμηση. Αλλά είναι απίθανο να είναι χρήσιμο σε κανέναν. Τα πεζά και πεζά, ευαίσθητα στην προφορά, δυαδικά είδη θεωρούνταν περίεργοι αναχρονισμοί μαζί με χάντρες, καφτάνια και σγουρά μουστάκια στη δεκαετία του '80 του περασμένου αιώνα. Τώρα η χρήση τους είναι ασυγχώρητη. Στην πραγματική ζωή, η «μοτοσικλέτα» είναι η ίδια με τη «μοτοσικλέτα». Και η «Βρετανία» και η «Βρετανία» είναι το ίδιο μέρος. Ένα πεζό γράμμα είναι απλώς το κεφαλαίο ισοδύναμο ενός κεφαλαίου. Και μη με κάνετε να αρχίσω να ταξινομώ διακρίσεις. Όταν δημιουργείτε μια βάση δεδομένων στο MongoDB, χρησιμοποιήστε συγκρίσεις χωρίς έμφαση και κανω ΕΓΓΡΑΦΗ, που αντιστοιχούν στη γλώσσα και την κουλτούρα των χρηστών του συστήματος. Αυτό θα κάνει την αναζήτηση μέσω των δεδομένων συμβολοσειράς πολύ πιο εύκολη.

Δημιουργήστε συλλογές με μεγάλα έγγραφα

Η MongoDB είναι στην ευχάριστη θέση να φιλοξενεί μεγάλα έγγραφα έως 16MB σε συλλογές και GridFS Σχεδιασμένο για μεγάλα έγγραφα μεγαλύτερα από 16 MB. Αλλά μόνο και μόνο επειδή μπορούν να τοποθετηθούν μεγάλα έγγραφα εκεί, η αποθήκευση τους εκεί δεν είναι καλή ιδέα. Το MongoDB θα λειτουργήσει καλύτερα εάν αποθηκεύετε μεμονωμένα έγγραφα μεγέθους μερικών kilobyte, αντιμετωπίζοντάς τα περισσότερο σαν σειρές σε έναν ευρύ πίνακα SQL. Τα μεγάλα έγγραφα θα αποτελέσουν πηγή προβλημάτων παραγωγικότητα.

Δημιουργία εγγράφων με μεγάλες συστοιχίες

Τα έγγραφα μπορεί να περιέχουν πίνακες. Είναι καλύτερο εάν ο αριθμός των στοιχείων στον πίνακα απέχει πολύ από έναν τετραψήφιο αριθμό. Εάν τα στοιχεία προστίθενται συχνά σε έναν πίνακα, θα ξεπεράσει το έγγραφο που τον περιέχει και θα πρέπει να είναι κίνηση, πράγμα που σημαίνει ότι θα είναι απαραίτητο ενημέρωση ευρετηρίων επίσης. Κατά την εκ νέου ευρετηρίαση ενός εγγράφου με μεγάλο πίνακα, τα ευρετήρια συχνά αντικαθίστανται, καθώς υπάρχει ρεκόρ, το οποίο αποθηκεύει το ευρετήριό του. Αυτή η εκ νέου ευρετηρίαση πραγματοποιείται επίσης όταν εισάγεται ή διαγράφεται ένα έγγραφο.

Το MongoDB έχει κάτι που λέγεται "συντελεστής πλήρωσης", το οποίο παρέχει χώρο για ανάπτυξη εγγράφων για την ελαχιστοποίηση αυτού του προβλήματος.
Ίσως νομίζετε ότι μπορείτε να κάνετε χωρίς ευρετηρίαση πίνακα. Δυστυχώς, η έλλειψη ευρετηρίων μπορεί να σας προκαλέσει άλλα προβλήματα. Δεδομένου ότι τα έγγραφα σαρώνονται από την αρχή μέχρι το τέλος, η αναζήτηση στοιχείων στο τέλος του πίνακα θα διαρκέσει περισσότερο και οι περισσότερες λειτουργίες που σχετίζονται με ένα τέτοιο έγγραφο θα είναι αργός.

Μην ξεχνάτε ότι η σειρά των σταδίων σε μια συγκέντρωση έχει σημασία

Σε ένα σύστημα βάσης δεδομένων με βελτιστοποιητή ερωτημάτων, τα ερωτήματα που γράφετε είναι επεξηγήσεις του τι θέλετε να λάβετε, όχι πώς να το αποκτήσετε. Αυτός ο μηχανισμός λειτουργεί αναλογικά με την παραγγελία σε ένα εστιατόριο: συνήθως παραγγέλνετε απλώς ένα πιάτο και δεν δίνετε λεπτομερείς οδηγίες στον μάγειρα.

Στο MongoDB, δίνετε οδηγίες στον μάγειρα. Για παράδειγμα, πρέπει να βεβαιωθείτε ότι τα δεδομένα περνούν reduce όσο το δυνατόν νωρίτερα στην κυκλοφορία χρησιμοποιώντας $match и $project, και η ταξινόμηση γίνεται μόνο μετά reduce, και ότι η αναζήτηση γίνεται με τη σειρά που θέλετε. Το να έχετε ένα πρόγραμμα βελτιστοποίησης ερωτημάτων που εξαλείφει την περιττή εργασία, ταξινομεί βέλτιστα τα βήματα και επιλέγει τύπους ένωσης μπορεί να σας χαλάσει. Με το MongoDB, έχετε περισσότερο έλεγχο με το κόστος της ευκολίας.

Εργαλεία όπως Στούντιο 3Τ θα απλοποιήσει την κατασκευή των ερωτημάτων συγκέντρωσης σε MongoDB. Η δυνατότητα "Aggregation Editor" σάς επιτρέπει να εφαρμόζετε δηλώσεις διοχέτευσης ένα στάδιο κάθε φορά και να επιθεωρείτε δεδομένα εισόδου και εξόδου σε κάθε στάδιο για να απλοποιήσετε τον εντοπισμό σφαλμάτων.

Χρήση γρήγορης εγγραφής

Ποτέ μην ορίζετε τις επιλογές εγγραφής MongoDB ώστε να έχουν υψηλή ταχύτητα αλλά χαμηλή αξιοπιστία. Αυτή η λειτουργία "αρχειο-και-ξεχασε" φαίνεται γρήγορο γιατί η εντολή επιστρέφεται πριν γίνει η εγγραφή. Εάν το σύστημα διακοπεί πριν εγγραφούν τα δεδομένα στο δίσκο, θα χαθεί και θα καταλήξει σε ασυνεπή κατάσταση. Ευτυχώς, το MongoDB 64-bit έχει ενεργοποιημένη την καταγραφή.

Οι μηχανές αποθήκευσης MMAPv1 και WiredTiger χρησιμοποιούν καταγραφή για να το αποτρέψουν αυτό, αν και το WiredTiger μπορεί να ανακτήσει μέχρι την τελευταία συνεπή σημείο ελέγχου, εάν η καταγραφή είναι απενεργοποιημένη.

Το journaling διασφαλίζει ότι η βάση δεδομένων είναι σε συνεπή κατάσταση μετά την ανάκτηση και διατηρεί όλα τα δεδομένα μέχρι να εγγραφεί στο αρχείο καταγραφής. Η συχνότητα των εγγραφών διαμορφώνεται χρησιμοποιώντας την παράμετρο commitIntervalMs.

Για να είστε σίγουροι για τις καταχωρήσεις, βεβαιωθείτε ότι η καταγραφή είναι ενεργοποιημένη στο αρχείο διαμόρφωσης (storage.journal.enabled), και η συχνότητα των εγγραφών αντιστοιχεί στον όγκο των πληροφοριών που έχετε την πολυτέλεια να χάσετε.

Ταξινόμηση χωρίς ευρετήριο

Κατά την αναζήτηση και τη συγκέντρωση, συχνά υπάρχει ανάγκη ταξινόμησης δεδομένων. Ας ελπίσουμε ότι αυτό θα γίνει σε ένα από τα τελικά στάδια, αφού φιλτράρουμε το αποτέλεσμα, προκειμένου να μειωθεί ο όγκος των δεδομένων που ταξινομούνται. Και ακόμη και σε αυτή την περίπτωση, για ταξινόμηση θα χρειαστείτε δείκτη. Μπορείτε να χρησιμοποιήσετε έναν απλό ή σύνθετο δείκτη.

Εάν δεν υπάρχει κατάλληλο ευρετήριο, το MongoDB θα κάνει χωρίς αυτό. Υπάρχει όριο μνήμης 32 MB για το συνολικό μέγεθος όλων των εγγράφων εργασίες διαλογής, και αν το MongoDB φτάσει αυτό το όριο, τότε είτε θα εμφανίσει σφάλμα είτε θα επιστρέψει κενό σύνολο εγγραφών.

Αναζήτηση χωρίς υποστήριξη ευρετηρίου

Τα ερωτήματα αναζήτησης εκτελούν μια λειτουργία παρόμοια με τη λειτουργία JOIN στην SQL. Για να λειτουργήσουν καλύτερα, χρειάζονται το ευρετήριο της τιμής του κλειδιού που χρησιμοποιείται ως ξένο κλειδί. Αυτό δεν είναι προφανές γιατί η χρήση δεν αντικατοπτρίζεται explain(). Τέτοιοι δείκτες είναι επιπλέον του ευρετηρίου που είναι γραμμένο explain(), το οποίο με τη σειρά του χρησιμοποιείται από τους φορείς εκμετάλλευσης αγωγών $match и $sort, όταν συναντώνται στην αρχή του αγωγού. Τα ευρετήρια μπορούν πλέον να καλύψουν οποιοδήποτε στάδιο αγωγός συσσώρευσης.

Εξαίρεση από τη χρήση πολλαπλών ενημερώσεων

Μέθοδος db.collection.update() χρησιμοποιείται για την αλλαγή μέρους ενός υπάρχοντος εγγράφου ή ολόκληρου του εγγράφου, έως την πλήρη αντικατάσταση, ανάλογα με την παράμετρο που καθορίζετε update. Αυτό που δεν είναι τόσο προφανές είναι ότι δεν θα επεξεργαστεί όλα τα έγγραφα της συλλογής εκτός και αν ορίσετε την επιλογή multi για την ενημέρωση όλων των εγγράφων που πληρούν τα κριτήρια αιτήματος.

Μην ξεχνάτε τη σημασία της σειράς των κλειδιών σε έναν πίνακα κατακερματισμού

Στο JSON, ένα αντικείμενο αποτελείται από μια μη ταξινομημένη συλλογή με μέγεθος μηδέν ή περισσότερα ζεύγη ονόματος/τιμής, όπου το όνομα είναι μια συμβολοσειρά και η τιμή είναι μια συμβολοσειρά, αριθμός, boolean, null, αντικείμενο ή πίνακας.

Δυστυχώς, η BSON δίνει μεγάλη έμφαση στη σειρά κατά την αναζήτηση. Στο MongoDB, η σειρά των κλειδιών μέσα σε ενσωματωμένα αντικείμενα θέματα, δηλ. { firstname: "Phil", surname: "factor" } - αυτό δεν είναι το ίδιο με { { surname: "factor", firstname: "Phil" }. Δηλαδή, πρέπει να αποθηκεύσετε τη σειρά των ζευγών ονόματος/τιμής στα έγγραφά σας εάν θέλετε να είστε σίγουροι ότι θα τα βρείτε.

Μην μπερδεύεστε μηδενικό и "απροσδιόριστος"

Αξία "απροσδιόριστος" δεν ήταν ποτέ έγκυρη σε JSON, σύμφωνα με επίσημο πρότυπο JSON (ECMA-404 Section 5), παρόλο που χρησιμοποιείται σε JavaScript. Επιπλέον, για το BSON είναι ξεπερασμένο και μετατρέπεται σε $null, που δεν είναι πάντα καλή λύση. Αποφύγετε τη χρήση "απροσδιόριστος" στο MongoDB.

Χρήση $limit() χωρίς $sort()

Πολύ συχνά, όταν αναπτύσσετε στο MongoDB, είναι χρήσιμο να βλέπετε απλώς ένα δείγμα του αποτελέσματος που θα επιστραφεί από ένα ερώτημα ή μια συγκέντρωση. Για αυτήν την εργασία θα χρειαστείτε $limit(), αλλά δεν πρέπει ποτέ να βρίσκεται στον τελικό κωδικό, εκτός και αν τον έχετε χρησιμοποιήσει πριν $sort. Αυτός ο μηχανικός είναι απαραίτητος γιατί διαφορετικά δεν μπορείτε να εγγυηθείτε τη σειρά του αποτελέσματος και δεν θα μπορείτε να προβάλετε αξιόπιστα τα δεδομένα. Στην κορυφή του αποτελέσματος θα λάβετε διαφορετικές καταχωρήσεις ανάλογα με την ταξινόμηση. Για να λειτουργούν αξιόπιστα, τα ερωτήματα και οι συναθροίσεις πρέπει να είναι ντετερμινιστικά, δηλαδή να παράγουν τα ίδια αποτελέσματα κάθε φορά που εκτελούνται. Κωδικός που περιέχει $limit(), αλλά όχι $sort, δεν θα είναι ντετερμινιστικό και μπορεί στη συνέχεια να προκαλέσει σφάλματα που θα είναι δύσκολο να εντοπιστούν.

Συμπέρασμα

Ο μόνος τρόπος για να απογοητευτείτε με το MongoDB είναι να το συγκρίνετε απευθείας με έναν άλλο τύπο βάσης δεδομένων, όπως ένα DBMS, ή να αρχίσετε να το χρησιμοποιείτε με βάση ορισμένες προσδοκίες. Είναι σαν να συγκρίνεις ένα πορτοκάλι με ένα πιρούνι. Τα συστήματα βάσεων δεδομένων εξυπηρετούν συγκεκριμένους σκοπούς. Είναι καλύτερο να κατανοήσετε και να εκτιμήσετε μόνοι σας αυτές τις διαφορές. Θα ήταν κρίμα να πιέσουμε τους προγραμματιστές του MongoDB για μια διαδρομή που τους ανάγκασε να ακολουθήσουν τη διαδρομή DBMS. Θέλω να δω νέους και ενδιαφέροντες τρόπους επίλυσης παλαιών προβλημάτων, όπως η διασφάλιση της ακεραιότητας των δεδομένων και η δημιουργία συστημάτων δεδομένων που να είναι ανθεκτικά σε αποτυχίες και κακόβουλες επιθέσεις.

Η εισαγωγή της συναλλακτικότητας ACID από την MongoDB στην έκδοση 4.0 είναι ένα καλό παράδειγμα εισαγωγής σημαντικών βελτιώσεων με καινοτόμο τρόπο. Οι συναλλαγές πολλαπλών εγγράφων και πολλαπλών δηλώσεων είναι πλέον ατομικές. Είναι επίσης δυνατή η προσαρμογή του χρόνου που απαιτείται για την απόκτηση κλειδαριών και τον τερματισμό των κολλημένων συναλλαγών, καθώς και την αλλαγή του επιπέδου απομόνωσης.

14 πράγματα που θα ήθελα να ήξερα πριν ξεκινήσω με το MongoDB

Διαβάστε περισσότερα:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο