DynamoDB perusteet

DynamoDB:n asennus

DynamoDB on AWS:n NoSQL-tietokanta, joka voidaan asentaa omalle koneelle, tai sitä voidaan käyttää suoraan AWS:n pilvialustalta. Koska käytössämme olevat AWS-käyttäjätilit ovat maksuttomia, voimme periaatteessa harjoitella DDB:n käyttöä myös suoraan pilvialustalta. Omalla koneella sijaitseva tietokanta on kuitenkin yleensä parempi ja nopeampi vaihtoehto, joten se kannattaa myös asentaa.

Omalle koneelle asennus on helpointa tämän docker-compose.yml -tiedoston avulla. Laita tiedosto dynamodb-nimiseen kansioon omaan kotihakemistoosi. Aja se komennolla docker-compose up. Osoitteeseen http://localhost:8081 syntyy client-sovellus, jolla voit hallinnoida tietokantoja. Katso ddb_node.zip -esimerkistä, kuinka otat yhteyden lokaaliin DynamoDB-kantaan JS-sovelluksesta.

DynamoDB-taulun rakenne

DynamoDB muistuttaa hieman MongoDB:tä, mutta myös eroja on. DynamoDB:ssä tiedon varastopaikka on table eli taulu. Kuvassa on Products-taulu.

ddbtable

Taulu muodostuu itemeistä. Item muodostuu primary keystä ja attribuuteista. Primary key voi muodostua kahdesta osasta: partition keystä ja sort keystä. Usein käytetään kuitenkin vain yhtä primary keytä, eli pelkkää partition keytä. Itemien attribuuteilla voi olla erilaiset skeemat, eli samaan tauluun voidaan tallentaa itemeita joissa on eri muotoista dataa. DynamoDB ei tarjoa datalle minkäänlaista skeemaa, vaan sḱeeman määrittely on täysin käyttäjän vastuulla. yllä olevassa kuvassa lukeekin sarakkeiden otsikoiden paikalla "Schema is defined per item", koska sarakkeissa oleva data ei noudata aina samaa skeemaa.

Products-taulun ensimmäinen item JSON-muodossa:

{
  "ProductID" : 1
  "Type" : "Book ID",
  "Name" : "Odyssey",
  "Author" : "Homer",
  "PubYear": 1871
}

DynamoDB:n tietotyypit

Edellä esitetyssä Itemissa ei esitetty lainkaan tietotyyppejä, jotka ovat kuitenkin aina mukana DDB-taulujen datassa. Kehittäjän ei kuitenkaan tarvitse välttämättä kiinnittää mitään huomiota tietotyyppeihin, sillä esim. datan muunnos DDB-taulun datasta JS-oliodataksi, ja toisinpäin, toimii DDB:n JS-API:n documentClientilla automaattisesti.

Alla on esitetty Persons-taulun itemin tietotyypit. Itemissa on vain yksi primary key, eli person_id. Itemin primary keyn ja attribuuttien arvojen tietotyypit on merkattu oliosyntaksilla. Tietotyyppi merkitään DDB:ssä attribuutin arvon eteen, niin että tyyppi ja attribuutin arvo muodostavat olion eli avain-arvoparin. Punaiset merkinnät eivät kuulu syntaksiin, vaan ne ovat ainoastaan selvennöksiä:

{
  "person_id" : {N: 123},  Number (N)
  "last_name" : {S: "Doe"}, String (S)
  "first_name" : {S: "John"},
  "married" : {BOOL: true}, Boolean (BOOL)
  "next_anniversary" :  {M:
  {
    "year" : 2021,
    "month" : 5,
    "day" : 30
  } }, Map (M)
  "children"  : {L:
    ["Paulo", "Richard", "Jane", "Mary" ] } List (L)
}

DynamoDB:n varatut sanat

DynamoDB:n attribuuttien avaimina ei saa käyttää ns. varattuja sanoja. Niiden kanssa joutuukin olemaan tarkkana, koska niitä on niin paljon. Huomaa erityisesti, että "name" on varattu sana.

