Kembali ke Artikel

Belajar Database dari Nol #2: Konsep Database Relasional

Solusi IT

Database relasional adalah database yang menyimpan data dalam bentuk tabel-tabel yang saling berhubungan. Setiap tabel punya baris dan kolom, mirip lembar Excel, tapi dengan aturan yang jauh lebih ketat: tipe data dikunci, setiap baris wajib punya identitas unik, dan hubungan antar tabel dijaga oleh sistem, bukan oleh ingatan manusia. Model inilah yang dipakai MySQL, PostgreSQL, SQL Server, dan hampir semua aplikasi yang menyimpan data transaksi.

Artikel ini bagian kedua dari seri Belajar Database dari Nol. Di bagian ini kita belum banyak mengetik perintah. Fokusnya memahami cara berpikir database relasional dulu, supaya waktu mulai praktik membuat tabel di bagian berikutnya kamu tahu alasan di balik setiap keputusan, bukan sekadar meniru kode.

Prasyaratnya cuma satu: MySQL 8.4 sudah terpasang dan kamu bisa masuk ke prompt mysql>. Kalau belum, kerjakan dulu Belajar Database dari Nol #1: Kenalan & Install MySQL 8.4, lalu kembali ke sini.

Tabel, Baris, Kolom, dan Skema: Dipetakan dari Data Toko Nyata

Bayangkan kamu punya toko alat tulis dan mencatat pelanggan di buku. Setiap pelanggan dicatat namanya, nomor HP, dan kotanya. Dalam database relasional, catatan itu jadi sebuah tabel seperti ini:

id nama no_hp kota
1 Budi Santoso 081234567890 Semarang
2 Siti Aminah 085612345678 Banjarnegara
3 Andi Wijaya 089876543210 Purwokerto

Dari tabel itu kita bisa memetakan empat istilah dasar:

  • Tabel: satu kumpulan data sejenis. Di sini tabel pelanggan. Nanti akan ada tabel lain seperti produk dan pesanan.
  • Baris (record atau row): satu entitas utuh. Baris pertama adalah data lengkap milik Budi Santoso.
  • Kolom (field atau column): satu jenis informasi yang sama untuk semua baris. Kolom kota berisi kota untuk setiap pelanggan.
  • Skema: rancangan strukturnya. Skema menjawab pertanyaan tabel apa saja yang ada, kolomnya apa, tipe datanya apa, dan bagaimana tabel-tabel itu berhubungan. Di MySQL, istilah schema dan database sering dipakai bergantian untuk hal yang sama.

Perbedaan penting dengan buku catatan biasa: di database relasional, struktur ditetapkan lebih dulu. Kamu mendeklarasikan bahwa no_hp itu teks maksimal 15 karakter, baru kemudian mengisi datanya. Data yang tidak cocok dengan struktur akan ditolak. Kaku, tapi justru kekakuan ini yang membuat data tetap rapi setelah bertahun-tahun dipakai.

Primary Key dan UNIQUE: Kenapa Setiap Baris Butuh Identitas

Perhatikan kolom id di tabel tadi. Kenapa perlu, padahal sudah ada nama? Karena nama bisa kembar. Kalau ada dua Budi Santoso dan kamu ingin menghapus salah satunya, database harus tahu persis Budi yang mana. Di sinilah primary key berperan: satu kolom (atau kombinasi kolom) yang nilainya dijamin unik dan tidak boleh kosong untuk setiap baris.

Aturan primary key sederhana:

  • Nilainya wajib unik. Tidak boleh ada dua baris dengan id sama.
  • Tidak boleh NULL alias kosong.
  • Satu tabel hanya boleh punya satu primary key.
  • Idealnya nilainya tidak pernah berubah. Karena itu praktik umum memakai angka yang naik otomatis (AUTO_INCREMENT), bukan data asli seperti nomor HP yang bisa ganti.

Lalu bagaimana dengan kolom yang memang tidak boleh kembar tapi bukan identitas utama, misalnya no_hp atau email? Untuk itu ada constraint UNIQUE. Bedanya dengan primary key: UNIQUE boleh lebih dari satu dalam satu tabel dan nilainya boleh NULL.

Sebagai gambaran, beginilah bentuk deklarasinya dalam SQL. Detail praktiknya kita bahas di bagian 3, jadi sekarang cukup dibaca dulu:

CREATE TABLE pelanggan (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    no_hp VARCHAR(15) UNIQUE,
    kota VARCHAR(50)
);

