14 asja, mida sooviksin teada enne MongoDB-ga alustamist

Artikli tõlge valmis kursuse alguse eelõhtul "Mitterelatsioonilised andmebaasid".

14 asja, mida sooviksin teada enne MongoDB-ga alustamist

Highlights:

  • Skeemi väljatöötamine on äärmiselt oluline, kuigi see on MongoDB-s valikuline.
  • Samuti peavad indeksid vastama teie skeemile ja juurdepääsumustritele.
  • Vältige suurte objektide ja suurte massiivide kasutamist.
  • Olge MongoDB sätetega ettevaatlik, eriti kui tegemist on turvalisuse ja töökindlusega.
  • MongoDB-l ei ole päringu optimeerijat, seega peate päringutoimingute tegemisel olema ettevaatlik.

Olen andmebaasidega töötanud väga pikka aega, kuid alles hiljuti avastasin MongoDB. Soovin teada mõningaid asju, enne kui sellega töötama hakkasin. Kui inimesel on teatud valdkonnas juba kogemusi, on tal eelarvamused, mis on andmebaasid ja millega nad tegelevad. Lootuses, et teised saaksid seda hõlpsamini mõista, esitan loetelu levinud vigadest.

MongoDB serveri loomine ilma autentimiseta

Kahjuks on MongoDB vaikimisi installitud ilma autentimiseta. Kohaliku juurdepääsuga tööjaama puhul on see tava normaalne. Kuid kuna MongoDB on mitme kasutajaga süsteem, millele meeldib kasutada palju mälu, on parem, kui panete selle võimalikult suure RAM-iga serverisse, isegi kui kavatsete seda kasutada ainult arendamiseks. Vaikimisi pordi kaudu serverisse installimine võib olla problemaatiline, eriti kui päringus saab käivitada mis tahes JavaScripti koodi (näiteks $where ideena süstid).

Autentimismeetodeid on mitu, kuid kõige lihtsam on määrata kasutajatunnus/parool. Kasutage seda ideed, kui mõtlete väljamõeldud autentimisele, mis põhineb sellel LDAP. Turvalisuse osas tuleks MongoDB-d pidevalt uuendada ja logisid tuleks alati kontrollida volitamata juurdepääsu suhtes. Näiteks meeldib mulle vaikepordiks valida mõni muu port.

Ärge unustage siduda ründepinda MongoDB-ga

MongoDB turvalisuse kontroll-loend sisaldab häid näpunäiteid võrgu sissetungimise ja andmelekke riski vähendamiseks. Lihtne on see maha jätta ja öelda, et arendusserver ei vaja kõrget turvalisust. Kuid see pole nii lihtne ja see kehtib kõigi MongoDB serverite kohta. Eelkõige siis, kui kasutamiseks pole mõjuvat põhjust mapReduce, group või $kus, peate JavaScriptis suvalise koodi kasutamise keelama, kirjutades konfiguratsioonifaili javascriptEnabled:false. Kuna andmefaile ei krüptita standardses MongoDB-s, on mõistlik MongoDB-d käivitada Pühendunud kasutaja, millel on täielik juurdepääs failidele, piiratud juurdepääs ainult sellele ja võimalus kasutada operatsioonisüsteemi enda failidele juurdepääsu juhtelemente.

Viga vooluringi arendamisel

MongoDB ei kasuta skeemi. Kuid see ei tähenda, et skeemi pole vaja. Kui soovite lihtsalt dokumente salvestada ilma järjepideva mustriga, võib nende salvestamine olla kiire ja lihtne, kuid nende hilisem allalaadimine võib olla keeruline. kuradima raske.

Klassikaline artikkel "6 rusikareeglit MongoDB skeemi kujundamiseks" See on lugemist väärt ja sisaldab sarnaseid funktsioone Skeemiuurija kolmanda osapoole tööriistas Studio 3T tasub seda kasutada vooluahelate regulaarseks kontrollimiseks.

Ärge unustage sorteerimisjärjekorda

Sorteerimisjärjestuse unustamine võib põhjustada rohkem frustratsiooni ja ajaraiskamist kui mis tahes muu vale seadistus. Vaikimisi kasutab MongoBD binaarne sortimine. Kuid tõenäoliselt pole see kellelegi kasulik. Möödunud sajandi 80ndatel peeti tõstutundlikke, aktsenditundlikke ja kahendsõnumeid koos helmeste, kaftanide ja lokkis vuntsidega uudishimulikeks anakronismideks. Nüüd on nende kasutamine andestamatu. Päriselus on "mootorratas" sama, mis "Mootorratas". Ja "Suurbritannia" ja "Suurbritannia" on sama koht. Väiketäht on lihtsalt suurtähe ekvivalent. Ja ärge pange mind diakriitikute sorteerimisega alustama. MongoDB-s andmebaasi loomisel kasutage rõhutundlikku võrdlemist ja Registreeri, mis vastavad keelele ja süsteemi kasutajakultuur. See muudab stringiandmete otsimise palju lihtsamaks.

