14 dalykų, kuriuos norėčiau žinoti prieš pradėdamas dirbti su MongoDB

Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse „Nesantykinės duomenų bazės“.

14 dalykų, kuriuos norėčiau žinoti prieš pradėdamas dirbti su MongoDB

Renginiai:

  • Labai svarbu sukurti schemą, net jei MongoDB ji yra neprivaloma.
  • Taip pat indeksai turi atitikti jūsų schemą ir prieigos šablonus.
  • Nenaudokite didelių objektų ir didelių masyvų.
  • Būkite atsargūs su MongoDB nustatymais, ypač kai kalbama apie saugumą ir patikimumą.
  • MongoDB neturi užklausų optimizavimo priemonės, todėl atlikdami užklausos operacijas turite būti atsargūs.

Su duomenų bazėmis dirbu labai ilgai, bet tik neseniai atradau MongoDB. Yra keletas dalykų, kuriuos norėčiau žinoti prieš pradėdamas dirbti. Kai žmogus jau turi patirties tam tikroje srityje, jis turi išankstinį nusistatymą apie tai, kas yra duomenų bazės ir ką jos veikia. Tikėdamasis, kad kitiems būtų lengviau suprasti, pateikiu dažniausiai daromų klaidų sąrašą.

MongoDB serverio kūrimas be autentifikavimo

Deja, pagal numatytuosius nustatymus MongoDB yra įdiegtas be autentifikavimo. Jei darbo stotis pasiekiama vietoje, ši praktika yra įprasta. Tačiau kadangi MongoDB yra kelių vartotojų sistema, kuri mėgsta naudoti didelius atminties kiekius, bus geriau, jei įdėsite ją į serverį su kuo daugiau RAM, net jei ketinate ją naudoti tik plėtrai. Diegimas serveryje per numatytąjį prievadą gali būti problemiškas, ypač jei užklausoje gali būti vykdomas bet koks javascript kodas (pvz., $where kaip idėja injekcijos).

Yra keli autentifikavimo būdai, tačiau lengviausia nustatyti vartotojo ID/slaptažodį. Naudokite šią idėją, kai galvojate apie išgalvotą autentifikavimą, pagrįstą LDAP. Kalbant apie saugumą, MongoDB turėtų būti nuolat atnaujinamas, o žurnalai visada turi būti tikrinami, ar nėra neteisėtos prieigos. Pavyzdžiui, man patinka kaip numatytąjį prievadą pasirinkti kitą prievadą.

Nepamirškite susieti atakos paviršiaus su MongoDB

MongoDB saugos kontrolinis sąrašas yra gerų patarimų, kaip sumažinti tinklo įsilaužimo ir duomenų nutekėjimo riziką. Nesunku tai atmesti ir pasakyti, kad kūrimo serveriui nereikia aukšto lygio saugumo. Tačiau tai nėra taip paprasta ir tai taikoma visiems MongoDB serveriams. Ypač jei nėra įtikinamos priežasties naudoti mapReduce, group arba $kur, turite išjungti savavališko kodo naudojimą „JavaScript“ įrašydami į konfigūracijos failą javascriptEnabled:false. Kadangi duomenų failai nėra užšifruoti standartiniame MongoDB, prasminga paleisti MongoDB su Atsidavęs vartotojas, kuri turi visišką prieigą prie failų, ribotą prieigą tik prie jo ir galimybę naudoti pačios operacinės sistemos failų prieigos valdiklius.

Klaida kuriant grandinę

MongoDB nenaudoja schemos. Bet tai nereiškia, kad schema nereikalinga. Jei norite tiesiog saugoti dokumentus be jokio nuoseklaus šablono, juos saugoti gali būti greita ir paprasta, tačiau vėliau juos atkurti gali būti sunku. velniškai sunku.

Klasikinis straipsnis "6 „MongoDB“ schemos dizaino taisyklės“ Verta perskaityti ir turi panašių funkcijų Schema Explorer trečiosios šalies įrankyje Studio 3T verta naudoti reguliariai tikrinant grandines.

Nepamirškite rūšiavimo tvarkos

Rūšiavimo tvarkos pamiršimas gali sukelti daugiau nusivylimo ir sugaišti daugiau laiko nei bet kuri kita neteisinga konfigūracija. Pagal numatytuosius nustatymus MongoBD naudoja dvejetainis rūšiavimas. Tačiau vargu ar tai niekam bus naudinga. Devintajame praėjusio šimtmečio dešimtmetyje didžiųjų ir mažųjų raidžių, kirčių ir dvejetainių tipų rūšys kartu su karoliukais, kaftanais ir garbanotais ūsais buvo laikomos keistais anachronizmais. Dabar jų naudojimas yra neatleistinas. Realiame gyvenime „motociklas“ yra tas pats, kas „motociklas“. Ir „Britanija“ ir „Britanija“ yra ta pati vieta. Mažoji raidė yra tiesiog didžiosios raidės atitikmuo. Ir neverskite manęs rūšiuoti diakritinių ženklų. Kurdami duomenų bazę MongoDB, naudokite nejautrų kirčio lyginimą ir Registruotis, kurie atitinka kalbą ir sistemos vartotojo kultūra. Taip bus daug lengviau ieškoti eilutės duomenų.

