14 stvari koje bih volio da znam prije nego što počnem s MongoDB

Prijevod članka pripremljen je uoči početka kursa "Nerelacijske baze podataka".

14 stvari koje bih volio da znam prije nego što počnem s MongoDB

Vrhunci:

  • Izuzetno je važno razviti šemu iako je ona opciona u MongoDB-u.
  • Isto tako, indeksi moraju odgovarati vašoj šemi i obrascima pristupa.
  • Izbjegavajte korištenje velikih objekata i velikih nizova.
  • Budite oprezni s MongoDB postavkama, posebno kada je riječ o sigurnosti i pouzdanosti.
  • MongoDB nema optimizator upita, tako da morate biti pažljivi kada izvodite operacije upita.

Radim sa bazama podataka jako dugo, ali tek nedavno sam otkrio MongoDB. Postoji nekoliko stvari koje bih volio da znam prije nego što sam počeo raditi s tim. Kada osoba već ima iskustvo u određenoj oblasti, ona ima unaprijed stvorene predodžbe o tome šta su baze podataka i čime se bave. U nadi da ću drugima olakšati razumijevanje, predstavljam listu uobičajenih grešaka.

Kreiranje MongoDB servera bez autentifikacije

Nažalost, MongoDB se podrazumevano instalira bez autentifikacije. Za radnu stanicu kojoj se pristupa lokalno, ova praksa je normalna. Ali pošto je MongoDB višekorisnički sistem koji voli da koristi velike količine memorije, biće bolje da ga stavite na server sa što više RAM-a, čak i ako ćete ga koristiti samo za razvoj. Instaliranje na server preko zadanog porta može biti problematično, posebno ako se u zahtjevu može izvršiti bilo koji javascript kod (na primjer, $where kao ideja za injekcije).

Postoji nekoliko metoda provjere autentičnosti, ali najlakše je postaviti korisnički ID/lozinku. Koristite ovu ideju dok razmišljate o fensi autentifikaciji zasnovanoj na LDAP. Kada je u pitanju sigurnost, MongoDB treba stalno ažurirati, a logove uvijek treba provjeravati za neovlašteni pristup. Na primjer, volim odabrati drugi port kao zadani port.

Ne zaboravite da povežete površinu napada za MongoDB

MongoDB sigurnosna kontrolna lista sadrži dobre savjete za smanjenje rizika od upada u mrežu i curenja podataka. Lako je to odbaciti i reći da razvojnom serveru nije potreban visok nivo sigurnosti. Međutim, to nije tako jednostavno i ovo se odnosi na sve MongoDB servere. Posebno, ako ne postoji uvjerljiv razlog za korištenje mapReduce, group ili $gdje, morate onemogućiti upotrebu proizvoljnog koda u JavaScriptu pisanjem u konfiguracijski fajl javascriptEnabled:false. Pošto datoteke podataka nisu šifrovane u standardnom MongoDB-u, ima smisla pokrenuti MongoDB sa njim Posvećeni korisnik, koji ima potpuni pristup datotekama, sa ograničenim pristupom samo njemu i mogućnošću korištenja vlastitih kontrola pristupa datotekama operativnog sistema.

Greška pri razvoju kola

MongoDB ne koristi šemu. Ali to ne znači da shema nije potrebna. Ako samo želite pohraniti dokumente bez ikakvog dosljednog uzorka, njihovo pohranjivanje može biti brzo i jednostavno, ali kasnije njihovo preuzimanje može biti teško. prokleto teško.

Klasičan članak"6 pravila palca za dizajn MongoDB sheme" Vrijedi ga pročitati, a karakteristike poput Schema Explorer u alatu treće strane Studio 3T, vrijedi ga koristiti za redovne provjere kola.

Ne zaboravite redoslijed sortiranja

Zaboravljanje redoslijeda sortiranja može uzrokovati više frustracija i izgubiti više vremena nego bilo koja druga pogrešna konfiguracija. Po defaultu koristi MongoBD binarno sortiranje. Ali malo je vjerovatno da će nekome biti od koristi. Binarne sorte koje su osjetljive na velika i mala slova, akcenat su još 80-ih godina prošlog stoljeća smatrane čudnim anahronizmima zajedno sa perlama, kaftanima i kovrčavim brkovima. Sada je njihova upotreba neoprostiva. U stvarnom životu, "motocikl" je isto što i "motocikl". A „Britanija“ i „Britanija“ su isto mesto. Malo slovo je jednostavno veliko slovo ekvivalentno velikom slovu. I nemojte me tjerati na sortiranje dijakritičkih znakova. Prilikom kreiranja baze podataka u MongoDB, koristite upoređivanje bez naglaska i registar, koji odgovaraju jeziku i kultura korisnika sistema. Ovo će znatno olakšati pretraživanje niz podataka.