DynamoDB:n käsittely Nodejs:llä

DynamoDB:n JS-API v3 :n avulla voimme luoda tauluja ja suorittaa niille kaikkia tarpeellisia operaatioita. Webissä olevissa tutoriaaleissa on käytetty vielä paljon DynamoDB:n JS-API:n vanhaa versiota 2, mutta uusissa projekteissa pitäisi aina käyttää versiota 3.

Jos luomme documentClientin @aws-sdk/lib-dynamoDB -kirjastosta, voimme käyttää DDB-kannan käsittelymetodeja sen avulla, kuten AWS:n esimerkeissä on tehty. Tällöin Javascript-tietotyypit muunnetaan automaattisesti DDB-tietotyypeiksi kun data laitetaan kantaan, ja haettaessa data kannasta muunnos tapahtuu toisinpäin. Kehittäjän ei tarvitse huomioida DDB:n tietotyyppejä lainkaan.

Voimme käyttää DynamoDB JS-API v3:a myös pelkästään @aws-sdk/client-dynamodb -kirjaston avulla, eli käytämme pelkkää dynamodbClientia ilman documentClientia. Tällöin on kuitenkin otettava huomioon tietokannan attribuuttien tietotyypit, mikä aiheuttaa pientä ylimääräistä vaivaa kehittäjälle. Siksi on järkevämpää käyttää documentClientia.

DDB-taulua luotaessa määritellään vain primary key ja taulun nimi. Parametri KeySchema sisältää primary keyn avainten tyypit (HASH on partition key ja RANGE on sort key) ja parametri AttributeDefinitions sisältää primary keyn avainten attribuuttien tietotyypit, jotka yleensä ovat 'N' tai 'S'. TableName-parametrissa on taulun nimi.

Kun taulu on luotu, siihen voidaan luoda halutunlaista sisältöä eli uusia avaimia ja attribuutteja. Tavallisten avainten attribuuttien, eli varsinaisen datan, ei tarvitse noudattaa mitään määrättyä skeemaa, vaan saman taulun eri itemien skeemat voivat olla erilaisia. Taulun voi tietysti rakentaa myös niin, että itemit sisältävät muodoltaan samanlaista dataa, kuten relaatiotietokannan tietueet.

Tarkemmat kyselyt DynamoDB-kantaan tehdään yleensä expression-kyselylauseilla.  Kyselyjä voi tehdä myös PartiQL-kyselykielellä, joka on SQL-yhteensopiva kyselykieli. Ihan kaikkia SQL-komentoja ei PartiQL:llä kuitenkaan voi suorittaa.

Kannattaa huomioida, että DynamoDB ei tietotyyppejä lukuun ottamatta, tarjoa datalle minkäänlaista skeemaa. Esimerkiksi tavallisen (ei primary key) attribuutin määrittely uniikiksi on mahdotonta ilman erityistoimenpiteitä. DynamoDB:lle on kuitenkin kehitetty ODM-skeemakirjastoja, kuten Dynamoose, joka on suora kopio MongoDB:n kanssa paljon käytetystä Mongoose-kirjastosta.

Seuraavissa esimerkeissä luodaan DynamoDB-taulu nimeltään Students, laitetaan tauluun opiskelijadataa, ja suoritetaan datalle tyypillisiä CRUD-operaatioita:

-ddb_node.zip - DynamoDB:n käsittely AWS JS-API v3:lla

HUOM! Jos OCRE-tililläsi on sellainen ongelma, että DynamoDB:n käsittely ei onnistu puuttuvien oikeuksien vuoksi, voit koittaa ajaa ddb_node-kansiossa tämän serverless.yml:n, jossa annetaan oikeudet käyttää DDB:tä ja luodaan taulu Students. Toinen vaihtoehto on käyttää lokaalia DynamoDB:tä.

***