Προγραμματισμός

Ανασκόπηση: Το MongoDB αναλαμβάνει τον κόσμο

Εάν έχετε δημιουργήσει μια εφαρμογή ιστού μεσαίου έως μεγάλου μεγέθους τα τελευταία χρόνια, πιθανώς σκεφτήκατε να βασιστείτε στη στοίβα ανοιχτού κώδικα LAMP ή MEAN. Η παλαιότερη στοίβα LAMP χρησιμοποιεί το λειτουργικό σύστημα Linux, τον διακομιστή ιστού Apache, τη σχεσιακή βάση δεδομένων MySQL και τη γλώσσα προγραμματισμού PHP. Το MEAN χρησιμοποιεί τη βάση δεδομένων NoSQL MongoDB, το πλαίσιο εφαρμογής web back-end Express, την πλατφόρμα γωνιακής εφαρμογής και τον χρόνο εκτέλεσης JavaScript Node.js. Το MEAN είναι ουσιαστικά μια στοίβα JavaScript από άκρο σε άκρο. Το Linux δεν αναφέρεται ρητά στο ακρωνύμιο, αλλά συνήθως είναι το λειτουργικό σύστημα κάτω από τον κόμβο.

Σε αυτήν την κριτική, θα συζητήσω τη βάση δεδομένων MongoDB, τώρα στην έκδοση 4. Το MongoDB είναι μια εξαιρετικά επεκτάσιμη, λειτουργική βάση δεδομένων διαθέσιμη τόσο σε ανοιχτές πηγές όσο και σε εμπορικές εκδόσεις επιχειρήσεων και μπορεί να εκτελεστεί εσωτερικά ή ως διαχειριζόμενη υπηρεσία cloud. Η διαχειριζόμενη υπηρεσία cloud ονομάζεται MongoDB Atlas.

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

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

Η προέλευση του MongoDB

Η εταιρεία πίσω από το MongoDB ιδρύθηκε το 2007 ως 10gen από μια ομάδα που ήταν πίσω από το DoubleClick, την εταιρεία διαφήμισης στο Διαδίκτυο. Το αρχικό κίνητρο για τη βάση δεδομένων MongoDB ήταν να είναι σε θέση να χειριστεί την ευελιξία και την κλίμακα που απαιτούνται για τη διαφήμιση στο Διαδίκτυο. Ως παράδειγμα κλίμακας, το DoubleClick παρουσίασε 400.000 διαφημίσεις ανά δευτερόλεπτο το 2007 και προσπάθησε να εκτελέσει τις υπάρχουσες βάσεις δεδομένων της εποχής.

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

Μερικοί από τους κύριους ανταγωνιστές της NoSQL στο MongoDB ως λειτουργικές βάσεις δεδομένων είναι το Amazon DynamoDB (κατάστημα κλειδιού-τιμής), το Google Cloud BigTable (κατάστημα στηλών), το Google Cloud Datastore (κατάστημα εγγράφων), το Redis (στη μνήμη, το κλειδί-τιμή), το Couchbase (κλειδί-τιμή πολλαπλών μοντέλων και αποθήκευση εγγράφων), DataStax / Cassandra (αποθήκευση στηλών) και Azure Cosmos DB (πολλαπλών μοντέλων που περιλαμβάνουν μια επιλογή SQL καθώς και πολλά καταστήματα NoSQL).

Τι είναι το MongoDB;

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

Αντί να αποθηκεύει έντονα δακτυλογραφημένα δεδομένα σε σχετικούς κανονικοποιημένους πίνακες με σταθερά σχήματα όπως μια σχεσιακή βάση δεδομένων, μια βάση δεδομένων εγγράφων αποθηκεύει σχετικά δεδομένα σε απο-κανονικοποιημένη μορφή ενσωματωμένα σε έγγραφα ονομασίας-τιμής τύπου JSON. Το MongoDB δεν αποθηκεύει πραγματικά το JSON, ωστόσο: Το MongoDB αποθηκεύει το BSON (Binary JSON), το οποίο επεκτείνει την παράσταση JSON (συμβολοσειρές) για να συμπεριλάβει επιπλέον τύπους όπως int, μακρύς, ημερομηνία, κυμαινόμενο σημείο, δεκαδικό128, και γεωχωρικές συντεταγμένες, όπως φαίνεται στο παρακάτω διάγραμμα. Τα έγγραφα BSON περιέχουν ένα ή περισσότερα πεδία και κάθε πεδίο περιέχει μια τιμή ενός συγκεκριμένου τύπου δεδομένων, συμπεριλαμβανομένων συστοιχιών, δυαδικών δεδομένων και δευτερευόντων εγγράφων. Το BSON παρακολουθεί επίσης το μέγεθος κάθε εγγράφου, ώστε να επιτρέπει αποτελεσματική αναζήτηση.

