14 lucruri pe care mi-aș dori să le știu înainte de a începe cu MongoDB

Traducerea articolului a fost pregătită în ajunul începerii cursului „Baze de date non-relaționale”.

14 lucruri pe care mi-aș dori să le știu înainte de a începe cu MongoDB

Repere:

  • Este extrem de important să dezvoltați o schemă, chiar dacă este opțională în MongoDB.
  • De asemenea, indecșii trebuie să se potrivească cu schema și modelele de acces.
  • Evitați să utilizați obiecte mari și matrice mari.
  • Fiți atenți la setările MongoDB, mai ales când vine vorba de securitate și fiabilitate.
  • MongoDB nu are un optimizator de interogări, așa că trebuie să fiți atenți când efectuați operațiuni de interogare.

Lucrez cu baze de date de foarte mult timp, dar abia recent am descoperit MongoDB. Sunt câteva lucruri pe care mi-aș dori să le știu înainte de a începe să lucrez cu el. Când o persoană are deja experiență într-un anumit domeniu, are noțiuni preconcepute despre ce sunt bazele de date și ce fac. În speranța de a face mai ușor de înțeles pentru ceilalți, vă prezint o listă de greșeli frecvente.

Crearea unui server MongoDB fără autentificare

Din păcate, MongoDB este instalat fără autentificare în mod implicit. Pentru o stație de lucru accesată local, această practică este normală. Dar, deoarece MongoDB este un sistem multi-utilizator căruia îi place să folosească cantități mari de memorie, va fi mai bine dacă îl puneți pe un server cu cât mai multă RAM, chiar dacă îl veți folosi doar pentru dezvoltare. Instalarea pe server prin portul implicit poate fi problematică, mai ales dacă orice cod javascript poate fi executat în cerere (de exemplu, $where ca idee pentru injecție).

Există mai multe metode de autentificare, dar cea mai ușoară este să setați un ID de utilizator/parolă. Utilizați această idee în timp ce vă gândiți la autentificarea fantezie bazată pe LDAP. Când vine vorba de securitate, MongoDB ar trebui să fie actualizat în mod constant, iar jurnalele ar trebui să fie întotdeauna verificate pentru acces neautorizat. De exemplu, îmi place să selectez un alt port ca port implicit.

Nu uitați să legați suprafața de atac la MongoDB

Lista de verificare a securității MongoDB conține sfaturi bune pentru reducerea riscului de intruziune în rețea și scurgeri de date. Este ușor să o îndepărtezi și să spui că un server de dezvoltare nu are nevoie de un nivel ridicat de securitate. Cu toate acestea, nu este atât de simplu și acest lucru se aplică tuturor serverelor MongoDB. În special, dacă nu există un motiv convingător de utilizare mapReduce, group sau $unde, trebuie să dezactivați utilizarea codului arbitrar în JavaScript scriind în fișierul de configurare javascriptEnabled:false. Deoarece fișierele de date nu sunt criptate în MongoDB standard, este logic să rulați MongoDB cu Utilizator Dedicat, care are acces deplin la fișiere, cu acces limitat doar la acestea și abilitatea de a utiliza controalele de acces la fișiere proprii ale sistemului de operare.

Eroare la dezvoltarea circuitului

MongoDB nu folosește o schemă. Dar asta nu înseamnă că schema nu este necesară. Dacă doriți doar să stocați documente fără niciun model consistent, stocarea acestora poate fi rapidă și ușoară, dar recuperarea lor mai târziu poate fi dificilă. al naibii de greu.

articol clasic "6 reguli generale pentru proiectarea schemei MongoDB" Merită citit și caracteristici precum Schema Explorer în instrumentul terță parte Studio 3T, merită folosit pentru verificări regulate ale circuitelor.

Nu uitați de ordinea de sortare

Uitarea ordinii de sortare poate provoca mai multă frustrare și pierde mai mult timp decât orice altă configurație incorectă. În mod implicit, MongoBD utilizează sortare binară. Dar este puțin probabil să fie util cuiva. Sorturile binare sensibile la majuscule, la accent, au fost considerate anacronisme curioase împreună cu mărgele, caftanele și mustața creț încă din anii 80 ai secolului trecut. Acum folosirea lor este de neiertat. În viața reală, „motocicletă” este la fel cu „motocicletă”. Și „Marea Britanie” și „Marea Britanie” sunt același loc. O literă mică este pur și simplu echivalentul majuscul al unei litere mari. Și nu mă face să încep să triez semnele diacritice. Când creați o bază de date în MongoDB, utilizați colarearea fără accent și Inregistreaza-te, care corespund limbii și cultura utilizatorului de sistem. Acest lucru va face căutarea prin datele șirurilor mult mai ușoară.