Kalau kamu mencoba memasukkan dua pelanggan dengan no_hp sama, MySQL akan menolak dengan pesan seperti ini:

ERROR 1062 (23000): Duplicate entry '081234567890' for key 'pelanggan.no_hp'

Penolakan ini bukan gangguan. Ini database sedang melindungi kamu dari data ganda yang di spreadsheet biasanya baru ketahuan setelah jadi masalah.

Relasi Antar Tabel: Gambaran Besar Pelanggan dan Pesanan

Sekarang bagian yang membuat kata “relasional” bermakna. Toko tadi mulai mencatat pesanan. Cara naif: tambahkan kolom pesanan di tabel pelanggan. Masalahnya, satu pelanggan bisa memesan berkali-kali. Mau bikin kolom pesanan_1, pesanan_2, pesanan_3? Sampai berapa? Struktur seperti ini cepat berantakan.

Solusi relasional: pisahkan jadi dua tabel, lalu hubungkan lewat primary key. Tabel pesanan cukup menyimpan id_pelanggan, yaitu rujukan ke baris di tabel pelanggan:

id id_pelanggan tanggal total
1 2 2026-07-20 45000
2 1 2026-07-21 120000
3 2 2026-07-25 78000

Baca baris pertama: pesanan nomor 1 dibuat oleh pelanggan dengan id 2, yaitu Siti Aminah. Nama, nomor HP, dan kota Siti tidak perlu ditulis ulang. Cukup disimpan sekali di tabel pelanggan, dan semua pesanannya menunjuk ke sana. Kalau Siti ganti nomor HP, kamu update satu baris, dan semua data pesanan otomatis tetap konsisten.

Kolom id_pelanggan ini nantinya akan kita resmikan sebagai foreign key, yaitu aturan yang membuat MySQL menolak pesanan dari id pelanggan yang tidak ada. Cara menggabungkan dua tabel ini dalam satu hasil query namanya JOIN. Keduanya dapat porsi bahasan sendiri di bagian 11 sampai 13 seri ini. Untuk sekarang, yang penting kamu pegang gambaran besarnya: data dipecah ke tabel-tabel kecil yang fokus, lalu dihubungkan lewat kunci.

Database Relasional vs Spreadsheet: Kapan Excel Tidak Cukup

Pertanyaan yang wajar: kalau bentuknya sama-sama tabel, kenapa tidak pakai Excel atau Google Sheets saja? Untuk catatan pribadi atau data kecil yang dipegang satu orang, spreadsheet memang cukup. Tapi ada tiga batas yang membuat aplikasi serius selalu pindah ke RDBMS (Relational Database Management System) seperti MySQL.

Integritas data

Spreadsheet menerima apa saja. Kolom tanggal bisa terisi “besok”, nomor HP bisa terisi nama, dan baris pelanggan bisa terhapus padahal masih punya pesanan. RDBMS menolak semua itu lewat tipe data, constraint NOT NULL, UNIQUE, dan foreign key. Kesalahan dicegah saat data masuk, bukan ditemukan saat laporan sudah kacau.

Banyak pengguna sekaligus

Dua kasir yang mengedit satu file Excel bersamaan itu resep bencana. MySQL dirancang untuk ratusan koneksi bersamaan, lengkap dengan mekanisme penguncian dan transaksi supaya dua perubahan yang bertabrakan tidak saling menimpa. Konsep transaksinya kita bahas di bagian 19.

Skala dan kecepatan pencarian

Spreadsheet mulai berat di puluhan ribu baris. Tabel MySQL yang diberi index tetap bisa menjawab pencarian dalam hitungan milidetik meski berisi jutaan baris. Di proyek klien Arrazy, tabel transaksi sistem aplikasi yang kami bangun rutin tumbuh terus setiap hari, dan itu skenario normal yang memang jadi habitat database relasional, bukan kondisi darurat.

Ringkasnya dalam satu tabel perbandingan:

Aspek Spreadsheet RDBMS (MySQL)
Validasi data Opsional, mudah dilanggar Dipaksa lewat tipe data dan constraint
Pengguna bersamaan Rawan konflik Dirancang untuk banyak koneksi
Jutaan baris Lambat atau crash Normal, dibantu index
Hubungan antar data Manual lewat VLOOKUP Bawaan lewat foreign key dan JOIN
Diakses aplikasi lain Sulit dan rapuh Standar lewat SQL

Istilah yang Akan Sering Muncul: SQL, Query, DDL, dan DML