MongoDB

Η πληκτρολόγηση BSON τροφοδοτεί την ευρετηρίαση των πεδίων. Το MongoDB μπορεί να δημιουργήσει ευρετήρια πολλαπλών τρόπων γραφικών, γεωχωρικών, B-tree και πλήρους κειμένου σε ένα αντίγραφο των δεδομένων, χρησιμοποιώντας τον τύπο των δεδομένων για τη δημιουργία του σωστού τύπου ευρετηρίου. Το MongoDB σάς επιτρέπει να δημιουργείτε ευρετήρια σε οποιοδήποτε πεδίο εγγράφου.

MongoDB

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

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

Για αυτό που αξίζει, οι εκπρόσωποι της MongoDB μου είπαν ότι οι συναλλαγές ενός εγγράφου χειρίζονται το 90% των περιπτώσεων χρήσης που χρειάζονται ιδιότητες ACID. Όταν οι πελάτες χρειάζονταν ACID για συναλλαγές πολλών εγγράφων πριν από την έκδοση 4, βασικά το υλοποίησαν οι ίδιοι σε επίπεδο εφαρμογής.

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

Ωστόσο, υπάρχει διακυβέρνηση σχήματος. Ξεκινώντας από το MongoDB 3.6, το MongoDB υποστηρίζει την επικύρωση σχήματος JSON. Για να το ενεργοποιήσετε, χρησιμοποιήστε το $ jsonSchema τελεστής στην έκφραση επικυρωτή σας. Η επικύρωση πραγματοποιείται κατά τη διάρκεια ενημερώσεων και εισαγωγών.

Όπως μπορείτε να δείτε στο στιγμιότυπο τεκμηρίωσης και στο στιγμιότυπο οθόνης MongoDB Atlas παρακάτω, το MongoDB έχει τη δική του γλώσσα ερωτήματος, που εφαρμόζεται στο κέλυφος Mongo, σε 12 υποστηριζόμενα API προγραμμάτων οδήγησης γλώσσας (και πολλά άλλα από την κοινότητα) και στο Compass GUI και Καρτέλα Συλλογές Atlas (η Εξερεύνηση δεδομένων). Η γλώσσα ερωτήματος MongoDB δεν είναι καθόλου ίδια με τη SQL, αλλά υπάρχει λίγο πολύ άμεση χαρτογράφηση μεταξύ των δύο. Λέω «περισσότερο ή λιγότερο» επειδή οι σχεσιακές βάσεις δεδομένων δεν υποστηρίζουν ενσωματωμένα έγγραφα, αλλά το MongoDB υποστηρίζει. Αυτό δεν είναι απαραίτητα όλα καλά, όπως θα δείτε στην επόμενη ενότητα.

MongoDB MongoDB

Το πλαίσιο συγκέντρωσης MongoDB χρησιμοποιεί χειριστές αγωγών που είναι λίγο πολύ το ισοδύναμο του SQL ΟΜΑΔΑ ΑΠΟ και ΟΠΟΥ ρήτρες. Για παράδειγμα, το ακόλουθο ερώτημα χρησιμοποιεί τη βάση δεδομένων ομάδας χρηστών του MongoDB για να απαριθμήσει τα προηγούμενα συμβάντα και τα συνολικά RSVP για κάθε συμβάν, στο κέλυφος Mongo:

> db.past_events.aggregate ([{'$ match': {'batchID': 101, 'event.status': 'past', 'event.group.urlname': {'$ in': ['Atlanta-MongoDB - Ομάδα χρηστών "," Austin-MongoDB-Group-User "," Baltimore-MongoDB-Users-Group "," Bangalore-MongoDB-User-Group "," Belfast-MongoDB-User-Group "," Bergen-NoSQL ',' Bordeaux-MongoDB-User-Group ',' Boston-MongoDB-User-Group ']}}},

{'$ group': {'_id': {'urlname': '$ event.group.urlname', 'year': {'$ year': '$ event.time'}}, 'event_count': {' $ sum ': 1},' rsvp_count ': {' $ sum ':' $ event.yes_rsvp_count '}}},

{'$ project': {'_id': 0, 'group': '$ _id.urlname', 'year': '$ _id.year', 'event_count': 1, 'rsvp_count': 1}}])