Creați colecții cu documente mari

MongoDB este bucuros să găzduiască documente mari de până la 16 MB în colecții și GridFS Proiectat pentru documente mari mai mari de 16 MB. Dar doar pentru că acolo pot fi plasate documente mari, stocarea lor acolo nu este o idee bună. MongoDB va funcționa cel mai bine dacă stocați documente individuale care au o dimensiune de câțiva kiloocteți, tratându-le mai mult ca niște rânduri dintr-un tabel SQL larg. Documentele mari vor fi o sursă de probleme cu productivitate.

Crearea de documente cu matrice mari

Documentele pot conține matrice. Cel mai bine este dacă numărul de elemente din matrice este departe de un număr de patru cifre. Dacă elementele sunt adăugate frecvent într-o matrice, acesta va depăși documentul care îl conține și va trebui să fie mișcare, ceea ce înseamnă că va fi necesar actualizați și indecșii. La reindexarea unui document cu o matrice mare, indecșii vor fi adesea suprascriși, deoarece există o record, care își stochează indexul. Această reindexare are loc și atunci când un document este inserat sau șters.

MongoDB are ceva numit "factor de umplere", care oferă spațiu pentru ca documentele să crească pentru a minimiza această problemă.
Ai putea crede că te poți descurca fără indexarea matricei. Din nefericire, lipsa indicilor vă poate cauza alte probleme. Deoarece documentele sunt scanate de la început până la sfârșit, căutarea elementelor la sfârșitul matricei va dura mai mult și majoritatea operațiunilor asociate cu un astfel de document vor fi încet.

Nu uitați că ordinea etapelor într-o agregare contează

Într-un sistem de baze de date cu un optimizator de interogări, interogările pe care le scrieți sunt explicații pentru ceea ce doriți să obțineți, nu cum să îl obțineți. Acest mecanism funcționează prin analogie cu comanda într-un restaurant: de obicei, comandați pur și simplu un fel de mâncare și nu oferiți instrucțiuni detaliate bucătarului.

În MongoDB, instruiți bucătarul. De exemplu, trebuie să vă asigurați că datele trec reduce cât mai devreme posibil în conductă folosind $match и $project, iar sortarea are loc numai după reduce, și că căutarea are loc exact în ordinea dorită. Deținerea unui optimizator de interogări care elimină munca inutilă, secvențiază în mod optim pașii și selectează tipurile de alăturare te poate răsfăța. Cu MongoDB, aveți mai mult control cu ​​prețul confortului.

Instrumente ca Studio 3T va simplifica construirea interogărilor de agregare în MongoDB. Caracteristica Editor de agregare vă permite să aplicați instrucțiuni pipeline pe rând și să inspectați datele de intrare și de ieșire la fiecare etapă pentru a simplifica depanarea.

Utilizarea Înregistrării rapide

Nu setați niciodată opțiunile de scriere MongoDB pentru a avea viteză mare, dar fiabilitate scăzută. Acest mod "fisare si uitare" pare rapid deoarece comanda este returnată înainte de scrierea. Dacă sistemul se blochează înainte ca datele să fie scrise pe disc, acestea se vor pierde și vor ajunge într-o stare inconsistentă. Din fericire, MongoDB pe 64 de biți are înregistrarea activată.

Motoarele de stocare MMAPv1 și WiredTiger folosesc înregistrarea în jurnal pentru a preveni acest lucru, deși WiredTiger poate reveni la ultima consecvență. punct de control, dacă înregistrarea este dezactivată.

Jurnalizarea asigură că baza de date este într-o stare consecventă după recuperare și păstrează toate datele până când sunt scrise în jurnal. Frecvența înregistrărilor este configurată cu ajutorul parametrului commitIntervalMs.

Pentru a fi sigur de intrări, asigurați-vă că înregistrarea este activată în fișierul de configurare (storage.journal.enabled), iar frecvența înregistrărilor corespunde cantității de informații pe care vă puteți permite să o pierdeți.

Sortare fără index

Când căutați și agregați, este adesea nevoie să sortați datele. Să sperăm că acest lucru se face într-una din etapele finale, după filtrarea rezultatului pentru a reduce cantitatea de date sortate. Și chiar și în acest caz, pentru sortare veți avea nevoie index. Puteți utiliza un index unic sau compus.

