14 coses que m'agradaria saber abans de començar amb MongoDB

La traducció de l'article es va preparar la vigília de l'inici del curs "Bases de dades no relacionals".

14 coses que m'agradaria saber abans de començar amb MongoDB

Elements més destacats:

  • És extremadament important desenvolupar un esquema tot i que és opcional a MongoDB.
  • De la mateixa manera, els índexs han de coincidir amb el vostre esquema i patrons d'accés.
  • Eviteu utilitzar objectes grans i matrius grans.
  • Aneu amb compte amb la configuració de MongoDB, especialment quan es tracta de seguretat i fiabilitat.
  • MongoDB no té un optimitzador de consultes, per la qual cosa heu de tenir cura quan feu operacions de consulta.

He estat treballant amb bases de dades durant molt de temps, però fa poc que he descobert MongoDB. Hi ha algunes coses que m'agradaria saber abans de començar a treballar-hi. Quan una persona ja té experiència en un camp determinat, té nocions preconcebudes sobre què són les bases de dades i què fan. Amb l'esperança de facilitar la comprensió dels altres, presento una llista d'errors comuns.

Creació d'un servidor MongoDB sense autenticació

Malauradament, MongoDB s'instal·la sense autenticació per defecte. Per a una estació de treball amb accés local, aquesta pràctica és normal. Però com que MongoDB és un sistema multiusuari al qual li agrada utilitzar grans quantitats de memòria, serà millor que el poseu en un servidor amb la màxima memòria RAM possible, encara que només el feu servir per al desenvolupament. La instal·lació al servidor mitjançant el port predeterminat pot ser problemàtica, especialment si es pot executar qualsevol codi javascript a la sol·licitud (per exemple, $where com a idea per injeccions).

Hi ha diversos mètodes d'autenticació, però el més fàcil és establir un ID d'usuari/contrasenya. Utilitzeu aquesta idea mentre penseu en l'autenticació fantàstica basada en LDAP. Quan es tracta de seguretat, MongoDB s'hauria d'actualitzar constantment i els registres sempre s'han de comprovar si hi ha accés no autoritzat. Per exemple, m'agrada seleccionar un port diferent com a port predeterminat.

No us oblideu d'enllaçar la superfície d'atac a MongoDB

Llista de verificació de seguretat de MongoDB conté bons consells per reduir el risc d'intrusió a la xarxa i de fuites de dades. És fàcil eliminar-ho i dir que un servidor de desenvolupament no necessita un alt nivell de seguretat. Tanmateix, no és tan senzill i això s'aplica a tots els servidors MongoDB. En particular, si no hi ha cap motiu convincent per utilitzar-lo mapReduce, group o $on, heu de desactivar l'ús de codi arbitrari a JavaScript escrivint al fitxer de configuració javascriptEnabled:false. Com que els fitxers de dades no estan xifrats a MongoDB estàndard, té sentit executar MongoDB amb Usuari Dedicat, que té accés complet als fitxers, només amb accés limitat i la possibilitat d'utilitzar els controls d'accés als fitxers del sistema operatiu.

Error en desenvolupar el circuit

MongoDB no utilitza un esquema. Però això no vol dir que l'esquema no sigui necessari. Si només voleu emmagatzemar documents sense cap patró coherent, emmagatzemar-los pot ser ràpid i fàcil, però recuperar-los més tard pot ser difícil. maleït dur.

article clàssic "6 regles generals per al disseny d'esquemes MongoDB" Val la pena llegir-lo i característiques com Explorador d'esquemes a l'eina de tercers Studio 3T, val la pena utilitzar-la per a comprovacions regulars dels circuits.

No oblideu l'ordre de classificació

Oblidar l'ordre d'ordenació pot causar més frustració i perdre més temps que qualsevol altra configuració incorrecta. Per defecte, MongoBD utilitza ordenació binària. Però és poc probable que sigui útil a ningú. Els tipus binaris sensibles a majúscules i minúscules, sensibles a l'accent, es consideraven anacronismes curiosos juntament amb comptes, caftans i bigotis arrissats als anys 80 del segle passat. Ara el seu ús és imperdonable. A la vida real, "motocicleta" és el mateix que "motocicleta". I "Gran Bretanya" i "Gran Bretanya" són el mateix lloc. Una lletra minúscula és simplement l'equivalent en majúscula d'una lletra majúscula. I no em facis començar a ordenar els diacrítics. Quan creeu una base de dades a MongoDB, utilitzeu una intercalació insensible a l'accent i registrar-se, que corresponen a la llengua i cultura d'usuari del sistema. Això farà que la cerca a través de dades de cadena sigui molt més fàcil.

