Suh­teel­li­set tie­to­kan­nat olivat vuo­si­kym­men­ten ajan suosituin ratkaisu tietojen hal­lin­taan. Nykyisten verk­ko­so­vel­lus­ten omi­nais­piir­re on kuitenkin tietojen määrän ja mo­ni­muo­toi­suu­den kasvu, mikä on tehnyt do­ku­ment­ti­poh­jai­sis­ta tie­to­kan­nois­ta, kuten Mongo DB:stä, vakavan kil­pai­li­jan. Selitämme, mitä do­ku­ment­ti­poh­jai­nen lä­hes­ty­mis­ta­pa on ja mitä etuja tämä tie­to­jen­hal­lin­ta­mal­li tarjoaa.

Miten MongoDB eroaa muista tie­to­kan­nois­ta?

Pe­rin­tei­sis­sä re­laa­tio­tie­to­kan­nois­sa tiedot tal­len­ne­taan jä­sen­nel­tyyn tau­luk­koon. MongoDB, jonka nimi on johdettu sanasta humongous (valtava), on do­ku­ment­ti­poh­jai­nen tie­to­kan­ta­jär­jes­tel­mä. MongoDB:ssä tiedot ryh­mi­tel­lään jä­sen­te­le­mät­tö­mäl­lä tavalla tie­to­kan­taoh­jel­man kutsumiin ko­koel­miin.

Toinen keskeinen ero on, että MongoDB ei käytä SQL:ää ky­se­ly­kie­li­nä, joten se luo­ki­tel­laan NoSQL-tie­to­kan­ta­jär­jes­tel­mäk­si. Sen sijaan MongoDB käyttää Ja­vaSc­ript-pohjaista MongoDB Query Language (MQL) -ky­se­ly­kiel­tä. Näin ollen MongoDB-tietueet tal­len­ne­taan BSON-muodossa, joka on mal­lin­net­tu JSON:n mukaan. Tämä tar­koit­taa, että kaikki Ja­vaSc­ript-tie­to­tyy­pit ovat tuettuja, minkä vuoksi MongoDB on tullut ihan­teel­li­sek­si va­lin­nak­si monille Ja­vaSc­ript-poh­jai­sil­le alus­toil­le.

Toinen MongoDB-tie­to­kan­to­jen omi­nai­suus on niiden kyky skaa­lau­tua vaa­ka­suun­nas­sa. Tämä tar­koit­taa, että tie­to­kan­nan tiedot voidaan jakaa useille pal­ve­li­mil­le sen sijaan, että ne tal­len­net­tai­siin yhteen kes­ki­tet­tyyn si­jain­tiin. Tämä lä­hes­ty­mis­ta­pa parantaa tietojen saa­ta­vuut­ta ja tie­to­kan­nan yleistä suo­ri­tus­ky­kyä. Vaa­ka­suo­ra skaalaus on usein kus­tan­nus­te­hok­kaam­paa kuin yhden pal­ve­li­men päi­vit­tä­mi­nen te­hok­kaam­mal­la lait­teis­tol­la (pys­ty­suo­ra skaalaus).

Miten MongoDB toimii?

Toisin kuin MySQL, MongoDB käyttää täysin erilaista lä­hes­ty­mis­ta­paa tietojen tal­len­ta­mi­seen ja toimii asia­kir­joi­hin pe­rus­tu­val­la tavalla. Sen sijaan, että tiedot tal­len­net­tai­siin tau­luk­ko­muo­dos­sa, jossa jo­kai­sel­la rivillä on sama määrä kenttiä, jotka on täy­tet­tä­vä arvoilla, MongoDB-tie­to­kan­nat tal­len­ta­vat tiedot BSON-asia­kir­joi­hin, joilla ei ole ennalta mää­ri­tel­tyä ra­ken­net­ta. Kenttien määrä voi vaihdella asia­kir­jo­jen välillä, eikä kenttien tarvitse olla keskenään yh­den­mu­kai­sia. Do­ku­men­tit täyttävät sa­man­lai­sen roolin kuin rivit SQL-tau­lu­kos­sa, kun taas näissä do­ku­men­teis­sa mää­ri­tel­lyt kentät toimivat sa­rak­kei­na.

MongoDB-tie­to­kan­to­jen kanssa työs­ken­te­lyyn on olemassa monia työkaluja. Luo­tet­ta­van MongoDB Shellin lisäksi voit käyttää myös GUI MongoDB Compassia MongoDB-tie­to­kan­to­jen hal­lin­taan. Tässä ar­tik­ke­lis­sa kes­ki­tym­me kuitenkin Shell-ko­men­toi­hin.

