Amazon DynamoDB merupakan sebuah basis data NoSQL yang dikelola secara penuh (fully-managed) oleh Amazon Web Service (AWS). Dengan menggunakan DynamoDB, kita dapat dengan mudah menyimpan data dari aplikasi dalam skala apapun tanpa harus memikirkan bagaimana mengelola server basis data secara mandiri. Hal tersebut, membuat DynamoDB menjadi salah satu layanan AWS yang populer digunakan untuk membangun aplikasi dengan arsitektur serverless.
Berikut ini adalah beberapa keuntungan jika kita menggunakan Amazon DynamoDB.
Seperti yang disebutkan sebelumnya, bahwa Amazon DynamoDB merupakan NoSQL yang dikelola secara penuh oleh AWS. Sehingga, kita tidak perlu repot untuk mengelola dan memelihara server basis data secara mandiri. Penggunaan layanan yang fully-managed akan banyak menghemat waktu dan dapat bisa lebih fokus pada pengembangan aplikasi.
Dengan adanya mode on-demand, berapapun jumlah trafik ke aplikasi kita, DynamoDB akan menyesuaikan kapasitasnya agar dapat menghandle trafik tersebut secara otomatis.
Dengan adanya fitur DynamoDB stream, kita dapat menjadikan aktivitas yang terjadi di sebuah table DynamoDB sebagai event yang men-trigger untuk dijalankannya fungsi di AWS Lambda.
Berikut ini adalah beberapa kelemahan jika kita menggunakan Amazon DynamoDB
Proses yang tidak mudah dan perlu usaha lebih jika kita ingin memindahkan data dari Amazon DynamoDB ke sistem basis data lain.
Kita tidak bisa melakukan query se-fleksibel melakukan query di RDBMS. Walaupun demikian, terbatasnya query yang dapat kita lakukan di DynamoDB tentu dengan tujuan untuk menjadikan proses query menjadi cepat dan murah.
Pada bagian ini kita akan coba mempelajari konsep dasar yang ada di Amazon DynamoDB seperti Tables, Items, Attributes, Primary Key, Secondary Indexes, Naming Rules, Data Types, Read/Write Capacity .
Konsep table di DynamoDB sama halnya dengan konsep table pada sistem basis data lain (misalnya konsep table pada MySQL), sebuah table akan berisi kumpulan data, sebagai contoh sebuah table dengan nama Pengguna digunakan untuk menyimpan data-data terkait pengguna aplikasi atau table dengan nama Posts yang digunakan untuk menyimpan data-data postingan dari para pengguna.
Setiap rekam data yang tersimpan pada sebuah table DynamoDB disebut dengan istilah item. Konsep item pada table DynamoDB mirip dengan konsep row/baris pada table MySQL.
Satu item pada table DynamoDB akan berisi satu atau lebih attributes, misalnya sebuah item dalam table Pengguna akan berisi attributes seperti Username, Email, DisplayName, dan sebagainya. Konsep attributes pada table DynamoDB mirip dengan konsep kolom pada table MySQL.
Setiap item di dalam sebuah table DynamoDB memiliki sebuah primary key yang menjadi pembeda antara satu item dengan item lain di dalam table. Primary key dari sebuah table didefinisikan saat proses pembuatan table, terdiri dari satu atau dua attributes yang harus selalu diisi saat akan menambahkan item baru ke dalam table tersebut. Terdapat dua tipe primary key yaitu simple primary key dan composite primary key.
Simple primary key terdiri dari sebuah attribute yang disebut dengan partition key. Misalnya pada table Users kita menjadikan attribute Username sebagai partition key. Disebut sebagai partition key karena nilai dari partition key tersebut akan dijadikan sebagai input untuk menjalankan fungsi hash didalam DynamoDB dan outputnya akan menentukan di partisi mana sebuah item akan disimpan dalam media penyimpan SSD. Sebagai catatan, table dengan simple primary key tidak boleh memiliki dua item dengan nilai partition key yang sama.
Composite primary key terdiri dari dua attributes yang disebut dengan partition key dan sort key. Misalnya pada table Posts kita akan menjadikan attribute Username sebagai partition key dan attribute Title sebagai sort key. Table dengan composite primary key dapat memiliki banyak item dengan nilai partition key yang sama asalkan nilai sort key berbeda atau unik. Salah satu kemudahan yang diberikan saat menggunakan composite primary key adalah saat akan melakukan query data, sebagai contoh saat ingin mendapatkan semua item postingan yang dibuat oleh seorang pengguna, kita dapat melakukan query terhadap table Posts saat nilai Username (partition key) sama dengan Username dari pengguna tersebut.
Seperti yang dibahas pada bagian sebelumnya, saat kita akan mengakses data dari sebuah tabel DynamoDB, kita bisa melakukan query menggunakan nilai dari primary key. Bagaimana jika kita ingin mengakses data dengan melakukan query menggunakan nilai dari attributes lain yang bukan primary key. Solusinya adalah dengan membuat secondary indexes. Dengan membuat secondary indexes kita dapat menjadikan attribute lain sebagai partition key atau sort key. Terdapat dua tipe secondary index di DynamoDB yaitu local secondary index dan global secondary index.
Local secondary index memungkinkan kita untuk membuat index dengan partition key yang sama dengan table utama tapi sort key berbeda. Kita dapat membuat hingga 5 local secondary index pada sebuah table DynamoDB.
Global secondary index memungkinkan kita untuk membuat index dengan partition key dan sort key berbeda dari table utama. Kita dapat membuat hingga 20 global secondary index pada sebuah table DynamoDB.
Tables, Attributes, Secondary Indexes pada DynamoDB haru memiliki nama, tugas kita sebagai developer adalah memberi nama yang ringkas dan memiliki arti. Misalnya kita memberi nama table dengan nama Posts, sesuai dengan fungsinya untuk menyimpan data postingan pengguna. Selain itu, ada beberapa aturan yang harus kita ikuti dalam penamaan tersebut diantaranya:
Semua nama (Tables, Attributes, dan Secondary Indexes) harus dalam UTF-8 dan bersifat case-sensitive (huruf besar atau kecil dianggap nama yang berbeda)
Panjang nama Tables dan Secondary Indexes harus antara 3 sampai 255 karakter dan harus menggunakan karakter-karakter berikut:
a-z
A-Z
0-9
_
(underscore)-
(dash).
(dot)
Panjang nama Attributes harus antara 1 sampai 255 karakter
Hindari penggunaan nama yang masuk kedalam daftar reserved words dan special characters di DynamoDB. Untuk reserved words kita bisa melihat daftarnya di link berikut ini: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html, sedangkan untuk special character yang harus dihindari adalah # (hash) dan : (colon).
Tipe data yang dapat dijadikan nilai dari attributes di DynamoDB dikategorikan menjadi tiga yaitu Scalar, Document, dan Set.
Tipe data Scalar mendukung penulisan nilai tunggal untuk sebuah attribute. Berikut ini adalah daftar tipe data Scalar yang ada di DynamoDB:
number
string
binary
boolean
null
Tipe data Document dapat digunakan untuk menyimpan data kompleks dan bersarang hingga 32 level. Berikut adalah tipe data Document yang ada di DynamoDB:
List (seperti array pada JSON), contoh:
["Kucing", "Kelinci", 3.14159]
Map (seperti object pada JSON), contoh:
{ Nama: "Jago React", Hobi: [ "Baca", "Koding" ] }
Tipe data Set mirip dengan array pada JSON yang hanya diisi satu tipe data. Setiap nilai yang ada di dalam sebuah Set harus bersifat unik. Ada pun tipe data yang didukung yaitu number, string, dan binary.
- Number Set, contoh:
[42.2, -19, 7.5, 3.14]
- String Set, contoh:
["Merah", "Kuning", "Hijau"]
- Binary Set, contoh:
["U3Vubnk=", "UmFpbnk=", "U25vd3k="]
Sebagai catatan, terdapat limitasi ukuran maksimal sebuah item pada table DynamoDB yaitu sebesar 400 KB. Jadi pastikan kita tidak menyimpan data dalam item melebihi ukuran maksimal tersebut.
Saat kita menambahkan data kedalam sebuah table yang ada di suatu AWS Region, maka DynamoDB akan secara otomatis mereplikasi data tersebut di beberapa Availability Zones yang ada, biasanya membutuhkan waktu sekitar 1 detik atau kurang hingga pada akhirnya data tersebut tersedia di beberapa Availability Zones tersebut. Hal tersebut akan menyebabkan isu konsistensi saat membaca data dari table karena ada kemungkinan hasilnya bukan merupakan data terbaru karena masih adanya proses replikasi data yang belum selesai. Untuk mengatasi hal tersebut, terdapat dua mode read consistency di DynamoDB yaitu Eventually Consistent Reads dan Strongly Consistent Reads.
Ini adalah mode default saat kita membaca data dari table, jika masih ada operasi penulisan yang belum selesai maka ada kemungkinan data yang kita dapatkan bukan data terbaru.
Jika kita ingin mendapatkan data paling terbaru saat membaca data, maka kita dapat menggunakan Strongly Consisten Reads. Untuk mengaktifkan mode ini kita dapat menambahkan parameter ConsistentRead dengan nilai true saat membaca data (Query, Scan, dan GetItem). Namun, mode ini memiliki kekurangan seperti latency yang lebih tinggi, tidak bisa digunakan di Global Secondary Index, dan memakan biaya lebih mahal.
Terdapat dua mode pricing Amazon DynamoDB yaitu on-demand dan provisioned.
Mode pricing yang pertama adalah on-demand. Dengan menggunakan mode on-demand, kita hanya akan membayar apa yang kita gunakan saja yaitu berupa akses baca (read) dan tulis (write) data pada sebuah table. Mode ini cocok digunakan jika kita memiliki aplikasi dengan trafik yang tidak terprediksi atau trafik yang belum diketahui (aplikasi baru). Dalam mode on-demand kita harus mengenal dua istilah yang menjadi aspek perhitungan biaya yaitu write request unit dan read request unit.
Satu write request unit dihitung saat kita menambahkan sebuah item ke sebuah table dengan ukuran hingga 1 KB. Jika sebuah item ukurannya lebih dari 1 KB, misalnya 1,5 KB maka akan dihitung dua write request unit dan seterusnya. Namun, jika kita menulis data menggunakan transactional write API, maka membutuhkan dua write request unit untuk setiap item dengan ukuran hingga 1 KB. Sebagai contoh untuk region Asia Pacific (Singapore) harga untuk 1 juta write request unit adalah $1.4231 USD atau sekitar Rp20,000 saja.
Perhitungan read request unit dipengaruhi oleh mode Read Consistency yang digunakan saat membaca data dari table. Membaca satu item dengan ukuran hingga 4 KB, membutuhkan satu read request unit jika menggunakan Strongly Consistent Reads, setengah read request unit jika menggunakan Eventually Consistent Reads, dan dua read request unit jika menggunakan transactional read API. Misalnya kita membaca sebuah item dengan ukuran 8 KB menggunakan Eventually Consistent Reads, maka akan dihitung satu read request unit. Sebagai contoh untuk region Asia Pacific (Singapore) harga untuk 1 juta read request unit adalah $0.285 USD atau sekitar Rp4,000 saja.
Mode pricing yang kedua adalah provisioned. Dengan menggunakan mode ini kita harus menentukan kapasitas read dan write per detik yang dapat dilakukan pada sebuah table. Mode ini cocok digunakan jika trafik dari aplikasi kita mudah untuk diprediksi atau trafik yang konsisten. Dalam mode provisioned kita harus mengenal dua istilah yang menjadi aspek perhitungan biaya yaitu write capacity unit dan read capacity unit.
Satu write capacity unit dapat digunakan untuk menambahkan sebuah item dalam satu detik dengan ukuran data hingga 1 KB. Jika ukuran data dari sebuah item lebih dari 1 KB, maka kita membutuhkan lebih banyak write capacity unit. Selain itu, jika kita menggunakan transactional write API untuk menulis data kita membutuhkan dua write capacity unit untuk menulis item dalam satu detik dengan ukuran data hingga 1 KB. Untuk harga satu write capacity unit di region Asia Pacific (Singapore) adalah sebesar $0.00074 USD atau sekitar Rp10 saja.
Satu read capacity unit dapat digunakan untuk membaca item dalam satu detik dengan ukuran data hingga 4 KB jika menggunakan Strongly Consistent Reads, dan ukuran data hingga 8 KB jika menggunakan Eventually Consistent Reads. Selain itu, jika kita menggunakan transactional read API untuk membaca data, kita membutuhkan dua read capacity untuk untuk membaca item dalam satu detik dengan ukuran data hingga 4 KB. Untuk harga satu read capacity unit adalah sebesar $0.000148 USD atau sekitar Rp2 saja.
Selain read/write capacity unit dan read/write request unit, kita juga akan dikenakan biaya untuk penyimpanan data (storage) dan data transfer. Sebagai contoh untuk region Asia Pacific (Singapore) harga untuk penyimpanan (storage) adalah gratis untuk 25GB pertama per bulan, kemudian untuk selanjutnya adalah sebesar $0.285 USD atau sekitar Rp4,000 setiap GB per bulan. Untuk informasi lengkap mengenai harga Amazon DynamoDB silahkan baca di link berikut: https://aws.amazon.com/dynamodb/pricing/.
Pada bagian ini, kita akan coba mengenal beberapa DynamoDB API untuk melakukan CRUD data pada sebuah table DynamoDB. AWS memberikan kemudahan kepada kita untuk mengakses DynamoDB API melalui SDK (Software Development Kit) yang tersedia untuk banyak bahasa pemrograman seperti Node.js, Python, PHP, Java, Ruby, Go, C++, dan .NET. Pada buku ini, kita akan menggunakan AWS SDK untuk Node.js.
Contoh menggunakan AWS SDK untuk DynamoDB di Node.js:
const DynamoDB = require('aws-sdk/clients/dynamodb');
const dynamodb = new DynamoDB.DocumentClient({
region: 'ap-southeast-1'
});
Note: Pada contoh kode diatas kita menggunakan DynamoDB.DocumentClient yang dapat mempermudah kita dalam penulisan nilai attributes (AttributeValue) menggunakan tipe data native JavaScript.
PutItem dapat digunakan untuk menambahkan item baru ke dalam sebuah table. Namun, jika nilai primary key sudah ada dalam table maka operasi PutItem akan menimpanya.
Untuk referensi API PutItem bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html
Contoh Node.js:
// contoh menambahkan data ke table
const params = {
TableName: "Posts",
Item:{
Title: "Jago Membuat Aplikasi Serverless", // sort key
Username: "jagoreact", // partition key
Content:"Disini diisi konten yang bagus",
CreatedAt: Date.now()
}
}
await dynamodb.put(params).promise()
GetItem dapat digunakan untuk mengambil satu item di dalam table menggunakan primary key.
Untuk referensi API GetItem bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html
Contoh Node.js:
// contoh mengakses satu item dari table
const params = {
TableName: "Posts",
Key: {
Title: "Jago Membuat Aplikasi Serverless", // sort key
Username: "jagoreact", // partition key
}
}
const result = await dynamodb.get(params).promise()
Query dapat digunakan menampilkan satu atau lebih item dari sebuah table atau secondary index berdasarkan nilai partition key atau kombinasi nilai partition key dan sort key. Terdapat limitasi ukuran 1 MB data yang dapat ditampilkan dalam satu operasi query, jika masih terdapat data yang belum ditampilkan, kita dapat melakukan paginasi data menggunakan nilai primary key terakhir (LastEvaluatedKey) yang ada pada hasil operasi query tersebut. Nilai dari LastEvaluatedKey akan menjadi nilai dari parameter ExclusiveStartKey pada operasi query berikutnya.
Untuk referensi API Query bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html
Contoh Node.js:
// contoh melakukan query
const params = {
TableName: "Posts",
ExpressionAttributeValues: {
":Username": "jagoreact"
},
KeyConditionExpression: "Username = :Username"
}
const results = await dynamodb.query(params).promise()
Catatan: KeyConditionExpression
yang dapat kita berikan saat melakukan Query hanya terbatas dengan format sebagai berikut:
Wajib: Memberikan partition key equality menggunakan = seperti ini :
NamaPartitionKey = :nilaipartitionkey
Tidak wajib: Jika ingin menambahkan kondisi untuk sort key maka bisa menggunakan AND
sebagai contoh:
NamaPatitionKey = :nilaiparitionkey AND NamaSortKey = :nilaisortkey
Selain menggunakan = untuk kondisi sort key, kita juga bisa menggunakan beberapa kondisi lain yang didukung diantaranya:
NamaSortKey = :nilaisortkey
- true jika nila sort key sama dengan :nilaisortkey.
NamaSortKey < :nilaisortkey
- true jika nilai sort key kurang dari :nilaisortkey.
NamaSortKey <= :nilaisortkey
- true jika nilai sort key kurang dari atau sama dengan :nilaisortkey.
NamaSortKey > :nilaisortkey
- true jika nilai sort key lebih besar dari :nilaisortkey.
NamaSortKey >= :nilaisortkey
- true jika nilai sort key lebih besar dari atau sama dengan :nilaisortkey.
NamaSortKey BETWEEN :nilaisortkey1 AND :nilaisortkey2
- true jika nilai sort key lebih besar atau sama dengan :nilaisotkey1 dan kurang dari atau sama dengan :nilaisortkey2.
begins_with( NamaSortKey, :nilaisortkey )
- true jika nilai sort key diawali dengan :nilaisortkey. (Kita tidak bisa menggunakan fungsi begins_with untuk sort key dengan tipe data Number) Sebagai catatan nama fungsi begins_with adalah case-sensitive.
Scan dapat digunakan untuk menampilkan satu atau lebih item yang ada dalam table atau secondary index. Terdapat limitasi ukuran 1 MB data yang dapat ditampilkan dalam satu operasi scan, jika masih terdapat data yang belum ditampilkan, kita dapat melakukan paginasi data menggunakan nilai primary key terakhir (LastEvaluatedKey) yang ada pada hasil operasi scan tersebut. Nilai dari LastEvaluatedKey akan menjadi nilai dari parameter ExclusiveStartKey pada operasi scan berikutnya.
Untuk referensi API Scan bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
Contoh Node.js:
// contoh melakukan scan
const params = {
TableName: "Posts"
}
const results = await dynamodb.query(params).promise()
Secara umum, proses Scan ini kurang efisien jika dibandingkan dengan Query atau GetItem karena Scan harus membaca keseluruhan table atau index. Jika item dalam table atau index kita semakin banyak maka proses Scan ini akan menjadi lambat. Sebaiknya kita mendesain table di DynamoDB agar bisa menghindari penggunaan operasi Scan.
UpdateItem dapat digunakan untuk memperbarui nilai dari satu atau lebih attributes didalam sebuah item.
Untuk informasi API UpdateItem bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html
Contoh Node.js:
// contoh menggunakan operasi UpdateItem
const params = {
TableName: "Posts",
Key: {
Title: "Jago Membuat Aplikasi Serverless", // sort key
Username: "jagoreact", // partition key
},
ExpressionAttributeValues:{
Content: "Konten baru nih!",
UpdatedAt: Date.now()
},
UpdateExpression:"SET Content = :Content, UpdatedAt = :UpdatedAt",
ReturnValues: 'ALL_NEW'
}
const result = await dynamodb.update(params).promise()
DeleteItem dapat digunakan untuk menghapus sebuah item dari table.
Untuk informasi API DeleteItem bisa dilihat di halaman ini:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html
Contoh Node.js:
//contoh menghapus sebuah item
const params = {
TableName: "Posts",
Key: {
Title: "Jago Membuat Aplikasi Serverless", // sort key
Username: "jagoreact", // partition key
},
ReturnValues: 'ALL_OLD'
}
const result = await dynamodb.delete(params).promise();
Data Modeling di NoSQL seperti Amazon DynamoDB tentu berbeda dengan data modeling pada RDBMS seperti MySQL. Jika pada RDBMS kita dapat langsung memulai dengan membuat normalisasi data dengan mengelompokkan data menjadi entitas yang saling berelasi, kemudian untuk masalah bagaimana pola aplikasi dalam mengakses data (access pattern) dapat dipikirkan nanti. Sedangkan pada DynamoDB adalah kebalikannya, kita harus memulai dengan mengidentifikasi bagaimana aplikasi kita akan mengakses data (access pattern) terlebih dahulu, baru kemudian mendesain skema data. Di DynamoDB kita harus memikirkan bagaimana mendesain skema data yang dapat mengakomodir kebutuhan access pattern yang paling cepat dan murah. Terdapat dua konsep utama dalam data modeling di DynamoDB:
Jangan mulai mendesain skema data sebelum kita benar benar mengetahui bagaimana pola aplikasi dalam mengakses data (access pattern).
Aplikasi yang didesain dengan baik hanya membutuhkan satu table DynamoDB. Hindari membuat banyak table.
Untuk membantu proses data modeling di DynamoDB kita bisa menggunakan aplikasi resmi dari AWS yaitu NoSQL Workbench for Amazon DynamoDB yang dapat didownload di halaman berikut:
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.html
Kita akan belajar lebih lanjut bagaimana contoh membuat data model di DynamoDB saat kita membuat studi kasus aplikasi web lowongan kerja.
Dengan menggunakan AWS Management Console kita dapat mengelola table Amazon DynamoDB yang kita miliki di suatu AWS Region. Kunjungi halaman berikut untuk mengelola table DynamoDB yang ada di region Asia Pacific (Singapore):
https://ap-southeast-1.console.aws.amazon.com/dynamodb/home
Copyright © JagoReact.com 2025.