Halo, para pejuang kode!
Sebagai mahasiswa Teknik Informatika, kita pasti sudah tidak asing lagi dengan yang namanya ERD (Entity-Relationship Diagram). ERD adalah fondasi dari perancangan database yang baik. Salah satu komponen kuncinya adalah relasi atau relationship, yang menggambarkan bagaimana satu entitas terhubung dengan entitas lainnya.
Namun, ada satu jenis relasi yang sering menjadi "jebakan" bagi para pemula: relasi Many-to-Many (M:N). Di postingan ini, kita akan bedah tuntas apa itu relasi, mengapa relasi M:N ini bermasalah dalam implementasi database fisik, dan bagaimana cara mengatasinya menggunakan MySQL Workbench.
Memahami Konsep Relasi dalam ERD
Secara sederhana, relasi adalah hubungan yang terjadi antara dua atau lebih entitas. Hubungan ini digambarkan dengan garis yang menghubungkan entitas-entitas tersebut. Kekuatan atau jumlah hubungan ini disebut kardinalitas, yang terbagi menjadi tiga jenis utama:
- One-to-One (1:1):Satu data di entitas A hanya bisa berhubungan dengan satu data di entitas B.
- Contoh: Satu
Mahasiswahanya bisa memiliki satuKTM(Kartu Tanda Mahasiswa). - One-to-Many (1:N): Satu data di entitas A bisa berhubungan dengan banyak data di entitas B.
- Contoh: Satu
Dosendapat membimbing banyakMahasiswa, tetapi satuMahasiswahanya dibimbing oleh satuDosenWali. - Many-to-Many (M:N): Banyak data di entitas A bisa berhubungan dengan banyak data di entitas B.
- Contoh: Banyak
Mahasiswadapat mengambil banyakMataKuliah, dan satuMataKuliahdapat diambil oleh banyakMahasiswa.
Konsep M:N secara teori terdengar logis, bukan? Tapi saat kita coba menerapkannya ke dalam tabel database fisik, masalah pun muncul.
Mengapa Relasi Many-to-Many Bermasalah?
Sebenarnya, relasi M:N bukanlah konsep yang salah, tetapi tidak bisa diimplementasikan secara langsung pada database relasional seperti MySQL. Jika kita memaksakannya, akan ada dua masalah besar:
- Redundansi Data dan Anomali
- Jika
matakuliah_idditaruh di tabelMahasiswa, maka satu mahasiswa hanya bisa mengambil satu matkul. Tidak bisa M:N. - Jika
mahasiswa_idditaruh di tabelMataKuliah, maka satu matkul hanya bisa diambil oleh satu mahasiswa. Juga tidak bisa M:N. - Jika kita membuat kolom
mahasiswa_idataumatakuliah_idbisa menampung banyak nilai (misal: "MK01, MK02, MK03"), ini melanggar aturan normalisasi pertama (1st Normal Form) dan akan sangat sulit untuk mengelola dan melakukan query data. - Kesulitan Menyimpan Atribut Relasi
- Tidak bisa di tabel
Mahasiswa, karena satu mahasiswa punya banyak nilai untuk mata kuliah yang berbeda. - Tidak bisa di tabel
MataKuliah, karena satu mata kuliah memiliki banyak nilai dari mahasiswa yang berbeda.
Bayangkan kita punya tabel Mahasiswa dan MataKuliah. Jika kita ingin mencatat siapa mengambil apa, di mana kita akan menyimpan foreign key-nya?
Seringkali, sebuah hubungan memiliki data atau atributnya sendiri. Pada kasus Mahasiswa mengambil MataKuliah, ada atribut penting seperti Nilai, Tanggal Pendaftaran, atau Semester.
Di mana kita akan menyimpan kolom nilai?
Inilah alasan utama mengapa relasi M:N secara konseptual harus "dipecah" saat perancangan database fisik.
Solusinya: Gunakan Junction Table (Tabel Penghubung)
Untuk menyelesaikan masalah ini, kita memperkenalkan entitas baru yang disebut Junction Table atau Entitas Asosiatif. Tabel ini berfungsi sebagai jembatan antara dua entitas yang memiliki hubungan M:N.
Caranya adalah dengan mengubah satu relasi M:N menjadi dua relasi 1:N.
- Dari
MahasiswakeJunction Table(Relasi 1:N) - Dari
MataKuliahkeJunction Table(Relasi 1:N)
Dengan begini, setiap baris di junction table akan merepresentasikan satu hubungan unik antara seorang mahasiswa dengan satu mata kuliah. Tabel ini juga menjadi tempat yang sempurna untuk menyimpan atribut relasi seperti nilai.