Pertemuan ke-3: Struktur Data dan Optimasi Tabel di PostgreSQL
Pada pertemuan ini, kita akan membahas bagaimana cara merancang tabel yang optimal, memahami tipe data yang tersedia di PostgreSQL, dan menggunakan indeks untuk meningkatkan performa query.
1️⃣ Memilih Tipe Data yang Tepat
Memilih tipe data yang sesuai dapat meningkatkan efisiensi penyimpanan dan performa database.
➤ Tipe Data Umum di PostgreSQL
| Tipe Data | Keterangan | Contoh |
|---|---|---|
INTEGER | Bilangan bulat | 100, 2500 |
NUMERIC(precision, scale) | Angka dengan desimal presisi tinggi | 9999.99 |
VARCHAR(n) | Teks dengan panjang maksimum n | ‘John Doe’ |
TEXT | Teks tanpa batasan panjang | ‘Deskripsi panjang…’ |
BOOLEAN | Nilai TRUE atau FALSE | TRUE |
DATE | Format tanggal | ‘2025-01-30’ |
TIMESTAMP | Format tanggal & waktu | ‘2025-01-30 14:30:00’ |
JSON/JSONB | Menyimpan data dalam format JSON | ‘{“nama”: “John”}’ |
📌 Contoh Implementasi dalam Tabel
CREATE TABLE pelanggan (
id SERIAL PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE,
saldo NUMERIC(12,2) DEFAULT 0,
status_aktif BOOLEAN DEFAULT TRUE,
tanggal_daftar TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2️⃣ Normalisasi Database
Normalisasi bertujuan untuk menghindari redundansi data dan inkonsistensi.
📌 Contoh Kesalahan:
CREATE TABLE transaksi (
id SERIAL PRIMARY KEY,
pelanggan_nama VARCHAR(100),
pelanggan_email VARCHAR(150),
jumlah NUMERIC(12,2)
);
🚫 Masalah: Jika pelanggan yang sama melakukan transaksi berulang kali, kita menyimpan nama & email berulang kali.
✅ Solusi: Pisahkan Data ke Tabel yang Berbeda
CREATE TABLE pelanggan (
id SERIAL PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE
);
CREATE TABLE transaksi (
id SERIAL PRIMARY KEY,
pelanggan_id INT REFERENCES pelanggan(id),
jumlah NUMERIC(12,2),
tanggal TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Keuntungan: ✔ Data pelanggan hanya disimpan sekali.
✔ Data lebih terstruktur dan mudah diubah.
3️⃣ Indeks untuk Optimasi Query
Indeks mempercepat pencarian data di tabel besar.
📌 Jenis Indeks di PostgreSQL:
🔹 B-Tree Index (Default, digunakan untuk pencarian umum)
🔹 GIN Index (Digunakan untuk JSON & full-text search)
🔹 Hash Index (Cepat untuk pencarian dengan = saja)
➤ Membuat Indeks
Misalnya, kita sering mencari pelanggan berdasarkan email:
CREATE INDEX idx_pelanggan_email ON pelanggan(email);
Untuk mempercepat pencarian transaksi berdasarkan pelanggan:
CREATE INDEX idx_transaksi_pelanggan_id ON transaksi(pelanggan_id);
➤ Melihat Indeks yang Ada
SELECT * FROM pg_indexes WHERE tablename = 'transaksi';
➤ Menghapus Indeks
DROP INDEX idx_transaksi_pelanggan_id;
4️⃣ Tugas Praktik
1️⃣ Buat tabel pelanggan dan transaksi dengan struktur yang telah dijelaskan.
2️⃣ Tambahkan indeks pada kolom email di tabel pelanggan.
3️⃣ Coba insert beberapa data ke dalam tabel.
4️⃣ Jalankan query EXPLAIN ANALYZE untuk melihat performa query sebelum & sesudah indeks.
EXPLAIN ANALYZE SELECT * FROM pelanggan WHERE email = 'test@email.com';
🎯 Kesimpulan
- Pemilihan tipe data yang tepat dapat menghemat penyimpanan dan meningkatkan kecepatan query.
- Normalisasi database menghindari duplikasi data dan meningkatkan integritas.
- Indeks sangat penting untuk meningkatkan performa pencarian data.