Koska MQL perustuu Ja­vaSc­rip­tiin, on jo olemassa useita valmiita funk­tioi­ta, joita voit käyttää mo­ni­mut­kai­siin ky­se­lyi­hin ja ko­men­toi­hin. Suurin osa kirjoitus- ja lu­ku­ko­men­nois­ta on ra­ken­teel­taan sa­man­lai­sia kuin alla olevassa esi­mer­kis­sä esitetyt komennot. Näiden ko­men­to­jen lisäksi on olemassa lukuisia muita komentoja, joita voit käyttää MongoDB-tie­to­kan­nan hal­lin­taan. Nämä on do­ku­men­toi­tu kat­ta­vas­ti ja selitetty yk­si­tyis­koh­tai­ses­ti MongoDB:n do­ku­men­taa­tios­sa.

> db.students.find(Name : "Charlie")
> db.students.updateOne(Name : "Charlie", Semester : 2)
> db.students.deleteOne(Name : "Peter")
> db.students.insertOne({
Name : "Elsie"
Age : 18
Semester : 1
})

Yllä olevassa esi­mer­kis­sä on sarja MongoDB-tie­to­kan­ta­ko­men­to­ja, jotka kaikki on ra­ken­net­tu samalla tavalla. En­sim­mäi­se­nä on ”db”, joka viittaa koko tie­to­kan­taan, sitten ”students”, joka viittaa tiettyyn ko­koel­maan, jossa vastaavat toiminnot tulisi suorittaa. Kokoelman jälkeen tulee menetelmä (find, update, remove, insert), jota tulisi käyttää.

Voit käyttää find()-me­ne­tel­mää tietyn asia­kir­jan et­si­mi­seen. Jos jätät pa­ra­met­ri­ken­tän tyhjäksi, se palauttaa kaikki va­lit­se­ma­si kokoelman asia­kir­jat. Yllä olevassa esi­mer­kis­sä MongoDB etsii kaikki asia­kir­jat, joiden “Name”-kentän arvo on “Charlie”.

updateOne()-me­ne­tel­mää voidaan käyttää do­ku­men­tin arvojen kor­vaa­mi­seen. update()-menetelmä ottaa kaksi ar­gu­ment­tia. En­sim­mäi­nen ar­gu­ment­ti on va­lin­tak­ri­tee­ri ja toinen on kor­vat­ta­va avain-arvo-pari. Esi­mer­kis­sä valitaan kaikki opis­ke­li­jat, joiden nimi on “Charlie”. Sitten arvo “2” syötetään “Semester”-kenttään opis­ke­li­joil­le, joiden nimi on Charlie.

deleteOne()-metodi ottaa vain yhden ar­gu­men­tin. Se on va­lin­tak­ri­tee­ri, joka määrittää, mitkä do­ku­men­tit pois­te­taan tie­to­kan­nas­ta. Tässä kaikki opis­ke­li­jat, joiden nimi on Peter, pois­te­taan tie­to­kan­nas­ta.

insertOne()-metodi ottaa myös ar­gu­men­tin. Tässä metodissa ar­gu­ment­ti on li­sät­tä­vän do­ku­men­tin JSON-sisältö. Do­ku­ment­te­ja li­sät­täes­sä on tärkeää varmistaa, että jo­kai­sel­la MongoDB-kokoelman do­ku­men­til­la on yk­si­löl­li­nen 12-tavun hek­sa­de­si­maa­li­lu­ku. Tämä luku toimii do­ku­men­tin ob­jek­ti­tun­nuk­se­na. Jos tätä ei määritetä do­ku­ment­tia li­sät­täes­sä, MongoDB luo do­ku­men­til­le au­to­maat­ti­ses­ti tunnuksen.

Mitkä ovat MongoDB:n edut?

MongoDB:n rakenne tarjoaa käyt­tä­jil­le useita etuja, eri­tyi­ses­ti jous­ta­vuu­den ja skaa­lau­tu­vuu­den osalta. Do­ku­ment­ti­poh­jai­sen tietojen tal­len­nuk­sen yksi keskeinen etu on, että toisin kuin re­laa­tio­tie­to­kan­nois­sa, kaikkien tie­tuei­den ei tarvitse olla samoja att­ri­buut­te­ja. Tämä mah­dol­lis­taa struk­tu­roi­mat­to­mien ja puo­li­struk­tu­roi­tu­jen tietojen tal­len­nuk­sen. Lisäksi yk­sit­täi­siä do­ku­ment­te­ja voidaan muokata (esi­mer­kik­si li­sää­mäl­lä tai pois­ta­mal­la att­ri­buut­ti/kenttä) ilman, että muita saman kokoelman do­ku­ment­te­ja tarvitsee muokata. Koska MongoDB:n do­ku­men­tit tal­len­ne­taan BSON-muodossa, MongoDB-tie­to­kan­nat ovat myös erittäin yh­teen­so­pi­via monien yleisesti käy­tet­ty­jen Ja­vaSc­ript-alustojen kanssa.