Crea col·leccions amb documents grans

MongoDB està encantat d'allotjar documents grans de fins a 16 MB en col·leccions i GridFS Dissenyat per a documents grans de més de 16 MB. Però només perquè s'hi poden col·locar documents grans, emmagatzemar-los allà no és una bona idea. MongoDB funcionarà millor si emmagatzemeu documents individuals d'uns quants kilobytes de mida, tractant-los més com a files d'una taula SQL àmplia. Els documents grans seran una font de problemes productivitat.

Creació de documents amb matrius grans

Els documents poden contenir matrius. El millor és que el nombre d'elements de la matriu estigui lluny d'un nombre de quatre dígits. Si s'afegeixen elements a una matriu amb freqüència, superarà el document que el conté i haurà de ser moure's, el que vol dir que serà necessari actualitzar també els índexs. Quan es torna a indexar un document amb una matriu gran, els índexs sovint se sobreescriuran, ja que hi ha una registre, que emmagatzema el seu índex. Aquesta reindexació també es produeix quan s'insereix o s'elimina un document.

MongoDB té una cosa que es diu "factor d'ompliment", que ofereix espai perquè els documents creixin per minimitzar aquest problema.
Podríeu pensar que podeu prescindir de la indexació de matrius. Malauradament, la manca d'índexs pot provocar que tingueu altres problemes. Com que els documents s'escanegen de principi a fi, la cerca d'elements al final de la matriu trigarà més temps i la majoria de les operacions associades a aquest document seran lent.

No oblideu que l'ordre de les etapes en una agregació és important

En un sistema de bases de dades amb un optimitzador de consultes, les consultes que escriviu són explicacions del que voleu obtenir, no com obtenir-ho. Aquest mecanisme funciona per analogia amb la comanda en un restaurant: normalment només demaneu un plat i no doneu instruccions detallades al cuiner.

A MongoDB, indiqueu al cuiner. Per exemple, heu d'assegurar-vos que les dades passen reduce tan aviat com sigui possible en el pipeline utilitzant $match и $project, i l'ordenació només es produeix després reduce, i que la cerca es produeixi exactament en l'ordre que voleu. Tenir un optimitzador de consultes que elimina el treball innecessari, seqüencia de manera òptima els passos i selecciona els tipus d'unió us pot espatllar. Amb MongoDB, teniu més control a costa de la comoditat.

Eines com Estudi 3T simplificarà la construcció de consultes d'agregació a MongoDB. La funció de l'editor d'agregació us permet aplicar declaracions de pipeline una etapa a la vegada i inspeccionar les dades d'entrada i sortida a cada etapa per simplificar la depuració.

Ús de la gravació ràpida

No configureu mai les opcions d'escriptura de MongoDB perquè tinguin alta velocitat però poca fiabilitat. Aquest mode "Arxivar i oblidar" sembla ràpid perquè l'ordre es retorna abans que es produeixi l'escriptura. Si el sistema falla abans que les dades s'escriguin al disc, es perdran i acabaran en un estat inconsistent. Afortunadament, MongoDB de 64 bits ha activat el registre.

Els motors d'emmagatzematge MMAPv1 i WiredTiger utilitzen el registre per evitar-ho, tot i que WiredTiger pot recuperar-se fins a l'última coherència. punt de control, si el registre està desactivat.

El registre en diari garanteix que la base de dades estigui en un estat coherent després de la recuperació i conserva totes les dades fins que s'escriuen al diari. La freqüència d'enregistraments es configura mitjançant el paràmetre commitIntervalMs.

Per estar segur de les entrades, assegureu-vos que el registre estigui habilitat al fitxer de configuració (storage.journal.enabled), i la freqüència de les gravacions correspon a la quantitat d'informació que us podeu permetre perdre.

Ordenació sense índex

En cercar i agregar, sovint cal ordenar les dades. Esperem que això es faci en una de les etapes finals, després de filtrar el resultat per tal de reduir la quantitat de dades que s'estan ordenant. I fins i tot en aquest cas, necessitareu per a la classificació índex. Podeu utilitzar un índex únic o compost.