Kurkite kolekcijas su dideliais dokumentais

MongoDB mielai talpina didelius dokumentus iki 16 MB kolekcijose ir GridFS Skirta dideliems, didesniems nei 16 MB dokumentams. Tačiau vien dėl to, kad ten galima sudėti didelius dokumentus, juos ten laikyti nėra gera idėja. „MongoDB“ veiks geriausiai, jei saugote atskirus kelių kilobaitų dydžio dokumentus, juos traktuodami kaip plačios SQL lentelės eilutes. Dėl didelių dokumentų kils problemų produktyvumas.

Kurti dokumentus su dideliais masyvais

Dokumentuose gali būti masyvų. Geriausia, jei elementų skaičius masyve yra toli gražu ne keturženklis skaičius. Jei elementai į masyvą pridedami dažnai, jis išaugs už dokumentą, kuriame jis yra, ir turės būti judėti, vadinasi, bus būtina taip pat atnaujinti indeksus. Iš naujo indeksuojant dokumentą su dideliu masyvu, indeksai dažnai perrašomi, nes yra įrašas, kurioje saugomas indeksas. Šis pakartotinis indeksavimas taip pat įvyksta, kai dokumentas įterpiamas arba ištrinamas.

MongoDB turi kažką vadinamo "užpildymo koeficientas", kuri suteikia galimybę dokumentams plėsti, kad ši problema būtų kuo mažesnė.
Galbūt manote, kad galite apsieiti be masyvo indeksavimo. Deja, indeksų trūkumas gali sukelti kitų problemų. Kadangi dokumentai nuskaitomi nuo pradžios iki pabaigos, elementų paieška masyvo pabaigoje užtruks ilgiau, o dauguma su tokiu dokumentu susijusių operacijų bus lėtas.

Nepamirškite, kad svarbi agregacijos etapų tvarka

Duomenų bazės sistemoje su užklausų optimizavimo priemone jūsų parašytos užklausos yra paaiškinimai, ką norite gauti, o ne kaip tai gauti. Šis mechanizmas veikia pagal analogiją su užsakymu restorane: dažniausiai tiesiog užsisakote patiekalą, o virėjui neduodate išsamių nurodymų.

MongoDB jūs nurodote virėją. Pavyzdžiui, turite įsitikinti, kad duomenys perduodami reduce kuo anksčiau, naudojant dujotiekį $match и $project, o rūšiavimas vyksta tik po to reduce, ir kad paieška būtų atliekama tiksliai tokia tvarka, kokia norite. Jei turite užklausų optimizavimo priemonę, kuri pašalina nereikalingą darbą, optimaliai suskirsto veiksmus ir pasirenka sujungimo tipus, galite jus sugadinti. Naudodami „MongoDB“ galite daugiau valdyti patogumo kaina.

Įrankiai kaip Studija 3T supaprastins agregavimo užklausų kūrimą MongoDB. Apibendrinimo rengyklės funkcija leidžia taikyti konvejerio teiginius vienu etapu ir tikrinti įvesties bei išvesties duomenis kiekviename etape, kad būtų supaprastintas derinimas.

Greito įrašymo naudojimas

Niekada nenustatykite MongoDB rašymo parinkčių, kad jos būtų didelės spartos, bet mažo patikimumo. Šis režimas „failas ir pamiršk“ atrodo greita, nes komanda grąžinama prieš rašant. Jei sistema sugenda prieš įrašant duomenis į diską, jie bus prarasti ir atsiras nenuoseklios būsenos. Laimei, 64 bitų MongoDB įjungtas registravimas.

MMAPv1 ir WiredTiger saugojimo varikliai naudoja registravimą, kad to išvengtų, nors WiredTiger gali atsigauti iki paskutinės nuoseklios valdymo taškas, jei registravimas išjungtas.

Žurnalų kūrimas užtikrina, kad po atkūrimo duomenų bazė būtų nuoseklios būsenos, ir išsaugo visus duomenis, kol jie bus įrašyti į žurnalą. Įrašymų dažnis sukonfigūruojamas naudojant parametrą commitIntervalMs.

Kad būtumėte tikri dėl įrašų, įsitikinkite, kad konfigūracijos faile įjungtas registravimas (storage.journal.enabled), o įrašų dažnis atitinka informacijos kiekį, kurį galite sau leisti prarasti.

Rūšiavimas be indekso

Ieškant ir kaupiant duomenis dažnai reikia rūšiuoti. Tikėkimės, kad tai bus padaryta viename iš paskutinių etapų, išfiltravus rezultatą, siekiant sumažinti rūšiuojamų duomenų kiekį. Ir net šiuo atveju rūšiavimui jums reikės rodiklis. Galite naudoti vieną arba sudėtinį indeksą.

