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.
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ä.
***