Το ερώτημα χρησιμοποιεί το σύνολο λειτουργία με το $ αγώνα, $ σε, $ ομάδα, ποσό $, και έργο $ χειριστές και επιστρέφει τα ακόλουθα:

{"event_count": 2, "rsvp_count": 27, "group": "Boston-MongoDB-User-Group", "έτος": 2017}

{"event_count": 5, "rsvp_count": 94, "group": "Boston-MongoDB-User-Group", "έτος": 2016}

{"event_count": 5, "rsvp_count": 231, "group": "Boston-MongoDB-User-Group", "έτος": 2015}

{"event_count": 3, "rsvp_count": 175, "group": "Boston-MongoDB-User-Group", "έτος": 2014}

{"event_count": 10, "rsvp_count": 489, "group": "Boston-MongoDB-User-Group", "έτος": 2013}

{"event_count": 12, "rsvp_count": 444, "group": "Boston-MongoDB-User-Group", "έτος": 2012}

{"event_count": 2, "rsvp_count": 118, "group": "Boston-MongoDB-User-Group", "έτος": 2011}

{"event_count": 6, "rsvp_count": 84, "group": "Atlanta-MongoDB-User-Group", "έτος": 2011}

{"event_count": 3, "rsvp_count": 74, "group": "Baltimore-MongoDB-Users-Group", "έτος": 2012}

{"event_count": 1, "rsvp_count": 5, "group": "Bergen-NoSQL", "έτος": 2015}

{"event_count": 15, "rsvp_count": 286, "group": "Atlanta-MongoDB-User-Group", "έτος": 2012}

{"event_count": 11, "rsvp_count": 321, "group": "Baltimore-MongoDB-Users-Group", "έτος": 2013}

{"event_count": 8, "rsvp_count": 124, "group": "Bangalore-MongoDB-User-Group", "έτος": 2015}

{"event_count": 6, "rsvp_count": 381, "group": "Bangalore-MongoDB-User-Group", "έτος": 2013}

{"event_count": 7, "rsvp_count": 242, "group": "Bangalore-MongoDB-User-Group", "έτος": 2012}

{"event_count": 13, "rsvp_count": 233, "group": "Atlanta-MongoDB-User-Group", "έτος": 2013}

{"event_count": 10, "rsvp_count": 171, "group": "Baltimore-MongoDB-Users-Group", "έτος": 2014}

{"event_count": 3, "rsvp_count": 28, "group": "Austin-MongoDB-User-Group", "year": 2017}

{"event_count": 2, "rsvp_count": 52, "group": "Austin-MongoDB-User-Group", "έτος": 2016}

{"event_count": 1, "rsvp_count": 8, "group": "Atlanta-MongoDB-User-Group", "έτος": 2018}

Πληκτρολογήστε "it" για περισσότερα

Το MongoDB έχει επίσης ένα ΜΕΙΩΣΗ ΧΑΡΤΗ λειτουργία. Το Compass GUI έχει ένα εργαλείο δημιουργίας αγωγών συγκέντρωσης που κάνει τη δημιουργία ερωτημάτων όπως το παραπάνω αρκετά απλή.

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

Στο MongoDB, μια λειτουργία εγγραφής είναι ατομική στο επίπεδο ενός μεμονωμένου εγγράφου, ακόμη και αν η λειτουργία τροποποιεί πολλά ενσωματωμένα έγγραφα σε ένα μόνο έγγραφο. Όταν μία λειτουργία εγγραφής (π.χ. db.collection.update Πολλές ()τροποποιεί πολλά έγγραφα, η τροποποίηση κάθε εγγράφου είναι ατομική, αλλά η λειτουργία στο σύνολό της δεν είναι ατομική. Ξεκινώντας από την έκδοση 4.0, για καταστάσεις που απαιτούν ατομικότητα για ενημερώσεις σε πολλά έγγραφα ή συνέπεια μεταξύ των αναγνωστών σε πολλά έγγραφα, το MongoDB παρέχει συναλλαγές πολλαπλών εγγράφων για σετ αντιγράφων, με κόστος απόδοσης.

$config[zx-auto] not found$config[zx-overlay] not found