Kreirajte kolekcije s velikim dokumentima

MongoDB rado ugošćuje velike dokumente do 16MB u zbirkama, i GridFS Dizajniran za velike dokumente veće od 16 MB. Ali samo zato što se veliki dokumenti mogu staviti tamo, njihovo skladištenje nije dobra ideja. MongoDB će najbolje raditi ako pohranjujete pojedinačne dokumente veličine nekoliko kilobajta, tretirajući ih više kao redove u širokoj SQL tabeli. Veliki dokumenti će biti izvor problema performanse.

Kreiranje dokumenata sa velikim nizovima

Dokumenti mogu sadržavati nizove. Najbolje je ako je broj elemenata u nizu daleko od četverocifrenog broja. Ako se elementi često dodaju u niz, on će prerasti dokument koji ga sadrži i moraće biti pomakni se, što znači da će biti neophodno ažurirati i indekse. Prilikom ponovnog indeksiranja dokumenta sa velikim nizom, indeksi će često biti prepisani, jer postoji ulaz, koji pohranjuje svoj indeks. Ovo ponovno indeksiranje se takođe dešava kada se dokument ubaci ili izbriše.

MongoDB ima nešto što se zove "faktor punjenja", što pruža prostor za rast dokumenata kako bi se ovaj problem sveo na minimum.
Možda mislite da možete bez indeksiranja niza. Nažalost, nedostatak indeksa može uzrokovati druge probleme. Budući da se dokumenti skeniraju od početka do kraja, traženje elemenata na kraju niza će trajati duže, a većina operacija povezanih s takvim dokumentom bit će sporo.

Ne zaboravite da je redoslijed faza u agregaciji bitan

U sistemu baze podataka sa optimizatorom upita, upiti koje pišete su objašnjenja šta želite da dobijete, a ne kako da to dobijete. Ovaj mehanizam funkcionira po analogiji s naručivanjem u restoranu: obično jednostavno naručite jelo, a ne date detaljne upute kuharu.

U MongoDB-u dajete uputstva kuvaru. Na primjer, morate biti sigurni da podaci prolaze reduce što je ranije moguće u cjevovodu koristeći $match и $project, a sortiranje se događa tek nakon toga reduce, i da se pretraga odvija upravo onim redoslijedom koji želite. Imati optimizator upita koji eliminiše nepotreban rad, optimalno sekvencira korake i bira tipove spajanja može vas razmaziti. Sa MongoDB, imate više kontrole po cijenu pogodnosti.

Alati poput Studio 3T će pojednostaviti konstrukciju agregacijskih upita u MongoDB. Funkcija uređivača agregacije vam omogućava da primijenite naredbe cjevovoda jednu po jednu fazu i pregledate ulazne i izlazne podatke u svakoj fazi kako biste pojednostavili otklanjanje grešaka.

Korištenje brzog snimanja

Nikada nemojte postavljati opcije pisanja MongoDB tako da imaju veliku brzinu, ali nisku pouzdanost. Ovaj mod "snimi i zaboravi" izgleda brzo jer se naredba vraća prije nego što se upis dogodi. Ako se sistem sruši prije nego što se podaci zapišu na disk, bit će izgubljeni i završiti u nekonzistentnom stanju. Srećom, 64-bitni MongoDB ima omogućeno evidentiranje.

MMAPv1 i WiredTiger strojevi za pohranu koriste evidenciju kako bi spriječili ovo, iako se WiredTiger može oporaviti do posljednjeg dosljednog kontrolna tačka, ako je evidentiranje onemogućeno.

Vođenje dnevnika osigurava da je baza podataka u konzistentnom stanju nakon oporavka i zadržava sve podatke dok se ne zapišu u dnevnik. Učestalost snimanja se konfiguriše pomoću parametra commitIntervalMs.

Da biste bili sigurni u unose, provjerite je li evidentiranje omogućeno u konfiguracijskoj datoteci (storage.journal.enabled), a učestalost snimanja odgovara količini informacija koju možete priuštiti da izgubite.

Sortiranje bez indeksa

Prilikom pretraživanja i agregiranja često postoji potreba za sortiranjem podataka. Nadajmo se da je to učinjeno u nekoj od završnih faza, nakon filtriranja rezultata kako bi se smanjila količina podataka koji se sortiraju. Čak iu ovom slučaju, za sortiranje će vam trebati indeks. Možete koristiti pojedinačni ili složeni indeks.