Sebelum lanjut ke praktik, kenali dulu empat istilah yang akan muncul terus sepanjang seri ini.

  • SQL (Structured Query Language): bahasa standar untuk berbicara dengan database relasional. MySQL, PostgreSQL, dan SQL Server semuanya memakai SQL dengan sedikit perbedaan dialek.
  • Query: satu perintah SQL yang kamu kirim ke database. Bisa berupa permintaan data, bisa juga perintah mengubah sesuatu.
  • DDL (Data Definition Language): kelompok perintah untuk mengatur struktur. Contohnya CREATE TABLE, ALTER TABLE, DROP TABLE. DDL mengubah wadahnya.
  • DML (Data Manipulation Language): kelompok perintah untuk mengelola isi. Contohnya INSERT, SELECT, UPDATE, DELETE. DML mengubah atau membaca isinya.

Analogi sederhananya: DDL itu membangun dan merenovasi rak arsip, DML itu memasukkan, membaca, mengganti, dan membuang berkas di rak tersebut. Bagian 3 sampai 5 seri ini urutannya persis mengikuti logika itu: buat wadahnya dulu (DDL), baru isi datanya (DML).

Untuk memastikan lingkunganmu siap, masuk ke MySQL dan jalankan satu query pertama:

mysql -u root -p

Lalu di prompt mysql>:

SHOW DATABASES;

Output yang diharapkan pada instalasi MySQL 8.4 yang masih bersih:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

Empat database itu bawaan sistem, tempat MySQL menyimpan konfigurasi dan metadata dirinya sendiri. Jangan diutak-atik. Database milikmu akan kita buat sendiri di bagian berikutnya.

Troubleshooting: Error yang Sering Dialami Pemula

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket

Penyebab: service MySQL belum jalan. Klien mencoba menyambung, tapi tidak ada server yang mendengarkan. Solusi di Ubuntu atau Debian:

sudo systemctl start mysql
sudo systemctl status mysql

Pastikan statusnya active (running). Kalau ingin MySQL otomatis jalan setiap komputer menyala, jalankan sudo systemctl enable mysql.

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’

Penyebab: password salah, atau kamu masuk tanpa opsi -p padahal akun root sudah diberi password saat instalasi di bagian 1. Solusi: ulangi dengan mysql -u root -p dan ketik password dengan teliti. Ingat, saat mengetik password di terminal memang tidak muncul karakter apa pun. Itu normal, bukan keyboard rusak.

ERROR 1064 (42000): You have an error in your SQL syntax

Penyebab: salah ketik perintah. Yang paling sering dialami pemula: lupa titik koma di akhir perintah, salah eja kata kunci seperti DATABSE, atau memakai tanda kutip keriting hasil copy dari dokumen Word. Solusi: baca pesan errornya, MySQL menunjukkan potongan teks di dekat lokasi salahnya. Ketik ulang perintah secara manual, jangan copy paste dari sumber yang formatnya tidak jelas.

Prompt berubah jadi tanda panah -> dan perintah tidak jalan

Penyebab: kamu menekan Enter sebelum menutup perintah, biasanya karena lupa titik koma. MySQL mengira perintahmu belum selesai dan menunggu lanjutannya. Solusi: kalau memang tinggal kurang titik koma, ketik ; lalu Enter. Kalau mau membatalkan perintah yang setengah jadi, ketik \c lalu Enter, dan prompt kembali normal ke mysql>.

Rangkuman dan Lanjut ke Bagian 3

Sampai sini kamu sudah memegang fondasi konsepnya. Database relasional menyimpan data dalam tabel berisi baris dan kolom, strukturnya ditetapkan lewat skema, setiap baris diberi identitas lewat primary key, dan tabel-tabel saling terhubung lewat kunci. Dibanding spreadsheet, RDBMS menang di integritas data, dukungan banyak pengguna, dan skala. Kamu juga sudah kenal peta istilah SQL, query, DDL, dan DML yang jadi bahasa sehari-hari sepanjang seri ini.

Di bagian berikutnya, konsep ini mulai kita eksekusi: Belajar Database dari Nol #3: Membuat Database & Tabel MySQL. Kita akan membuat database toko dari nol, lengkap dengan tabel pelanggan dan aturan-aturannya. Artikelnya terbit menyusul, pantau daftar lengkapnya di halaman hub Belajar Database.

Referensi

BACA JUGA

Artikel Lainnya di Kategori Database

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel