Tipe database adalah bentuk dasar cara sebuah database menyusun datanya: tabel, dokumen, pasangan key dan value, jaringan titik dan garis, atau deretan angka menurut waktu. Bayangin lima petugas mencatat pesanan yang sama. Petugas pertama mengisi beberapa tabel bergaris yang saling menunjuk nomor. Petugas kedua menyimpan satu map per pesanan, isinya lengkap. Petugas ketiga menaruh tiap pesanan di loker bernomor. Petugas keempat menempel foto di papan dan menarik benang di antaranya. Petugas kelima cuma menulis jam dan angka di buku log. Datanya sama, tapi pertanyaan yang gampang dijawab tiap petugas beda-beda.
🧪 Tebakan cepat: Kedai Senja mau fitur "yang beli Kopi Susu biasanya juga beli...". Petugas mana yang paling cepat menjawabnya? Tebak dulu, jawabannya ada di bagian "Graph: titik dan garis".
Satu pesanan, lima bentuk
Kita pakai pesanan #1 Kedai Senja: Budi membeli 2 Kopi Susu (Rp18.000) dan 1 Roti Bakar (Rp20.000). Ada juga pesanan #2 (Budi, 1 Kopi Susu Aren) dan #3 (Siti, 1 Kopi Susu dan 1 Teh Tarik). Lab di halaman ini menyimpan ketiga pesanan itu dalam empat bentuk pertama, dan kamu bisa menanyakan hal yang sama ke masing-masing.
Relational: tabel yang saling menunjuk
Relational database menyimpan data dalam tabel berbaris dan berkolom, dan tabel-tabelnya terhubung lewat id. Bahasanya SQL. Contohnya PostgreSQL, MySQL dan SQLite. Pesanan #1 tersebar di empat tabel: customers, orders, order_items (satu baris per produk di pesanan, dibahas di pelajaran Kardinalitas) dan products. Untuk membacanya utuh, tabelnya digabung dengan JOIN:
SELECT c.name, p.name AS product, oi.qty, p.price
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN order_items oi ON oi.order_id = o.id
JOIN products p ON p.id = oi.product_id
WHERE o.id = 1
ORDER BY oi.product_id;
| name | product | qty | price |
|---|---|---|---|
| Budi | Kopi Susu | 2 | 18000 |
| Budi | Roti Bakar | 1 | 20000 |
- Kekuatannya: setiap fakta disimpan sekali, relasinya dijaga database, dan ada transaksi ACID: beberapa perubahan (bayar, lalu kurangi stok) berhasil semua atau batal semua. Makanya ini pilihan umum untuk toko online dan bank.
- Bayarannya: bentuk tabel harus ditentukan dulu (schema), dan data yang tersebar perlu di-
JOIN.
Document: satu map berisi semuanya
Document database menyimpan satu dokumen (bentuknya seperti objek JSON) per data, lengkap dengan isinya. Contohnya MongoDB, Firestore dan CouchDB. Di MongoDB, pesanan #1 adalah satu dokumen:
db.orders.findOne({ _id: 1 })
// {
// _id: 1,
// customer: { _id: 1, name: 'Budi' },
// items: [
// { product: 'Kopi Susu', price: 18000, qty: 2 },
// { product: 'Roti Bakar', price: 20000, qty: 1 }
// ]
// }
- Kekuatannya: satu kali baca dapat semuanya, dan tiap dokumen boleh punya bentuk berbeda. Di katalog, kopi punya
ukuranGelassedangkan roti punyarasaSelai, tanpa mengubah tabel apa pun. Jadi document database cocok ketika struktur datanya bervariasi dan gak perlu relasi yang kompleks, misalnya katalog produk dan CMS (isi artikel blog). - Bayarannya: nama Budi tersalin di setiap pesanannya. Pertanyaan yang melintasi banyak dokumen ("yang beli Kopi Susu juga beli apa?") butuh aggregation pipeline yang panjang.
Key-value: loker bernomor
Key-value store menyimpan pasangan key (nama loker) dan value (isinya). Contohnya Redis dan Memcached. Di redis-cli:
127.0.0.1:6379> SET session:7f3a "1"
OK
127.0.0.1:6379> GET session:7f3a
"1"
SETmenyimpan value"1"(id Budi) di keysession:7f3a.GETmengambilnya lagi.- Kekuatannya: sangat cepat, karena datanya di memori dan dicari langsung lewat key. Cocok untuk caching (menyimpan hasil yang mahal dihitung) dan session (siapa pemilik login ini), yang dibaca di setiap request.
- Bayarannya: dia cuma kenal key. "Pesanan mana yang berisi Kopi Susu?" gak bisa ditanyakan: semua key harus dibaca satu per satu, lalu aplikasimu yang memeriksa isinya.
Graph: titik dan garis
Graph database menyimpan node (titik: Budi, pesanan #1, Kopi Susu) dan edge (garis berlabel: Budi PLACED pesanan #1, pesanan #1 CONTAINS Kopi Susu). Contohnya Neo4j, dengan bahasa Cypher:
MATCH (:Product {name: 'Kopi Susu'})<-[:CONTAINS]-(:Order)-[:CONTAINS]->(other:Product)
RETURN DISTINCT other.name
Hasilnya Roti Bakar dan Teh Tarik. Query-nya cuma mengikuti garis: dari node Kopi Susu mundur ke pesanan yang berisinya (#1 dan #3), lalu maju ke produk lain di pesanan itu. Jadi petugas berbenang merah, si graph database, yang paling enak menjawab tebakan tadi. Itu jawaban tebakannya. Relational juga bisa, tapi tabel order_items harus di-JOIN ke dirinya sendiri, dan tiap lompatan tambahan ("teman dari teman dari teman") berarti satu JOIN lagi. Graph database cocok untuk social network (pertemanan) dan rekomendasi.
Time-series: angka berbaris menurut waktu
Time-series database menyimpan nilai yang dicatat berkala, masing-masing dengan waktunya. Contohnya InfluxDB, TimescaleDB (tambahan untuk PostgreSQL) dan Prometheus. Kedai Senja mencatat suhu mesin kopinya tiap menit:
| time | suhu |
|---|---|
| 08:00 | 92,5 |
| 08:01 | 93,1 |
| 08:02 | 91,8 |
Data seperti ini terus bertambah, hampir gak pernah diubah, dan ditanya per rentang waktu ("rata-rata suhu per jam hari ini"). Time-series database dibuat untuk itu, jadi cocok untuk monitoring server, sensor IoT, dan analitik.
Memilih yang mana
| Kebutuhan | Tipe |
|---|---|
| caching, session | key-value |
| social network, rekomendasi | graph |
| monitoring, IoT | time-series |
| CMS, katalog | document |
| sisanya: toko online, bank, data yang saling berelasi | relational |
Aplikasi nyata sering memakai lebih dari satu. Kedai Senja menyimpan pesanan di PostgreSQL (relational) dan session login di Redis (key-value). Kalau ragu, mulai dari relational: dia menjawab hampir semua pertanyaan dengan cukup baik.
⚠️ Jebakan yang sering ketemu
- Memilih document database "supaya gak perlu schema". Bentuk datanya tetap ada, cuma pindah ke kode aplikasi, dan gak ada yang menjaganya.
- Menyimpan data utama cuma di Redis. Redis menyimpan data di memori. Tergantung pengaturannya, perubahan beberapa detik atau menit terakhir bisa hilang saat server mati. Pakai untuk cache dan session, bukan satu-satunya salinan pesanan.
- Mencari isi di key-value store. Dia cuma bisa
GETlewat key. Pencarian berdasarkan isi butuh relational atau document. - Salah tulis jawaban di latihan. Kembalikan teks huruf kecil persis:
"key-value"dan"time-series"pakai tanda minus.
TL;DR: Relational menyimpan tabel yang saling menunjuk id, ditanya dengan SQL dan JOIN, kuat di relasi dan transaksi (toko online, bank). Document menyimpan satu dokumen utuh per data dengan bentuk yang boleh beda-beda (katalog, CMS). Key-value menyimpan pasangan key dan value di memori, super cepat tapi cuma kenal key (caching, session). Graph menyimpan node dan edge, enak untuk mengikuti hubungan berlapis (social network, rekomendasi). Time-series menyimpan angka menurut waktu (monitoring, IoT). Kalau ragu, mulai dari relational.