Ako nema odgovarajućeg indeksa, MongoDB će bez njega. Postoji ograničenje memorije od 32 MB za ukupnu veličinu svih dokumenata operacije sortiranja, i ako MongoDB dostigne ovu granicu, onda će ili baciti grešku ili će se vratiti prazan set zapisa.

Pretražujte bez podrške za indeks

Upiti za pretraživanje izvode funkciju sličnu operaciji JOIN u SQL-u. Da bi najbolje funkcionirali, potreban im je indeks vrijednosti ključa koji se koristi kao strani ključ. Ovo nije očigledno jer se upotreba ne odražava u explain(). Takvi indeksi su dodatak indeksu upisanim explain(), koji zauzvrat koriste operateri cjevovoda $match и $sort, kada se sastanu na početku gasovoda. Indeksi sada mogu pokriti bilo koju fazu agregacioni cevovod.

Odbijanje korištenja višestrukih ažuriranja

Metoda db.collection.update() koristi se za promjenu dijela postojećeg dokumenta ili cijelog dokumenta, do potpune zamjene, ovisno o parametru koji navedete update. Ono što nije tako očigledno je da neće obraditi sve dokumente u kolekciji osim ako ne postavite tu opciju multi da ažurira sve dokumente koji ispunjavaju kriterijume zahteva.

Ne zaboravite na važnost redosleda ključeva u hash tabeli

U JSON-u, objekat se sastoji od neuređene kolekcije veličine nula ili više parova ime/vrijednost, gdje je ime niz, a vrijednost niz, broj, logički, null, objekt ili niz.

Nažalost, BSON stavlja veliki naglasak na red prilikom pretraživanja. U MongoDB, redoslijed ključeva unutar ugrađenih objekata pitanjatj. { firstname: "Phil", surname: "factor" } - ovo nije isto kao { { surname: "factor", firstname: "Phil" }. To jest, morate pohraniti redoslijed parova ime/vrijednost u svojim dokumentima ako želite biti sigurni da ćete ih pronaći.

Nemojte se zbuniti "Null" и "nedefinisano"

vrijednost "nedefinisano" nikada nije bio važeći u JSON-u, prema zvanični standard JSON (ECMA-404 Odjeljak 5), iako se koristi u JavaScript-u. Štaviše, za BSON je zastario i konvertovan je u $null, što nije uvijek dobro rješenje. Izbjegavajte korištenje "nedefinisano" u MongoDB.

Koristite $limit() bez $sort()

Vrlo često kada razvijate u MongoDB-u, korisno je samo vidjeti uzorak rezultata koji će biti vraćen iz upita ili agregacije. Za ovaj zadatak će vam trebati $limit(), ali nikada ne bi trebao biti u konačnom kodu osim ako ga ranije ne koristite $sort. Ova mehanika je neophodna jer u suprotnom ne možete garantovati redosled rezultata i nećete moći pouzdano da vidite podatke. Na vrhu rezultata dobit ćete različite unose ovisno o sortiranju. Da bi radili pouzdano, upiti i agregacije moraju biti deterministički, odnosno proizvesti iste rezultate svaki put kada se izvrše. Kod koji sadrži $limit(), ali ne $sort, neće biti deterministički i može naknadno uzrokovati greške koje će biti teško ući u trag.

zaključak

Jedini način da budete razočarani MongoDB je da ga uporedite direktno sa drugom vrstom baze podataka, kao što je DBMS, ili da je počnete koristiti na osnovu određenih očekivanja. To je kao da porediš narandžu sa viljuškom. Sistemi baza podataka služe specifičnim svrhama. Najbolje je da jednostavno sami shvatite i cijenite ove razlike. Bila bi šteta vršiti pritisak na programere MongoDB oko putanje koja ih je natjerala na DBMS put. Želim vidjeti nove i zanimljive načine rješavanja starih problema, kao što je osiguranje integriteta podataka i stvaranje sistema podataka koji su otporni na kvar i zlonamjerne napade.

MongoDB-ovo uvođenje ACID transakcije u verziju 4.0 je dobar primjer uvođenja važnih poboljšanja na inovativan način. Transakcije sa više dokumenata i više izjava sada su atomske. Također je moguće podesiti vrijeme potrebno za preuzimanje zaključavanja i okončanje zaglavljenih transakcija, kao i promjenu nivoa izolacije.

14 stvari koje bih volio da znam prije nego što počnem s MongoDB

Čitaj više:

izvor: www.habr.com

Dodajte komentar