Post 9: Intersection Table - Many-to-Many Relationship 5 Contoh kasus

Video ERD Intersection saya

Tonton video saya tentang ERD 5 contoh kasus intersection:

video saya

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.

← Kembali ke Beranda