Dacă nu există un index adecvat, MongoDB se va descurca fără el. Există o limită de memorie de 32 MB pentru dimensiunea totală a tuturor documentelor din operațiuni de sortare, iar dacă MongoDB atinge această limită, atunci fie va arunca o eroare, fie va reveni set de înregistrări gol.

Căutați fără suport pentru index

Interogările de căutare îndeplinesc o funcție similară cu operația JOIN din SQL. Pentru a funcționa cel mai bine, au nevoie de indexul valorii cheii utilizate ca cheie externă. Acest lucru nu este evident deoarece utilizarea nu este reflectată în explain(). Astfel de indici sunt în plus față de indicele înscris explain(), care la rândul său este folosit de operatorii de conducte $match и $sort, când se întâlnesc la începutul conductei. Indecii pot acoperi acum orice etapă conductă de agregare.

Renunțarea la utilizarea mai multor actualizări

metodă db.collection.update() folosit pentru a schimba o parte dintr-un document existent sau întregul document, până la o înlocuire completă, în funcție de parametrul pe care îl specificați update. Ceea ce nu este atât de evident este că nu va procesa toate documentele din colecție decât dacă setați opțiunea multi să actualizeze toate documentele care îndeplinesc criteriile de solicitare.

Nu uitați de importanța ordinii cheilor într-un tabel hash

În JSON, un obiect constă dintr-o colecție neordonată de dimensiune zero sau mai multe perechi nume/valoare, unde nume este un șir și valoare este un șir, număr, boolean, nul, obiect sau matrice.

Din păcate, BSON pune mult accent pe comandă atunci când caută. În MongoDB, ordinea cheilor în obiectele încorporate chestiuni, adică { firstname: "Phil", surname: "factor" } - aceasta nu este la fel ca { { surname: "factor", firstname: "Phil" }. Adică trebuie să stocați ordinea perechilor nume/valoare în documentele dvs. dacă doriți să fiți sigur că le găsiți.

Nu confunda "nul" и "nedefinit"

Valoare "nedefinit" nu a fost niciodată valabil în JSON, conform standard oficial JSON (ECMA-404 Secțiunea 5), ​​chiar dacă este folosit în JavaScript. Mai mult, pentru BSON este învechit și este convertit în $null, ceea ce nu este întotdeauna o soluție bună. Evita sa folosesti "nedefinit" în MongoDB.

Folosi $limit() fără $sort()

Destul de des, atunci când dezvoltați în MongoDB, este util să vedeți doar un eșantion de rezultat care va fi returnat dintr-o interogare sau agregare. Pentru această sarcină veți avea nevoie $limit(), dar nu ar trebui să fie niciodată în codul final decât dacă îl utilizați înainte $sort. Acest mecanic este necesar deoarece altfel nu puteți garanta ordinea rezultatului și nu veți putea vizualiza în mod fiabil datele. În partea de sus a rezultatului veți obține diferite intrări în funcție de sortare. Pentru a funcționa fiabil, interogările și agregările trebuie să fie deterministe, adică să producă aceleași rezultate de fiecare dată când sunt executate. Cod care contine $limit(), dar nu $sort, nu va fi determinist și poate cauza ulterior erori care vor fi greu de urmărit.

Concluzie

Singura modalitate de a fi dezamăgit de MongoDB este să-l compari direct cu un alt tip de bază de date, precum un DBMS, sau să ajungi să-l folosești pe baza anumitor așteptări. Este ca și cum ai compara o portocală cu o furculiță. Sistemele de baze de date servesc unor scopuri specifice. Cel mai bine este să înțelegi și să apreciezi pur și simplu aceste diferențe pentru tine. Ar fi păcat să presăm dezvoltatorii MongoDB pentru o cale care i-a forțat pe calea DBMS. Vreau să văd modalități noi și interesante de a rezolva problemele vechi, cum ar fi asigurarea integrității datelor și crearea de sisteme de date care sunt rezistente la eșec și atacuri rău intenționate.

Introducerea de către MongoDB a tranzacționalității ACID în versiunea 4.0 este un bun exemplu de introducere a îmbunătățirilor importante într-un mod inovator. Tranzacțiile cu mai multe documente și cu mai multe extrase sunt acum atomice. De asemenea, este posibil să se ajusteze timpul necesar pentru a obține încuietori și pentru a încheia tranzacțiile blocate, precum și pentru a modifica nivelul de izolare.

14 lucruri pe care mi-aș dori să le știu înainte de a începe cu MongoDB

Citeste mai mult:

Sursa: www.habr.com

Adauga un comentariu