Lesson 0008 · System Design · Modul Data · ±20 menit

SQL vs NoSQL: pilih dari pola akses, bukan dari tren

Lima keluarga database (relasional, key-value, document, wide-column, graph), ACID vs BASE, dan kalimat yang aman diucapkan di interview

Sebelumnya, lesson 0007 menutup modul Skalabilitas: server aplikasi sudah stateless dan bisa diperbanyak di belakang load balancer. Sekarang bottleneck pindah ke tempat state disimpan, yaitu database. Modul Data mulai dari pertanyaan yang hampir selalu muncul di langkah 3 (API + data model): "database apa yang Anda pakai, dan kenapa?"

Target lesson ini: Anda bisa menjawab "Kenapa Anda memilih SQL (atau NoSQL) untuk sistem ini?" tanpa catatan, dalam 60 detik: pola akses data, kebutuhan transaksi (ACID vs BASE), keluarga NoSQL yang cocok kalau memang perlu, dan kenapa database relasional adalah default yang aman.

1. Lima keluarga database

"NoSQL" bukan satu jenis database, tapi payung untuk beberapa model data. Yang membedakan adalah bentuk data dan cara Anda mengaksesnya.

KeluargaModel dataAkses yang cepatContoh
Relasional (SQL)tabel, baris, kolom, foreign keyquery bebas, JOIN, transaksi multi-tabelPostgreSQL, MySQL
Key-valuekey → value (blob)get/put satu keyDynamo, Redis
Documentdokumen JSON-like bersarangambil/simpan satu dokumen utuhMongoDB
Wide-columnrow key → banyak kolom, terurut per row keyscan rentang row key, write volume besarBigtable, HBase, Cassandra
Graphnode, relationship, propertytraversal relasi berlapis (teman dari teman)Neo4j

Cara memilihnya: mulai dari pertanyaan "query apa yang paling sering dan paling penting?", bukan dari nama produk.

Pola akses? Relasional (default) Key-value Document Wide-column Graph JOIN, transaksi get/put per key objek utuh scan rentang key traversal relasi
Pilih dari query yang dominan. Kalau belum jelas atau campuran, relasional adalah default.

Latihan 1 — Keluarga database

Jawab tanpa scroll ke atas. Soal yang sama akan muncul lagi, diacak, di review 0019.

Kuis di lesson ini adalah feedback cepat, bukan bukti penguasaan; yang dicatat hanya hasil review 0019.

2. ACID vs BASE

ACID (Atomicity, Consistency, Isolation, Durability) adalah jaminan transaksi di database relasional. Dokumentasi PostgreSQL merangkum intinya: transaksi "bundles multiple steps into a single, all-or-nothing operation"; langkah di tengah tidak terlihat oleh transaksi lain, dan kalau gagal, "none of the steps affect the database at all." [5] Seberapa ketat isolasinya bisa diatur: di PostgreSQL, "Read Committed is the default isolation level", dan Serializable "provides the strictest transaction isolation". [6]

BASE (Basically Available, Soft state, Eventually consistent) adalah singkatan untuk sikap sebaliknya: utamakan ketersediaan, terima bahwa replika boleh sempat berbeda, dan pastikan semuanya akhirnya sama. Dynamo adalah contoh aslinya: "Experience at Amazon has shown that data stores that provide ACID guarantees tend to have poor availability", sehingga Dynamo "does not provide any isolation guarantees and permits only single key updates", dan dirancang sebagai "eventually consistent data store; that is all updates reach all replicas eventually." [1]

transfer saldo: debit A + kredit B→ butuh all-or-nothing→ ACID (relasional)
"like" di postingan, keranjang belanja→ boleh telat sebentar, harus selalu bisa ditulis→ BASE bisa diterima

Garis pembagi di interview: uang, stok, dan apa pun yang tidak boleh dobel atau hilang butuh transaksi ACID. Counter, feed, dan data yang boleh terlambat beberapa detik bisa hidup dengan eventual consistency. Detail model konsistensinya di lesson 0011.

Latihan 2 — ACID vs BASE

Jawab tanpa scroll ke atas.

3. Kapan tidak perlu

Komponen yang dibahas di sini adalah database NoSQL tambahan (atau mengganti database relasional dengan NoSQL).

Kalimat untuk interview: "Untuk skala ini saya mulai dengan PostgreSQL karena butuh transaksi untuk order. Kalau write ke tabel event melewati kapasitas satu node setelah tuning, tabel itu kandidat pindah ke wide-column store."

Latihan lisan — Ucapkan dengan suara keras

Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai.

"Untuk sistem e-commerce kecil (order, pembayaran, katalog produk), Anda memilih SQL atau NoSQL? Jelaskan alasannya dan kapan Anda akan berubah pikiran." (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya

"Saya mulai dari pola akses. Order dan pembayaran butuh transaksi all-or-nothing: kurangi stok, buat order, catat pembayaran harus berhasil semua atau tidak sama sekali. Itu ACID, jadi database relasional seperti PostgreSQL. Katalog punya atribut berbeda per kategori, tapi itu cukup dengan kolom jsonb yang bisa di-index, tanpa database kedua. NoSQL baru masuk kalau ada pola akses khusus yang terukur: misalnya event clickstream yang write-nya melewati kapasitas satu node setelah tuning, cocok ke wide-column; atau session dan cart yang hanya diakses per key, cocok ke key-value. Trade-off-nya: NoSQL melepas JOIN dan transaksi multi-key, dan banyak yang eventual consistent, jadi integritas pindah ke aplikasi. Untuk skala kecil satu PostgreSQL sudah cukup."

Checklist: apakah Anda menyebut…

  • memilih dari pola akses (query dominan), bukan dari nama produk?
  • order/pembayaran butuh transaksi ACID (all-or-nothing)?
  • relasional sebagai default, atribut fleksibel cukup dengan jsonb?
  • minimal satu keluarga NoSQL yang tepat beserta pola aksesnya (key-value, document, wide-column, graph)?
  • biaya NoSQL: tanpa JOIN/transaksi multi-key, eventual consistency, operasional database kedua?
  • membenarkan perubahan dengan angka atau metrik (mis. write melewati kapasitas satu node setelah tuning)?

Lulus jika minimal 4 dari 6.

Bacaan lanjutan (opsional, tidak dihitung dalam durasi) DeCandia et al. 2007, "Dynamo: Amazon's Highly Available Key-value Store", bagian 1–2 (±15 menit): alasan Amazon melepas ACID untuk shopping cart.

Berikutnya, lesson 0009: sebelum mengganti database, perbaiki yang ada dulu. Index B-tree, lalu leader-follower replication dan read replica.

Istilah: GLOSSARY.md (bagian "Data") · Indeks: semua lesson System Design

Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "kapan Cassandra lebih masuk akal daripada PostgreSQL untuk data time series?", "apa beda isolation level Read Committed dan Serializable dengan contoh?", atau "bagaimana mendesain kolom jsonb supaya query-nya tetap memakai index?"

Sumber: [1] DeCandia et al. 2007, Dynamo: Amazon's Highly Available Key-value Store (SOSP) · [2] MongoDB docs: Documents · [3] Chang et al. 2006, Bigtable: A Distributed Storage System for Structured Data (OSDI) · [4] Neo4j docs: What is a graph database · [5] PostgreSQL docs: Transactions (tutorial) · [6] PostgreSQL docs: Transaction Isolation · [7] PostgreSQL docs: JSON Types