Looge suurte dokumentidega kogusid

MongoDB majutab hea meelega suuri dokumente kuni 16 MB kogudes ja GridFS Mõeldud suurte dokumentide jaoks, mis on suuremad kui 16 MB. Kuid lihtsalt sellepärast, et sinna saab paigutada suuri dokumente, pole nende seal hoidmine hea mõte. MongoDB töötab kõige paremini, kui salvestate üksikuid mõne kilobaidi suuruseid dokumente, käsitledes neid pigem laia SQL-tabeli ridadena. Suured dokumendid tekitavad probleeme tootlikkus.

Suurte massiividega dokumentide loomine

Dokumendid võivad sisaldada massiive. Parim on, kui massiivi elementide arv on kaugel neljakohalisest numbrist. Kui massiivile sageli elemente lisatakse, kasvab see seda sisaldavast dokumendist välja ja peabki olema liikuma, mis tähendab, et see on vajalik uuendada ka indekseid. Suure massiiviga dokumendi uuesti indekseerimisel kirjutatakse indeksid sageli üle, kuna seal on rekord, mis salvestab oma indeksi. See uuesti indekseerimine toimub ka dokumendi sisestamisel või kustutamisel.

MongoDB-l on midagi nn "täitmistegur", mis annab ruumi dokumentidele selle probleemi minimeerimiseks.
Võib arvata, et saate ilma massiivi indekseerimiseta hakkama. Kahjuks võib indeksite puudumine põhjustada muid probleeme. Kuna dokumente skannitakse algusest lõpuni, võtab massiivi lõpus olevate elementide otsimine kauem aega ja enamik sellise dokumendiga seotud toiminguid aeglane.

Ärge unustage, et liite etappide järjekord on oluline

Päringu optimeerijaga andmebaasisüsteemis on teie kirjutatud päringud selgitused selle kohta, mida soovite saada, mitte kuidas seda saada. See mehhanism toimib analoogselt restoranis tellimisega: tavaliselt tellite lihtsalt roa ja ei anna kokale üksikasjalikke juhiseid.

MongoDB-s juhendate kokka. Näiteks peate veenduma, et andmed läbivad reduce võimalikult varakult kasutusel $match и $projectja sorteerimine toimub alles pärast seda reduceja et otsing toimub täpselt soovitud järjekorras. Päringu optimeerija, mis välistab tarbetu töö, järjestab samme optimaalselt ja valib liitumistüübid, võib teid rikkuda. MongoDB-ga on teil mugavuse hinnaga suurem kontroll.

Tööriistad nagu Stuudio 3T lihtsustab koondamispäringute koostamist MongoDB. Koondredaktori funktsioon võimaldab teil rakendada konveieri avaldusi üks etapp korraga ning kontrollida igas etapis sisend- ja väljundandmeid, et silumist lihtsustada.

Kiirsalvestuse kasutamine

Ärge kunagi määrake MongoDB kirjutussuvanditeks kiiret, kuid madalat töökindlust. See režiim "faili ja unusta" tundub kiire, sest käsk tagastatakse enne kirjutamist. Kui süsteem jookseb kokku enne andmete kettale kirjutamist, lähevad need kaotsi ja satuvad ebajärjekindlasse olekusse. Õnneks on 64-bitises MongoDB logimine lubatud.

MMAPv1 ja WiredTiger salvestusmootorid kasutavad selle vältimiseks logimist, kuigi WiredTiger suudab taastuda kuni viimase järjekindluseni kontrollpunkt, kui logimine on keelatud.

Päeviku koostamine tagab, et andmebaas on pärast taastamist järjepidevas olekus ja säilitab kõik andmed, kuni need logisse kirjutatakse. Salvestiste sagedus konfigureeritakse parameetri abil commitIntervalMs.

Kirjetes veendumiseks veenduge, et logimine on konfiguratsioonifailis lubatud (storage.journal.enabled), ja salvestuste sagedus vastab teabe hulgale, mille kaotamist saate endale lubada.

Sorteerimine ilma indeksita

Otsimisel ja koondamisel tekib sageli vajadus andmeid sortida. Loodame, et see tehakse ühes viimases etapis pärast tulemuse filtreerimist, et vähendada sorteeritavate andmete hulka. Ja isegi sel juhul vajate sorteerimiseks indeks. Võite kasutada üksik- või liitindeksit.