MongoDB tallentaa paitsi struk­tu­roi­mat­to­mia tietoja myös tarjoaa korkean tason ho­ri­son­taa­li­sen skaa­lau­tu­vuu­den rik­ko­mat­ta ACID-pe­ri­aat­tei­ta (atomicity, con­sis­tency, isolation, du­ra­bi­li­ty). Ha­jau­te­tuis­sa tie­to­kan­nois­sa yh­den­mu­kai­suu­den var­mis­ta­mi­nen voi usein olla haas­teel­lis­ta, koska tiedot tal­len­ne­taan eri pal­ve­li­mil­le. Kun useisiin asia­kir­joi­hin tehdään muutoksia sa­ma­nai­kai­ses­ti, nämä muutokset eivät vält­tä­mät­tä välity vä­lit­tö­mäs­ti kaikkiin tie­to­kan­ta­jär­jes­tel­män käyt­tä­miin pal­ve­li­miin. Jos kyselyitä on paljon, tämä voi joskus johtaa tietojen epä­joh­don­mu­kai­suu­teen. Vuonna 2019 jul­kais­tun MongoDB 4.2:n myötä on kuitenkin nyt mah­dol­lis­ta tehdä muutoksia useisiin asia­kir­joi­hin eri pal­ve­li­mil­la ilman, että joh­don­mu­kai­suus tai saatavuus kärsii.

Vinkki

Tar­vit­set­ko do­ku­ment­ti­poh­jai­sen tie­to­kan­nan, joka skaa­lau­tuu verk­ko­so­vel­luk­se­si vaa­ti­mus­ten mukaan? MongoDB on täy­del­li­nen ratkaisu!

Mihin MongoDB:tä voidaan käyttää?

MongoDB on erin­omai­nen valinta verk­kopro­jek­teil­le, jotka pe­rus­tu­vat erittäin suuriin, ra­ken­teet­to­miin tie­to­jouk­koi­hin. Do­ku­ment­ti­poh­jai­nen jär­jes­tel­mä, jolla ei ole kiinteää skeemaa, sopii erin­omai­ses­ti mo­nen­lais­ten tie­to­tyyp­pien kä­sit­te­lyyn, jotka vaativat nopeaa tal­len­nus­ta ja kä­sit­te­lyä.

Tie­to­kan­ta­jär­jes­tel­mä mah­dol­lis­taa myös ho­ri­son­taa­li­sen, lähes ra­jat­to­man skaa­lau­tu­vuu­den, sillä tie­to­kan­nat voidaan jakaa vai­vat­to­mas­ti useille pal­ve­li­mil­le toi­min­nal­li­suut­ta hei­ken­tä­mät­tä. Lisäksi MongoDB:n avulla voit helposti luoda kopioita tie­to­kan­nas­ta­si ja asettaa ne useiden pal­ve­li­mien saa­ta­vil­le, mikä takaa tietojesi pit­kä­ai­kai­sen tur­val­li­suu­den ja saa­ta­vuu­den. Do­ku­ment­ti­poh­jai­nen tie­to­kan­taoh­jel­ma osoittaa myös vai­kut­ta­via omi­nai­suuk­sia tietojen yh­dis­tä­mi­ses­sä, olipa kyseessä sitten yksi tai useampi tie­to­läh­de.

MongoDB sopii erin­omai­ses­ti verk­kopro­jek­tei­hin, joilla on seuraavat omi­nai­suu­det:

  • Skaa­lau­tu­vuus: verk­kopro­jek­ti­si kasvaessa pyyntöjen määrä yleensä kasvaa, mikä lisää tie­to­kan­nan kuor­mi­tus­ta.
  • Saatavuus: verk­ko­so­vel­luk­se­si on oltava käy­tet­tä­vis­sä kes­key­tyk­set­tä, myös pal­ve­li­men vi­ka­ti­lan­teis­sa.
  • Jous­ta­vuus: pro­jek­ti­si tulisi mah­dol­lis­taa dy­naa­mi­nen mu­kau­tu­mi­nen kaikkina aikoina.

Etkö ole varma, mikä tie­to­kan­ta­mal­li sopii parhaiten verk­kopro­jek­tii­si? Ei hätää, sillä sinun ei tarvitse valita vain yhtä mallia. Eri tyyppisiä tie­to­kan­ta­mal­le­ja on mah­dol­lis­ta yh­dis­tel­lä, ja useamman kuin yhden mallin va­lit­se­mi­nen voi olla sopivin ratkaisu pro­jek­ti­si vaa­ti­muk­siin.

Siirry pää­va­lik­koon