Belajar Database MySQL #8: Konsep Relasi Antar Tabel (Foreign Key)

Heru Iryanto
Heru Iryanto
Teacher, Content Creator and Full-Stack Developer

Sejauh ini, kita hanya berputar-putar di satu laci/tabel (tabel_buku). Ini adalah cara berpikir pengguna Microsoft Excel. Seorang desainer Database sejati tidak boleh menaruh semua data campur aduk di dalam satu tabel raksasa!

1️⃣ Bencana “Satu Tabel Raksasa” (Redudansi)

Katakanlah Anda ingin mencatat siapa saja yang meminjam buku. Jika Anda memakai “Otak Excel”, Anda mungkin akan menambahkan kolom baru bernama nama_peminjam dan alamat_peminjam di dalam tabel_buku.

Mengapa ini adalah ide yang sangat buruk? Anggaplah “Budi” (dengan alamat Jln. Mawar) meminjam 5 buku sekaligus. Maka, di tabel Anda, tulisan “Budi” dan “Jln. Mawar” akan diketik berulang-ulang sebanyak 5 kali! Ini disebut Redudansi (Penumpukan Data). Jika besok Budi pindah alamat, Anda harus mencari dan meng-Update kelima baris buku tersebut satu per satu. Sangat tidak efisien dan rentan terjadi salah ketik (Typo)!

2️⃣ Solusi: Pecah Menjadi Tabel-Tabel Kecil

Dalam RDBMS (Relational Database), aturan mutlaknya adalah Pecah Tabel Berdasarkan Entitas (Wujudnya). Sebuah perpustakaan memiliki 2 (dua) entitas fisik yang sangat berbeda: Buku dan Manusia (Anggota). Keduanya TIDAK BOLEH berada di laci yang sama!

Mari kita buat laci kedua: tabel_anggota.

CREATE TABLE tabel_anggota (
  id_anggota INT PRIMARY KEY AUTO_INCREMENT,
  nama_anggota VARCHAR(100),
  alamat TEXT
);

Mari kita isi laci tersebut dengan data anggota “Budi”:

INSERT INTO tabel_anggota (nama_anggota, alamat) 
VALUES ('Budi', 'Jln. Mawar');

(Budi otomatis mendapat ID = 1).

3️⃣ Foreign Key (Kunci Tamu / Penyambung Silaturahmi)

Sekarang kita punya tabel_buku (Laci 1) dan tabel_anggota (Laci 2).

Pertanyaannya: Bagaimana caranya kita mencatat bahwa buku Harry Potter (Buku ID 1) sedang dipinjam oleh si Budi (Anggota ID 1)? Apakah kita membuat Laci 3? Ya, kita buat Laci Transaksi!

Laci ke-3 ini (Misal kita beri nama tabel_peminjaman) TIDAK BOLEH berisi teks judul buku maupun teks nama anggota. Laci ke-3 ini HANYA BOLEH berisi Kumpulan Angka ID.

Mari kita buat tabel_peminjaman:

  1. Kolom 1: id_pinjam (Primary Key tabel ini).
  2. Kolom 2: id_buku_yg_dipinjam (Ini adalah Foreign Key).
  3. Kolom 3: id_anggota_peminjam (Ini juga Foreign Key).
  4. Kolom 4: tanggal_pinjam.
CREATE TABLE tabel_peminjaman (
  id_peminjaman INT PRIMARY KEY AUTO_INCREMENT,
  id_buku_yg_dipinjam INT,
  id_anggota_peminjam INT,
  tanggal_pinjam DATE
);

Jika kita ingin mencatat transaksi peminjaman si Budi, cukup ketik:

INSERT INTO tabel_peminjaman (id_buku_yg_dipinjam, id_anggota_peminjam)
VALUES (1, 1);

Contoh lainnya:

INSERT INTO tabel_peminjaman (id_buku_yg_dipinjam, id_anggota_peminjam, tanggal_pinjam)
VALUES (3, 1, '2026-08-31');

Analisis:

  • MySQL melihat angka 1 di kolom id_anggota_peminjam.
  • Kolom tersebut adalah Foreign Key (Kunci Tamu). Ia seolah-olah mengetuk pintu Laci 2 (tabel_anggota), dan menyapanya: “Hei, tolong buka datamu yang ber-ID 1. Oh, ternyata dia bernama Budi dari Jln. Mawar!”

Selesai! Tidak ada lagi nama “Budi” yang diketik berulang kali di seluruh tabel. Data Budi hanya diketik SATU KALI di tabel_anggota. Jika Budi pindah alamat, Anda hanya perlu mengubahnya 1 kali saja di tabel anggota, dan seluruh riwayat transaksinya akan otomatis membaca alamat barunya karena mereka hanya menyimpan angka ID-nya!

🗽 Kesimpulan

Ini adalah konsep Relasi (Hubungan Antar Tabel). Inilah alasan mengapa benda ini dinamakan RDBMS (Sistem Database Relasional).

Sekarang Anda sudah memiliki 3 tabel terpisah yang dihubungkan oleh angka rahasia (Foreign Key). Namun, saat Bos meminta laporan: “Siapa yang pinjam buku Harry Potter?”, tabel peminjaman hanya memberikan hasil berupa kode: “ID Anggota 1 meminjam ID Buku 1”. Bos Anda tidak akan paham apa itu angka 1! Bos Anda butuh laporan Teks berupa Tampilan Nama aslinya. Lalu bagaimana cara “menerjemahkan” angka-angka gaib tersebut agar menjadi nama aslinya lagi di layar? Temukan jawabannya di materi Menggabungkan Tabel dengan JOIN.