Post 9: Intersection Table - Many-to-Many Relationship 5 Contoh kasus
Apa itu Intersection Table?
Intersection Table (atau Junction Table) adalah tabel perantara yang digunakan untuk mengimplementasikan relasi many-to-many dalam database relasional. Tabel ini menghubungkan dua tabel utama dengan menyimpan foreign key dari kedua tabel tersebut, sehingga memecah relasi many-to-many menjadi dua relasi one-to-many.
Struktur Dasar Intersection Table
Tabel A (1:N) ← | → (N:1) Intersection Table (1:N) ← | → (N:1) Tabel B
Kasus 1: Sistem KRS (Kartu Rencana Studi)
Skenario
Mahasiswa mengambil banyak Mata Kuliah, Mata Kuliah diambil banyak Mahasiswa. Relasi Many-to-Many ini diimplementasikan dengan tabel KRS sebagai intersection table.
MAHASISWA ← 1:N → KRS ← N:1 → MATA_KULIAH
| MAHASISWA | ||
|---|---|---|
| NIM (PK) | Nama | Jurusan |
| 24416255201003 | Gilang Ramadhan | Teknik Informatika |
| 24416255201004 | Budi Santoso | Teknik Informatika |
| MATA_KULIAH | ||
|---|---|---|
| Kode_MK (PK) | Nama_MK | SKS |
| TI101 | Basis Data | 3 |
| TI102 | Web Programming | 3 |
| KRS (Intersection Table) | ||||
|---|---|---|---|---|
| ID_KRS (PK) | NIM (FK) | Kode_MK (FK) | Semester | Nilai |
| 1 | 24416255201003 | TI101 | Ganjil 2024 | A |
CREATE TABLE mahasiswa (
nim VARCHAR(15) PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
jurusan VARCHAR(50)
);
CREATE TABLE mata_kuliah (
kode_mk VARCHAR(10) PRIMARY KEY,
nama_mk VARCHAR(100) NOT NULL,
sks INT
);
CREATE TABLE krs (
id_krs INT PRIMARY KEY AUTO_INCREMENT,
nim VARCHAR(15) NOT NULL,
kode_mk VARCHAR(10) NOT NULL,
semester VARCHAR(20),
nilai CHAR(2),
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (kode_mk) REFERENCES mata_kuliah(kode_mk) ON DELETE CASCADE,
UNIQUE KEY unique_enrollment (nim, kode_mk)
);
Kasus 2: Sistem Penulis dan Buku
Skenario
Buku ditulis oleh banyak pengarang, Pengarang menulis banyak buku. Intersection table PENULISAN menyimpan informasi siapa menulis buku mana.
PENGARANG ← 1:N → PENULISAN ← N:1 → BUKU
| PENGARANG | ||
|---|---|---|
| ID_Pengarang (PK) | Nama | Negara |
| 1 | Eka Kurniawan | Indonesia |
| BUKU | ||
|---|---|---|
| ISBN (PK) | Judul | Tahun |
| 978-6020470814 | Laskar Pelangi | 2005 |
| PENULISAN (Intersection Table) | ||
|---|---|---|
| ID_Penulisan (PK) | ID_Pengarang (FK) | ISBN (FK) |
| 1 | 1 | 978-6020470814 |
CREATE TABLE pengarang (
id_pengarang INT PRIMARY KEY AUTO_INCREMENT,
nama VARCHAR(100) NOT NULL,
negara VARCHAR(50)
);
CREATE TABLE buku (
isbn VARCHAR(20) PRIMARY KEY,
judul VARCHAR(200) NOT NULL,
tahun INT
);
CREATE TABLE penulisan (
id_penulisan INT PRIMARY KEY AUTO_INCREMENT,
id_pengarang INT NOT NULL,
isbn VARCHAR(20) NOT NULL,
FOREIGN KEY (id_pengarang) REFERENCES pengarang(id_pengarang),
FOREIGN KEY (isbn) REFERENCES buku(isbn),
UNIQUE KEY unique_penulisan (id_pengarang, isbn)
);
Kasus 3: Sistem Peserta dan Event
Skenario
Event dihadiri banyak peserta, Peserta menghadiri banyak event. Intersection table REGISTRASI mencatat peserta mana mengikuti event apa.
PESERTA ← 1:N → REGISTRASI ← N:1 → EVENT
| PESERTA | |
|---|---|
| ID_Peserta (PK) | Nama |
| P001 | Gilang Ramadhan |
| EVENT | |
|---|---|
| ID_Event (PK) | Nama_Event |
| E001 | Workshop Database 2024 |
| REGISTRASI (Intersection Table) | ||||
|---|---|---|---|---|
| ID_Registrasi (PK) | ID_Peserta (FK) | ID_Event (FK) | Tanggal_Daftar | Status |
| 1 | P001 | E001 | 2024-10-09 | Terverifikasi |
CREATE TABLE peserta (
id_peserta VARCHAR(10) PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
CREATE TABLE event (
id_event VARCHAR(10) PRIMARY KEY,
nama_event VARCHAR(200) NOT NULL,
tanggal_mulai DATE,
tanggal_selesai DATE
);
CREATE TABLE registrasi (
id_registrasi INT PRIMARY KEY AUTO_INCREMENT,
id_peserta VARCHAR(10) NOT NULL,
id_event VARCHAR(10) NOT NULL,
tanggal_daftar DATE,
status VARCHAR(20),
FOREIGN KEY (id_peserta) REFERENCES peserta(id_peserta),
FOREIGN KEY (id_event) REFERENCES event(id_event),
UNIQUE KEY unique_registrasi (id_peserta, id_event)
);
Kasus 4: Sistem Dokter dan Pasien
Skenario
Dokter memeriksa banyak pasien, Pasien diperiksa oleh banyak dokter. Intersection table PEMERIKSAAN mencatat kapan dokter memeriksa pasien dan hasilnya.
DOKTER ← 1:N → PEMERIKSAAN ← N:1 → PASIEN
| DOKTER | ||
|---|---|---|
| ID_Dokter (PK) | Nama | Spesialisasi |
| D001 | Dr. Ahmad | Umum |
| PASIEN | |
|---|---|
| ID_Pasien (PK) | Nama |
| PA001 | Budi Santoso |
| PEMERIKSAAN (Intersection Table) | ||||
|---|---|---|---|---|
| ID_Pemeriksaan (PK) | ID_Dokter (FK) | ID_Pasien (FK) | Tanggal | Diagnosa |
| 1 | D001 | PA001 | 2024-10-09 | Demam Tinggi |
CREATE TABLE dokter (
id_dokter VARCHAR(10) PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
spesialisasi VARCHAR(50)
);
CREATE TABLE pasien (
id_pasien VARCHAR(10) PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
no_rm VARCHAR(20)
);
CREATE TABLE pemeriksaan (
id_pemeriksaan INT PRIMARY KEY AUTO_INCREMENT,
id_dokter VARCHAR(10) NOT NULL,
id_pasien VARCHAR(10) NOT NULL,
tanggal DATE,
diagnosa TEXT,
biaya DECIMAL(10,2),
FOREIGN KEY (id_dokter) REFERENCES dokter(id_dokter),
FOREIGN KEY (id_pasien) REFERENCES pasien(id_pasien)
);
Kasus 5: Sistem Karyawan dan Project
Skenario
Project dikerjakan banyak karyawan, Karyawan bekerja di banyak project. Intersection table PENUGASAN mencatat siapa bekerja di project mana dan peran mereka.
KARYAWAN ← 1:N → PENUGASAN ← N:1 → PROJECT
| KARYAWAN | |
|---|---|
| ID_Karyawan (PK) | Nama |
| K001 | Gilang Ramadhan |
| PROJECT | |
|---|---|
| ID_Project (PK) | Nama_Project |
| PJ001 | Sistem Perpustakaan |
| PENUGASAN (Intersection Table) | ||||
|---|---|---|---|---|
| ID_Penugasan (PK) | ID_Karyawan (FK) | ID_Project (FK) | Peran | Jam_Kerja |
| 1 | K001 | PJ001 | Backend Developer | 160 |
CREATE TABLE karyawan (
id_karyawan VARCHAR(10) PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
departemen VARCHAR(50)
);
CREATE TABLE project (
id_project VARCHAR(10) PRIMARY KEY,
nama_project VARCHAR(200) NOT NULL,
budget DECIMAL(15,2)
);
CREATE TABLE penugasan (
id_penugasan INT PRIMARY KEY AUTO_INCREMENT,
id_karyawan VARCHAR(10) NOT NULL,
id_project VARCHAR(10) NOT NULL,
peran VARCHAR(50),
jam_kerja INT,
FOREIGN KEY (id_karyawan) REFERENCES karyawan(id_karyawan),
FOREIGN KEY (id_project) REFERENCES project(id_project)
);
Best Practices untuk Intersection Table
Hal-hal Penting yang Harus Diperhatikan:
- Primary Key: Gunakan auto-increment atau composite key yang jelas
- Foreign Keys: Selalu definisikan dengan ON DELETE CASCADE atau ON DELETE RESTRICT
- Unique Constraint: Hindari duplikasi dengan UNIQUE KEY pada kombinasi FK
- Attribute Tambahan: Simpan data yang relevan dengan relasi (nilai, tanggal, status, peran)
- Indexing: Buat index pada foreign key untuk performa query yang lebih baik
- Naming Convention: Gunakan nama yang deskriptif dan konsisten
- Testing: Test query JOIN dengan data sample sebelum production
Query Umum untuk Intersection Table
1. Menampilkan semua relasi dengan JOIN:
SELECT m.nim, m.nama, mk.nama_mk, k.nilai FROM mahasiswa m JOIN krs k ON m.nim = k.nim JOIN mata_kuliah mk ON k.kode_mk = mk.kode_mk;
2. Menghitung jumlah dengan GROUP BY:
SELECT mk.nama_mk, COUNT(k.nim) as jumlah_mahasiswa FROM mata_kuliah mk LEFT JOIN krs k ON mk.kode_mk = k.kode_mk GROUP BY mk.kode_mk;
3. Insert relasi baru:
INSERT INTO krs (nim, kode_mk, semester, nilai)
VALUES ('24416255201003', 'TI101', 'Ganjil 2024', 'A');
4. Update relasi:
UPDATE krs SET nilai = 'A' WHERE nim = '24416255201003' AND kode_mk = 'TI101';
5. Hapus relasi:
DELETE FROM krs WHERE nim = '24416255201003' AND kode_mk = 'TI101';
Kesimpulan
Intersection Table adalah solusi elegan dan powerful untuk mengimplementasikan relasi many-to-many dalam database relasional. Melalui 5 kasus praktis yang telah dijelaskan, Anda dapat melihat bahwa pola ini berlaku secara universal untuk berbagai skenario dunia nyata: akademik, penerbitan, event management, healthcare, dan project management. Dengan menguasai konsep intersection table, Anda dapat merancang database yang robust, scalable, dan mudah dimaintain untuk aplikasi yang kompleks sekalipun.