Kui sobivat indeksit pole, saab MongoDB ilma selleta hakkama. Kõigi sisestatud dokumentide kogumahule on mälupiirang 32 MB sorteerimistoimingud, ja kui MongoDB jõuab selle piirini, annab see kas vea või tagastab tühi rekordkogum.

Otsige ilma indeksi toeta

Otsingupäringud täidavad SQL-i JOIN-toiminguga sarnast funktsiooni. Parimaks tööks vajavad nad võõrvõtmena kasutatava võtme väärtuse indeksit. See pole ilmne, sest kasutust ei kajastata explain(). Sellised indeksid on lisaks sisse kirjutatud indeksile explain(), mida omakorda kasutavad torujuhtme operaatorid $match и $sort, kui nad kohtuvad torujuhtme alguses. Indeksid võivad nüüd hõlmata mis tahes etappi agregatsiooni torujuhe.

Mitme värskenduse kasutamisest loobumine

Meetod db.collection.update() kasutatakse olemasoleva dokumendi osa või kogu dokumendi muutmiseks kuni täieliku asendamiseni, olenevalt teie määratud parameetrist update. Mis pole nii ilmne, on see, et see ei töötle kõiki kogus olevaid dokumente, kui te seda valikut ei määra multi uuendada kõiki dokumente, mis vastavad taotluse kriteeriumidele.

Ärge unustage võtmete järjestuse tähtsust räsitabelis

JSON-is koosneb objekt järjestamata kogust, mille suurus on null või enama nime/väärtuse paari, kus nimi on string ja väärtus on string, arv, tõeväärtus, null, objekt või massiiv.

Kahjuks paneb BSON otsimisel suurt rõhku järjestusele. MongoDB-s võtmete järjekord sisseehitatud objektides küsimustess.t. { firstname: "Phil", surname: "factor" } - see pole sama, mis { { surname: "factor", firstname: "Phil" }. See tähendab, et kui soovite nende leidmises kindel olla, peate oma dokumentidesse salvestama nime/väärtuse paaride järjekorra.

Ärge olge segaduses "Null" и "määratlemata"

Väärtus "määratlemata" andmetel ei kehtinud kunagi JSON-is ametlik standard JSON (ECMA-404 jaotis 5), kuigi seda kasutatakse JavaScriptis. Veelgi enam, BSON-i jaoks on see vananenud ja teisendatakse $null, mis pole alati hea lahendus. Vältige kasutamist "määratlemata" MongoDB-s.

Kasutama $limit() ilma $sort()

Üsna sageli on MongoDB-s arendamisel kasulik näha lihtsalt päringust või koondamisest tagastatava tulemuse näidist. Selle ülesande jaoks vajate $limit(), kuid see ei tohiks kunagi olla lõplikus koodis, kui te seda varem ei kasuta $sort. See mehaanik on vajalik, sest vastasel juhul ei saa te tulemuse järjekorda tagada ja andmeid ei saa usaldusväärselt vaadata. Tulemuse ülaosas näete olenevalt sorteerimisest erinevaid kirjeid. Usaldusväärseks töötamiseks peavad päringud ja agregatsioonid olema deterministlikud, st andma samu tulemusi iga kord, kui neid täidetakse. Kood, mis sisaldab $limit(), kuid mitte $sort, ei ole deterministlik ja võib hiljem põhjustada vigu, mida on raske leida.

Järeldus

Ainus võimalus MongoDB-s pettuda on võrrelda seda otse teist tüüpi andmebaasiga, näiteks DBMS-iga, või hakata seda kasutama teatud ootuste alusel. See on nagu apelsini võrdlemine kahvliga. Andmebaasisüsteemid teenivad kindlaid eesmärke. Parim on neid erinevusi lihtsalt ise mõista ja hinnata. Oleks häbi avaldada MongoDB arendajatele survet tee üle, mis sundis neid DBMS-i teele minema. Soovin näha uusi ja huvitavaid viise vanade probleemide lahendamiseks, nagu andmete terviklikkuse tagamine ning rikete ja pahatahtlike rünnakute suhtes vastupidavate andmesüsteemide loomine.

MongoDB poolt ACID tehingute kasutuselevõtt versioonis 4.0 on hea näide oluliste täiustuste uuenduslikul viisil kasutuselevõtust. Mitme dokumendi ja mitme avalduse tehingud on nüüdseks tuumaks. Samuti on võimalik reguleerida lukkude soetamiseks ja kinnijäänud tehingute lõpetamiseks kuluvat aega ning muuta isolatsioonitaset.

14 asja, mida sooviksin teada enne MongoDB-ga alustamist

Loe rohkem:

Allikas: www.habr.com

Lisa kommentaar