Jei nėra tinkamo indekso, MongoDB apsieis be jo. Bendram visų dokumentų dydžiui yra 32 MB atminties limitas rūšiavimo operacijos, o jei MongoDB pasieks šią ribą, ji arba išmes klaidą, arba grįš tuščias įrašų rinkinys.

Ieškokite be rodyklės palaikymo

Paieškos užklausos atlieka funkciją, panašią į JOIN operaciją SQL. Kad veiktų geriausiai, jiems reikalingas rakto, naudojamo kaip išorinis raktas, vertės indeksas. Tai nėra akivaizdu, nes naudojimas neatsispindi explain(). Tokie indeksai pridedami prie įrašyto indekso explain(), kurį savo ruožtu naudoja vamzdynų operatoriai $match и $sort, kai jie susitinka dujotiekio pradžioje. Dabar indeksai gali apimti bet kurį etapą agregavimo vamzdynas.

Atsisakymas naudoti kelis naujinius

metodas db.collection.update() naudojamas esamo dokumento daliai arba visam dokumentui pakeisti iki visiško pakeitimo, atsižvelgiant į jūsų nurodytą parametrą update. Ne taip akivaizdu, kad jis neapdoros visų kolekcijoje esančių dokumentų, nebent nustatysite parinktį multi atnaujinti visus prašymo kriterijus atitinkančius dokumentus.

Nepamirškite raktų tvarkos maišos lentelėje svarbos

JSON objektą sudaro netvarkinga nulinio dydžio ar daugiau vardo/reikšmių porų rinkinio, kur pavadinimas yra eilutė, o reikšmė yra eilutė, skaičius, loginis, nulis, objektas arba masyvas.

Deja, BSON ieškodamas daug dėmesio skiria tvarkai. MongoDB raktų tvarka integruotuose objektuose klausimaiTy { firstname: "Phil", surname: "factor" } - tai ne tas pats kaip { { surname: "factor", firstname: "Phil" }. Tai yra, jei norite būti tikri, kad juos rasite, savo dokumentuose turite išsaugoti pavadinimo/reikšmių porų tvarką.

Nesusipainiokite "Nulis" и "neapibrėžtas"

Vertė "neapibrėžtas" pagal JSON niekada negaliojo oficialus standartas JSON (ECMA-404, 5 skyrius), net jei jis naudojamas JavaScript. Be to, BSON jis yra pasenęs ir konvertuojamas į $null, kuris ne visada yra geras sprendimas. Venkite naudoti "neapibrėžtas" MongoDB.

Naudoti $limit() be $sort()

Gana dažnai, kai kuriate MongoDB, naudinga tiesiog pamatyti rezultato pavyzdį, kuris bus grąžintas iš užklausos ar agregacijos. Šiai užduočiai atlikti jums reikės $limit(), bet jis niekada neturėtų būti galutiniame kode, nebent jį naudojote anksčiau $sort. Šis mechanikas reikalingas, nes kitu atveju negalite garantuoti rezultato eiliškumo ir negalėsite patikimai peržiūrėti duomenų. Rezultato viršuje gausite skirtingus įrašus, priklausomai nuo rūšiavimo. Kad užklausos ir agregacijos veiktų patikimai, jos turi būti deterministinės, ty kiekvieną kartą vykdant duoti tuos pačius rezultatus. Kodas, kuriame yra $limit(), bet ne $sort, nebus deterministinis ir vėliau gali sukelti klaidų, kurias bus sunku atsekti.

išvada

Vienintelis būdas nusivilti MongoDB yra palyginti ją tiesiogiai su kito tipo duomenų baze, pvz., DBVS, arba pradėti ją naudoti remiantis tam tikrais lūkesčiais. Tai tarsi apelsino palyginimas su šakute. Duomenų bazių sistemos tarnauja specifiniams tikslams. Geriausia šiuos skirtumus suprasti ir įvertinti patiems. Būtų gaila daryti spaudimą MongoDB kūrėjams dėl kelio, kuris privertė juos eiti DBVS keliu. Noriu pamatyti naujų ir įdomių būdų, kaip išspręsti senas problemas, pavyzdžiui, užtikrinti duomenų vientisumą ir sukurti duomenų sistemas, kurios būtų atsparios gedimams ir kenkėjiškoms atakoms.

„MongoDB“ 4.0 versijoje įdiegė ACID sandorius yra geras pavyzdys, kaip naujoviškai įvedami svarbūs patobulinimai. Kelių dokumentų ir kelių pareiškimų operacijos dabar yra labai didelės. Taip pat galima reguliuoti laiką, reikalingą spynoms įsigyti ir užstrigusioms operacijoms nutraukti, taip pat pakeisti izoliacijos lygį.

14 dalykų, kuriuos norėčiau žinoti prieš pradėdamas dirbti su MongoDB

Skaityti daugiau:

Šaltinis: www.habr.com

Добавить комментарий