Si no hi ha un índex adequat, MongoDB es farà sense ell. Hi ha un límit de memòria de 32 MB a la mida total de tots els documents operacions de classificació, i si MongoDB arriba a aquest límit, o bé llançarà un error o tornarà conjunt de registres buit.

Cerca sense suport d'índex

Les consultes de cerca realitzen una funció similar a l'operació JOIN a SQL. Per funcionar millor, necessiten l'índex del valor de la clau utilitzada com a clau estrangera. Això no és obvi perquè l'ús no es reflecteix explain(). Aquests índexs s'afegeixen a l'índex escrit explain(), que al seu torn és utilitzat pels operadors de canonades $match и $sort, quan es troben a l'inici del gasoducte. Els índexs ara poden cobrir qualsevol etapa canonada d'agregació.

Desactivar l'ús de les actualitzacions múltiples

Mètode db.collection.update() s'utilitza per canviar part d'un document existent o tot el document, fins a una substitució completa, depenent del paràmetre que especifiqueu update. El que no és tan obvi és que no processarà tots els documents de la col·lecció tret que definiu l'opció multi per actualitzar tots els documents que compleixin els criteris de sol·licitud.

No oblideu la importància de l'ordre de les claus en una taula hash

A JSON, un objecte consisteix en una col·lecció no ordenada de mida zero o més parells nom/valor, on el nom és una cadena i el valor és una cadena, nombre, booleà, nul, objecte o matriu.

Malauradament, BSON posa molt èmfasi en l'ordre quan es cerca. A MongoDB, l'ordre de les claus dins dels objectes integrats assumptesés a dir. { firstname: "Phil", surname: "factor" } - això no és el mateix que { { surname: "factor", firstname: "Phil" }. És a dir, heu d'emmagatzemar l'ordre dels parells nom/valor als vostres documents si voleu estar segur de trobar-los.

No us confongueu «Null» и "indefinit"

Valor "indefinit" mai va ser vàlid en JSON, segons estàndard oficial JSON (ECMA-404 Secció 5), tot i que s'utilitza en JavaScript. A més, per a BSON està obsolet i es converteix en $null, que no sempre és una bona solució. Eviteu utilitzar "indefinit" a MongoDB.

Utilitzar $limit() без $sort()

Molt sovint, quan esteu desenvolupant a MongoDB, és útil només veure una mostra del resultat que es retornarà d'una consulta o agregació. Per a aquesta tasca necessitareu $limit(), però mai hauria d'estar al codi final tret que l'utilitzeu abans $sort. Aquesta mecànica és necessària perquè, en cas contrari, no podeu garantir l'ordre del resultat, i no podreu visualitzar les dades de manera fiable. A la part superior del resultat obtindreu diferents entrades segons l'ordenació. Per funcionar de manera fiable, les consultes i agregacions han de ser deterministes, és a dir, produir els mateixos resultats cada vegada que s'executen. Codi que conté $limit(), però no $sort, no serà determinista i, posteriorment, pot provocar errors difícils de localitzar.

Conclusió

L'única manera de sentir-se decebut amb MongoDB és comparar-lo directament amb un altre tipus de base de dades, com un DBMS, o arribar a utilitzar-lo en funció de determinades expectatives. És com comparar una taronja amb una forquilla. Els sistemes de bases de dades tenen finalitats específiques. El millor és simplement entendre i apreciar aquestes diferències per tu mateix. Seria una vergonya pressionar els desenvolupadors de MongoDB per un camí que els obligués a seguir el camí de DBMS. Vull veure maneres noves i interessants de resoldre problemes antics, com ara garantir la integritat de les dades i crear sistemes de dades que siguin resistents als errors i als atacs maliciosos.

La introducció de la transaccionalitat ACID per part de MongoDB a la versió 4.0 és un bon exemple d'introduir millores importants d'una manera innovadora. Les transaccions de diversos documents i de diversos extractes són ara atòmiques. També és possible ajustar el temps necessari per adquirir bloquejos i finalitzar transaccions bloquejades, així com canviar el nivell d'aïllament.

14 coses que m'agradaria saber abans de començar amb MongoDB

Llegeix més:

Font: www.habr.com

Afegeix comentari