Idenya
Kalau kamu pernah memakai spreadsheet, kamu sudah memahami sebagian besar database. Database adalah kumpulan data terorganisir yang bisa disimpan, dicari, dan diperbarui sebuah program dengan aman, bahkan saat banyak orang memakainya bersamaan. Database relasional menyimpan data itu di dalam tabel, dan memungkinkan tabel-tabel saling menunjuk. PostgreSQL, database yang diajarkan track ini, adalah salah satu database relasional paling populer di dunia, dan gratis.
Jadi kenapa tidak pakai spreadsheet saja? Tiga alasan yang akan cepat kamu rasakan di tempat kerja:
- Ukuran. Spreadsheet mulai kewalahan di sekitar beberapa ratus ribu baris. Database menangani jutaan tanpa berkedip.
- Aturan. Database bisa menolak data yang buruk, seperti pesanan untuk pelanggan yang tidak ada, atau harga yang kosong.
- Pertanyaan. Kamu mengajukan pertanyaan ke database dalam SQL (Structured Query Language), dan mendapat jawaban persis dalam hitungan detik, tanpa copy-paste atau menyeret formula.
Spreadsheet adalah buku catatan yang kamu tulis dengan tangan. Database adalah perpustakaan yang dikelola dengan baik: setiap buku punya tempat tetap, kartu katalog, dan pustakawan (database engine) yang menemukan persis apa yang kamu minta dan mencegah siapa pun menaruh buku di rak yang salah.
Tabel, baris, dan kolom
Sebuah tabel menampung satu jenis hal. Ini baris-baris pertama tabel customers di toko latihan kita, Toko Kita, toko online yang menjual kopi, peralatan dapur, dan aksesori meja:
| customer_id | name | city | signup_date | segment | |
|---|---|---|---|---|---|
| 1 | Ayu Lestari | [email protected] | Jakarta | 2023-01-14 | Consumer |
| 2 | Budi Santoso | [email protected] | Bandung | 2023-02-03 | Business |
| 3 | Citra Dewi | [email protected] | Surabaya | 2023-03-22 | Consumer |
| 4 | Dimas Pratama | NULL | Jakarta | 2023-04-09 | Consumer |
- Baris (row, disebut juga record) adalah satu hal: satu pelanggan.
- Kolom (column, disebut juga field) adalah satu fakta tentang setiap hal: kota semua orang, email semua orang.
- Setiap kolom punya tipe data, jadi setiap nilai di dalamnya berjenis sama:
nameadalah teks,customer_idadalah bilangan bulat,signup_dateadalah tanggal. Database menolak nilai bertipe salah, yang menjaga datanya tetap bersih. NULLberarti "tidak ada nilai". Dimas tidak pernah memberikan alamat email. NULL bukan nol dan bukan string kosong, ia berarti "tidak diketahui". Kamu akan belajar menanganinya dengan benar di modul berikutnya.
Key: cara tabel saling menunjuk
Lihat kolom pertama, customer_id. Setiap pelanggan punya nomor yang berbeda, dan nomor itu tidak pernah berubah. Itulah primary key: kolom yang nilainya mengidentifikasi setiap baris secara unik. Nama bisa berulang (dua pelanggan bernama Ayu sangat mungkin), tapi primary key tidak pernah.
Sekarang lihat tabel orders:
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1 | 11 | 2024-01-03 | completed | app |
| 2 | 3 | 2024-01-09 | completed | web |
| 3 | 5 | 2024-01-17 | completed | app |
| 4 | 3 | 2024-01-18 | completed | app |
Pesanan tidak mengulang nama, email, dan kota pelanggan. Ia hanya menyimpan customer_id. Pesanan 2 dan pesanan 4 sama-sama milik pelanggan 3, Citra Dewi. Kolom yang berisi primary key tabel lain disebut foreign key, dan itulah "relasional" dalam database relasional.
Simpan setiap fakta sekali saja, di tabel tempatnya, dan pakai key untuk menghubungkan tabel. Kalau Citra mengganti emailnya, kamu memperbarui satu baris di customers, dan setiap pesanan tetap menunjuk ke orang yang benar.
Ini seluruh database Toko Kita. Kamu akan memakainya sepanjang track ini:
| Tabel | Satu barisnya adalah… | Kolom key |
|---|---|---|
customers | seorang pelanggan | customer_id (primary key) |
products | produk yang kita jual | product_id (primary key) |
orders | satu checkout oleh seorang pelanggan | order_id (primary key), customer_id (foreign key) |
order_items | satu baris produk di dalam sebuah pesanan | order_id + product_id bersama-sama, keduanya foreign key |
employees | seorang staf | employee_id (primary key), manager_id (menunjuk ke karyawan lain) |
Kenapa ada tabel order_items sama sekali? Karena satu pesanan bisa berisi beberapa produk, dan satu produk muncul di banyak pesanan. Alih-alih menjejalkan "Mug, Coffee, Pen" ke dalam satu sel, setiap produk dalam sebuah pesanan mendapat barisnya sendiri di order_items. Desain itulah yang nanti memungkinkanmu mengajukan pertanyaan seperti "berapa banyak mug yang kita jual di bulan Maret?" dalam satu baris.
Query pertamamu
SQL terbaca hampir seperti bahasa Inggris. Untuk melihat setiap kolom dari setiap baris di sebuah tabel, kamu menulis:
SELECT * FROM products;
SELECTmengatakan apa yang ingin kamu lihat.*berarti "setiap kolom".FROM productsmengatakan tabel mana yang dilihat.- Titik koma
;mengakhiri pernyataan. Dengan satu pernyataan sifatnya opsional, tapi ini kebiasaan yang baik.
Tekan Coba di atas untuk menjalankannya. Kamu akan melihat 15 produk yang dijual toko itu.
product_id | name | category | price | cost | stock
------------+----------------------+-------------+--------+--------+-------
1 | French Press 600ml | Kitchen | 185000 | 110000 | 24
2 | Pour-over Kettle | Kitchen | 320000 | 210000 | 12
3 | Arabica Gayo 250g | Coffee | 95000 | 52000 | 80
...
(15 rows)
Keyword SQL seperti SELECT dan FROM tidak membedakan huruf besar-kecil, jadi select * from products juga bisa. Konvensinya adalah menulis keyword dengan huruf kapital dan nama tabel atau kolom dengan huruf kecil, supaya kamu bisa melihat struktur sebuah query sekilas.
Setiap soal SQL di situs ini punya tab Tables di bawah editor. Tab itu menampilkan tabel-tabel yang sedang kamu kerjakan, kolom-kolomnya, dan baris-baris pertamanya. Cek sebelum menulis query, sama seperti kamu melirik spreadsheet sebelum menulis formula.
Mengapa ini penting untuk kode bersih
Kebiasaan yang baru saja kamu pelajari, simpan setiap fakta sekali dan hubungkan dengan key, disebut normalisasi, dan itulah fondasi desain data yang baik. Database yang berantakan mengulang data di mana-mana, dan data yang berulang pada akhirnya saling bertentangan. Database yang bersih itu membosankan dan bisa diprediksi, dan itulah persis yang kamu inginkan saat sebuah laporan dikirim ke manajermu.
Rangkuman
- Database relasional menyimpan data dalam tabel yang terhubung lewat key.
- Baris adalah satu hal, kolom adalah satu fakta tentang setiap hal, dan setiap kolom punya tipe data.
- Primary key mengidentifikasi sebuah baris secara unik. Foreign key menunjuk ke sebuah baris di tabel lain.
NULLberarti "tidak ada nilai", bukan nol atau teks kosong.SELECT * FROM table;menampilkan setiap kolom dan baris sebuah tabel.