Menjelajahi dunia di luar tabel kaku: kapan memakai NoSQL untuk skala besar dan skema dinamis, empat model data document, key-value, wide-column, dan in-memory cache, serta perbandingan DynamoDB, ElastiCache, Firestore, Bigtable, Memorystore, Cosmos DB, dan Azure Cache for Redis lengkap dengan contoh item JSON dan perintah CLI.

Di episode 9 kita membahas database relasional: RDBMS managed, high availability multi-AZ, hingga distributed SQL seperti Aurora dan Spanner. Relasional unggul karena skema ketat, transaksi ACID, dan bahasa query yang universal. Namun makin banyak aplikasi modern yang datanya tidak nyaman dipaksa masuk ke tabel dengan kolom tetap — data yang bentuknya berubah-ubah, dibaca dengan latensi sangat rendah, atau harus melayani jutaan request per detik.
Episode 10 ini membahas kebalikannya: NoSQL dan in-memory databases. Kalian akan belajar kapan relasional mulai tidak cukup, empat model data NoSQL, peran cache in-memory, layanan managed di AWS, GCP, dan Azure, serta praktik menulis item JSON dan menyimpannya ke DynamoDB lewat CLI.
Tidak ada database yang buruk — yang ada adalah database yang salah tempat. Relasional hebat untuk data yang terstruktur, berelasi, dan butuh konsistensi ketat seperti transaksi keuangan. Ia kesulitan pada tiga kondisi:
| Aspek | Relasional | NoSQL |
|---|---|---|
| Skema | Kaku, didefinisikan sebelum data masuk | Fleksibel, setiap item boleh berbeda |
| Konsistensi | ACID, konsistensi kuat | Umumnya eventual consistency |
| Skala | Vertikal (instance lebih besar) atau replikasi | Horizontal (distribusi ke banyak node) |
| Query | SQL, join antar tabel | Berbasis key atau pola akses |
Tip
Analoginya seperti perpustakaan dengan dua sistem. Relasional adalah rak buku dengan kolom seragam — setiap buku harus mengisi kolom yang sama. NoSQL adalah gudang amplop: setiap amplop bisa berisi apa pun dengan format sendiri, dan petugas tahu persis di rak mana ia disimpan berdasarkan labelnya. Untuk koleksi yang rapi, rak buku lebih baik; untuk katalog yang beragam dan terus berubah, gudang amplop jauh lebih praktis.
Kata "NoSQL" menyatukan empat keluarga yang sangat berbeda. Menyamakan semuanya adalah kesalahan pemula — pilihan kalian harus bergantung pada pola akses aplikasi.
Data disimpan sebagai dokumen berformat JSON atau BSON, seperti satu entri kamus yang bisa bersarang. Satu dokumen bisa berisi nama, alamat, dan daftar pesanan sekaligus — tidak perlu join. Cocok untuk profil pengguna, katalog produk, dan konten CMS. Perwakilannya: MongoDB, Firestore, Cosmos DB.
Model paling sederhana: satu key unik yang memetakan ke satu value, seperti kamus raksasa. Pembacaan selalu melalui key — sangat cepat dan sangat terukur, tetapi tanpa kemampuan query kompleks. Cocok untuk sesi pengguna, fitur flag, dan data referensi kecil. Perwakilannya: DynamoDB dalam mode sederhana, Redis, Memcached.
Data disimpan per baris, tetapi setiap baris boleh memiliki kolom berbeda-beda — gabungan antara tabel dan dokumen. Cocok untuk analitik dan data time-series yang besar, tempat satu baris menyimpan jutaan nilai dengan timestamp. Perwakilannya: Cassandra, Bigtable.
Data disimpan sepenuhnya di RAM, bukan disk. Hasilnya: pembacaan dalam mikrodetik hingga milidetik. Keluarga ini berbeda secara fundamental — tujuannya bukan menyimpan data utama, melainkan mempercepat data yang sering dibaca. Perwakilannya: Redis, Memcached.
Note
Aturan jempol yang berguna: document untuk data yang bentuknya berubah-ubah, key-value untuk pencarian super cepat berbasis key, wide-column untuk analitik skala besar, dan in-memory untuk akselerasi. Jangan memilih produk dulu — pilih pola data dan pola akses kalian, baru setelah itu nama layanan yang cocok.
Cache in-memory ada karena satu alasan sederhana: banyak query database berulang-ulang menjawab pertanyaan yang sama. Setiap kali aplikasi membaca profil yang sama seratus kali per detik, database mengulang pekerjaan yang hasilnya identik.
Pola klasiknya disebut cache-aside: aplikasi mengecek cache dulu; jika ada, langsung dipakai (cache hit); jika tidak ada, ambil dari database, simpan ke cache, lalu kembalikan (cache miss). Setiap item diberi TTL (time to live) — masa kedaluwarsa — sehingga data tidak basi selamanya.
| Aspek | Tanpa cache | Dengan cache |
|---|---|---|
| Latensi baca | 10-50 ms (database) | Di bawah 1 ms (RAM) |
| Beban database | Ribuan query per detik | Sedikit, hanya saat cache miss |
| Biaya | Mahal (instance database besar) | Murah (cluster kecil di depan DB) |
Bayangkan warung kopi yang sering ditanya "menu apa saja hari ini?" — melayani pertanyaan itu dari papan menu (cache) jauh lebih cepat daripada membuka kulkas setiap kali ditanya (database). Itulah esensi caching.
Ketiga cloud besar menyediakan semua keluarga di atas sebagai layanan terkelola — kalian tidak menginstall apa pun, hanya membuat resource dan memanggil API-nya:
Important
Ciri khas produk managed adalah provisioned capacity atau on-demand: kalian menentukan berapa kapasitas baca-tulis yang disediakan, biasanya dihitung dalam unit seperti RCU/WCU di DynamoDB. Mengatur angka ini terlalu kecil akan memicu throttling — request ditolak dengan status 429 saat kapasitas habis. Untuk mulai belajar, pakai mode on-demand agar bayar sesuai pemakaian nyata, lalu pelajari provisioned capacity setelah memahami pola traffic kalian.
DynamoDB menyimpan data sebagai item, dan setiap item adalah koleksi atribut. Kekuatannya terletak pada skema fleksibel: item berikut memiliki atribut berbeda-beda dalam tabel yang sama — sesuatu yang mustahil di tabel relasional.
{
"pk": { "S": "user#42" },
"sk": { "S": "profile" },
"name": { "S": "Arman" },
"age": { "N": "29" },
"active": { "BOOL": true },
"skills": { "SS": ["cloud", "devops"] },
"address": {
"M": {
"city": { "S": "Jakarta" },
"zip": { "S": "12345" }
}
}
}Setiap atribut ditulis dengan tipe datanya: S untuk string, N untuk number, BOOL untuk boolean, SS untuk set of strings, dan M untuk map bersarang. Item lain dalam tabel yang sama bisa saja hanya berisi dua atribut — tidak ada schema constraint di level tabel.
Menyimpan item ini ke tabel users dilakukan dengan aws dynamodb put-item:
aws dynamodb put-item \
--table-name users \
--item '{
"pk": { "S": "user#42" },
"sk": { "S": "profile" },
"name": { "S": "Arman" },
"age": { "N": "29" },
"skills": { "SS": ["cloud", "devops"] }
}'Perhatikan pola yang dianjurkan di DynamoDB: pasangan pk dan sk adalah partition key dan sort key — inilah "alamat" item di dalam tabel. Desain key yang baik meniru cara aplikasi mengakses data: jika aplikasi selalu membaca profil berdasarkan ID pengguna, maka pk berisi ID itu.
Caution
Aturan penting di DynamoDB: kalian tidak bisa melakukan scan besar untuk mencari data dengan bebas — harus selalu query berdasarkan key. Desain tabel di DynamoDB dimulai dari pertanyaan "query apa saja yang akan dikirim aplikasi?", bukan dari struktur datanya. Inilah mengapa desain key dan single-table design menjadi keterampilan inti seorang engineer NoSQL.
| Kebutuhan | AWS | GCP | Azure |
|---|---|---|---|
| Managed NoSQL | DynamoDB | Firestore, Bigtable | Cosmos DB |
| In-memory cache | ElastiCache | Memorystore | Azure Cache for Redis |
Konsep di balik semua produk ini identik: skema fleksibel untuk NoSQL, dan penyimpanan di RAM untuk cache. Berpindah antar provider berarti belajar API dan penamaan baru, bukan belajar ulang konsep. Nilai paling berharga di pasar kerja adalah kemampuan menilai kapan memakai document, key-value, wide-column, atau cache — bukan menghafal tombol di satu konsol.
Pada episode 10 ini kalian telah memahami kapan NoSQL diperlukan — skala besar, skema dinamis, dan pola baca ekstrem — berikut empat model datanya: document, key-value, wide-column, dan in-memory. Kalian juga mengenal layanan managed di tiga cloud — DynamoDB, Firestore, Bigtable, Cosmos DB, ElastiCache, Memorystore, dan Azure Cache for Redis — serta praktik menulis item JSON dan menyimpannya lewat aws dynamodb put-item.
Kunci yang harus dibawa pulang:
Semua yang kita bahas sejauh ini masih mengharuskan kalian berpikir tentang server — berapa kapasitas, berapa instance, berapa node. Episode 11 akan membalik logika itu sepenuhnya: Serverless & Function as a Service (FaaS) — aplikasi yang berjalan hanya saat ada event, skala dari nol ke jutaan, dan tagihan dihitung per eksekusi dalam milidetik.