Contoh ERD Sistem Informasi Akademik
Tutorial Lengkap Entity Relationship Diagram untuk Sistem Akademik
Level: Pemula – Menengah
Waktu Baca: 20 menit
Pengenalan ERD Sistem Informasi Akademik
Entity Relationship Diagram (ERD) adalah blueprint fundamental dalam perancangan sistem informasi akademik. Sebelum memulai, pastikan Anda memahami dasar-dasar tutorial database mysql untuk pemula untuk implementasi yang optimal.
Dalam tutorial ini, kita akan mempelajari cara merancang ERD yang komprehensif untuk sistem informasi akademik, mulai dari identifikasi entitas hingga implementasi database yang efisien dan scalable.
Konsep Dasar ERD dalam Sistem Akademik
ERD sistem akademik melibatkan berbagai entitas yang saling berinteraksi. Pemahaman tentang normalisasi database relational sangat penting untuk menciptakan struktur yang optimal.
Komponen Utama ERD
- Entity: Objek dalam sistem (Mahasiswa, Dosen)
- Attribute: Properti entity (NIM, Nama)
- Relationship: Hubungan antar entity
- Cardinality: Batasan hubungan (1:1, 1:N, M:N)
Entitas Utama Sistem Akademik
- Mahasiswa (Student)
- Dosen (Lecturer)
- Mata Kuliah (Course)
- Kelas (Class)
- Nilai (Grade)
- Jurusan (Department)
🎯 Visualisasi Komponen ERD
Contoh 1: ERD Lengkap Sistem Akademik
Berikut adalah contoh ERD lengkap untuk sistem informasi akademik yang mencakup semua entitas utama dan relasinya.
ERD Sistem Informasi Akademik Lengkap
Nama_Fakultas
Dekan
Nama_Jurusan
ID_Fakultas (FK)
Nama_Mahasiswa
Tanggal_Lahir
Alamat
ID_Jurusan (FK)
Nama_Dosen
Spesialisasi
ID_Jurusan (FK)
Nama_MK
SKS
Semester
ID_Jurusan (FK)
Kode_MK (FK)
NIP (FK)
Ruangan
Jadwal
Kapasitas
NIM (FK)
ID_Kelas (FK)
Nilai_Angka
Nilai_Huruf
Semester
SQL Implementation ERD Sistem Akademik:
-- Database: sistem_informasi_akademik
CREATE DATABASE sistem_informasi_akademik;
USE sistem_informasi_akademik;
-- Tabel Fakultas
CREATE TABLE fakultas (
id_fakultas INT PRIMARY KEY AUTO_INCREMENT,
nama_fakultas VARCHAR(100) NOT NULL,
dekan VARCHAR(100),
alamat TEXT,
telepon VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabel Jurusan
CREATE TABLE jurusan (
id_jurusan INT PRIMARY KEY AUTO_INCREMENT,
nama_jurusan VARCHAR(100) NOT NULL,
id_fakultas INT,
ketua_jurusan VARCHAR(100),
akreditasi ENUM('A', 'B', 'C', 'Belum Terakreditasi'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_fakultas) REFERENCES fakultas(id_fakultas) ON DELETE CASCADE
);
-- Tabel Mahasiswa
CREATE TABLE mahasiswa (
nim VARCHAR(20) PRIMARY KEY,
nama_mahasiswa VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
tanggal_lahir DATE,
jenis_kelamin ENUM('L', 'P'),
alamat TEXT,
telepon VARCHAR(20),
id_jurusan INT,
tahun_masuk YEAR,
status ENUM('Aktif', 'Cuti', 'Lulus', 'DO') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_jurusan) REFERENCES jurusan(id_jurusan) ON DELETE SET NULL,
INDEX idx_nama (nama_mahasiswa),
INDEX idx_jurusan (id_jurusan)
);
-- Tabel Dosen
CREATE TABLE dosen (
nip VARCHAR(20) PRIMARY KEY,
nama_dosen VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
spesialisasi VARCHAR(100),
pendidikan_terakhir VARCHAR(50),
id_jurusan INT,
status ENUM('Aktif', 'Pensiun', 'Cuti') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_jurusan) REFERENCES jurusan(id_jurusan) ON DELETE SET NULL,
INDEX idx_nama (nama_dosen),
INDEX idx_jurusan (id_jurusan)
);
-- Tabel Mata Kuliah
CREATE TABLE mata_kuliah (
kode_mk VARCHAR(10) PRIMARY KEY,
nama_mk VARCHAR(100) NOT NULL,
sks INT NOT NULL CHECK (sks > 0 AND sks <= 6), semester INT CHECK (semester >= 1 AND semester <= 8), jenis ENUM('Wajib', 'Pilihan') DEFAULT 'Wajib', id_jurusan INT, deskripsi TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (id_jurusan) REFERENCES jurusan(id_jurusan) ON DELETE CASCADE, INDEX idx_semester (semester), INDEX idx_jurusan (id_jurusan) ); -- Tabel Kelas CREATE TABLE kelas ( id_kelas INT PRIMARY KEY AUTO_INCREMENT, kode_mk VARCHAR(10), nip VARCHAR(20), ruangan VARCHAR(20), hari ENUM('Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'), jam_mulai TIME, jam_selesai TIME, kapasitas INT DEFAULT 40, semester_aktif VARCHAR(10), -- Format: 2024/1 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (kode_mk) REFERENCES mata_kuliah(kode_mk) ON DELETE CASCADE, FOREIGN KEY (nip) REFERENCES dosen(nip) ON DELETE SET NULL, INDEX idx_semester (semester_aktif), INDEX idx_jadwal (hari, jam_mulai) ); -- Tabel Nilai (Relationship table) CREATE TABLE nilai ( id_nilai INT PRIMARY KEY AUTO_INCREMENT, nim VARCHAR(20), id_kelas INT, nilai_tugas DECIMAL(5,2) DEFAULT 0, nilai_uts DECIMAL(5,2) DEFAULT 0, nilai_uas DECIMAL(5,2) DEFAULT 0, nilai_akhir DECIMAL(5,2) GENERATED ALWAYS AS ( (nilai_tugas * 0.3) + (nilai_uts * 0.3) + (nilai_uas * 0.4) ) STORED, nilai_huruf CHAR(2) GENERATED ALWAYS AS ( CASE WHEN (nilai_tugas * 0.3) + (nilai_uts * 0.3) + (nilai_uas * 0.4) >= 85 THEN 'A'
WHEN (nilai_tugas * 0.3) + (nilai_uts * 0.3) + (nilai_uas * 0.4) >= 70 THEN 'B'
WHEN (nilai_tugas * 0.3) + (nilai_uts * 0.3) + (nilai_uas * 0.4) >= 55 THEN 'C'
WHEN (nilai_tugas * 0.3) + (nilai_uts * 0.3) + (nilai_uas * 0.4) >= 40 THEN 'D'
ELSE 'E'
END
) STORED,
semester VARCHAR(10),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (id_kelas) REFERENCES kelas(id_kelas) ON DELETE CASCADE,
UNIQUE KEY unique_enrollment (nim, id_kelas),
INDEX idx_semester (semester),
INDEX idx_mahasiswa (nim)
);
-- Tabel Prerequisite (Mata kuliah prasyarat)
CREATE TABLE prerequisite (
id_prerequisite INT PRIMARY KEY AUTO_INCREMENT,
kode_mk VARCHAR(10),
kode_mk_prasyarat VARCHAR(10),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (kode_mk) REFERENCES mata_kuliah(kode_mk) ON DELETE CASCADE,
FOREIGN KEY (kode_mk_prasyarat) REFERENCES mata_kuliah(kode_mk) ON DELETE CASCADE,
UNIQUE KEY unique_prerequisite (kode_mk, kode_mk_prasyarat)
);
Contoh 2: ERD Sistem Registrasi Mahasiswa
ERD khusus untuk sistem registrasi dan penerimaan mahasiswa baru dengan proses yang lebih detail.
ERD Sistem Registrasi Mahasiswa
Nama_Lengkap
NIK
No_HP
Asal_Sekolah
ID_Pendaftar (FK)
ID_Jurusan (FK)
Tanggal_Daftar
Status_Pendaftaran
ID_Pendaftaran (FK)
Jenis_Dokumen
Nama_File
Status_Verifikasi
ID_Pendaftaran (FK)
Jenis_Tes
Nilai
Tanggal_Tes
ID_Pendaftaran (FK)
Jumlah
Tanggal_Bayar
Status_Bayar
ID_Pendaftaran (FK)
Status_Kelulusan
Ranking
Tanggal_Pengumuman
SQL Implementation Sistem Registrasi:
-- Tabel Calon Mahasiswa
CREATE TABLE calon_mahasiswa (
id_pendaftar INT PRIMARY KEY AUTO_INCREMENT,
nama_lengkap VARCHAR(100) NOT NULL,
nik VARCHAR(16) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
no_hp VARCHAR(15),
tempat_lahir VARCHAR(50),
tanggal_lahir DATE,
jenis_kelamin ENUM('L', 'P'),
alamat TEXT,
asal_sekolah VARCHAR(100),
tahun_lulus YEAR,
nilai_un DECIMAL(4,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_nik (nik),
INDEX idx_email (email)
);
-- Tabel Pendaftaran
CREATE TABLE pendaftaran (
id_pendaftaran INT PRIMARY KEY AUTO_INCREMENT,
id_pendaftar INT,
id_jurusan INT,
jalur_masuk ENUM('SNMPTN', 'SBMPTN', 'Mandiri', 'Transfer'),
tanggal_daftar TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status_pendaftaran ENUM('Draft', 'Submitted', 'Verified', 'Rejected') DEFAULT 'Draft',
kode_pendaftaran VARCHAR(20) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_pendaftar) REFERENCES calon_mahasiswa(id_pendaftar) ON DELETE CASCADE,
FOREIGN KEY (id_jurusan) REFERENCES jurusan(id_jurusan) ON DELETE CASCADE,
INDEX idx_status (status_pendaftaran),
INDEX idx_jalur (jalur_masuk)
);
-- Tabel Dokumen
CREATE TABLE dokumen (
id_dokumen INT PRIMARY KEY AUTO_INCREMENT,
id_pendaftaran INT,
jenis_dokumen ENUM('KTP', 'Ijazah', 'Transkrip', 'Foto', 'KK', 'Surat_Sehat'),
nama_file VARCHAR(255),
ukuran_file INT,
path_file VARCHAR(500),
status_verifikasi ENUM('Pending', 'Approved', 'Rejected') DEFAULT 'Pending',
catatan_verifikasi TEXT,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
verified_at TIMESTAMP NULL,
FOREIGN KEY (id_pendaftaran) REFERENCES pendaftaran(id_pendaftaran) ON DELETE CASCADE,
INDEX idx_jenis (jenis_dokumen),
INDEX idx_status (status_verifikasi)
);
-- Tabel Tes Masuk
CREATE TABLE tes_masuk (
id_tes INT PRIMARY KEY AUTO_INCREMENT,
id_pendaftaran INT,
jenis_tes ENUM('TPA', 'Matematika', 'Bahasa_Inggris', 'Wawancara', 'Praktik'),
nilai DECIMAL(5,2),
nilai_maksimal DECIMAL(5,2) DEFAULT 100,
tanggal_tes DATE,
waktu_mulai TIME,
waktu_selesai TIME,
ruang_tes VARCHAR(20),
status_tes ENUM('Scheduled', 'Completed', 'Absent') DEFAULT 'Scheduled',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_pendaftaran) REFERENCES pendaftaran(id_pendaftaran) ON DELETE CASCADE,
INDEX idx_tanggal (tanggal_tes),
INDEX idx_jenis (jenis_tes)
);
-- Tabel Pembayaran
CREATE TABLE pembayaran (
id_pembayaran INT PRIMARY KEY AUTO_INCREMENT,
id_pendaftaran INT,
jenis_pembayaran ENUM('Pendaftaran', 'Tes', 'Daftar_Ulang'),
jumlah DECIMAL(10,2) NOT NULL,
tanggal_bayar TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
metode_bayar ENUM('Transfer', 'Tunai', 'Kartu_Kredit', 'E-Wallet'),
nomor_referensi VARCHAR(50),
status_bayar ENUM('Pending', 'Success', 'Failed', 'Refunded') DEFAULT 'Pending',
bukti_bayar VARCHAR(255),
verified_by INT,
verified_at TIMESTAMP NULL,
FOREIGN KEY (id_pendaftaran) REFERENCES pendaftaran(id_pendaftaran) ON DELETE CASCADE,
INDEX idx_status (status_bayar),
INDEX idx_tanggal (tanggal_bayar)
);
-- Tabel Hasil Seleksi
CREATE TABLE hasil_seleksi (
id_hasil INT PRIMARY KEY AUTO_INCREMENT,
id_pendaftaran INT,
total_nilai DECIMAL(6,2),
ranking INT,
status_kelulusan ENUM('Lulus', 'Tidak_Lulus', 'Cadangan'),
tanggal_pengumuman DATE,
batas_daftar_ulang DATE,
catatan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_pendaftaran) REFERENCES pendaftaran(id_pendaftaran) ON DELETE CASCADE,
INDEX idx_status (status_kelulusan),
INDEX idx_ranking (ranking)
);
-- View untuk laporan pendaftaran
CREATE VIEW v_laporan_pendaftaran AS
SELECT
p.id_pendaftaran,
p.kode_pendaftaran,
cm.nama_lengkap,
cm.email,
j.nama_jurusan,
p.jalur_masuk,
p.status_pendaftaran,
p.tanggal_daftar,
COALESCE(hs.status_kelulusan, 'Belum_Diumumkan') as status_kelulusan
FROM pendaftaran p
JOIN calon_mahasiswa cm ON p.id_pendaftar = cm.id_pendaftar
JOIN jurusan j ON p.id_jurusan = j.id_jurusan
LEFT JOIN hasil_seleksi hs ON p.id_pendaftaran = hs.id_pendaftaran;
Contoh 3: ERD Sistem Perpustakaan Akademik
ERD untuk sistem perpustakaan yang terintegrasi dengan sistem akademik, mencakup peminjaman buku dan manajemen koleksi.
ERD Sistem Perpustakaan Akademik
Judul
Penulis
Penerbit
Tahun_Terbit
ID_Kategori (FK)
Nama_Kategori
Deskripsi
Kode_Dewey
ISBN (FK)
Kode_Buku
Status
Kondisi
Lokasi_Rak
NIM (FK)
ID_Eksemplar (FK)
Tanggal_Pinjam
Tanggal_Kembali
Status_Pinjam
SQL Implementation Sistem Perpustakaan:
-- Tabel Kategori Buku
CREATE TABLE kategori_buku (
id_kategori INT PRIMARY KEY AUTO_INCREMENT,
nama_kategori VARCHAR(100) NOT NULL,
deskripsi TEXT,
kode_dewey VARCHAR(10),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabel Buku
CREATE TABLE buku (
isbn VARCHAR(20) PRIMARY KEY,
judul VARCHAR(200) NOT NULL,
penulis VARCHAR(200),
penerbit VARCHAR(100),
tahun_terbit YEAR,
jumlah_halaman INT,
bahasa VARCHAR(20) DEFAULT 'Indonesia',
id_kategori INT,
sinopsis TEXT,
gambar_cover VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_kategori) REFERENCES kategori_buku(id_kategori) ON DELETE SET NULL,
INDEX idx_judul (judul),
INDEX idx_penulis (penulis),
INDEX idx_kategori (id_kategori)
);
-- Tabel Eksemplar (Copy fisik buku)
CREATE TABLE eksemplar (
id_eksemplar INT PRIMARY KEY AUTO_INCREMENT,
isbn VARCHAR(20),
kode_buku VARCHAR(20) UNIQUE NOT NULL,
status_buku ENUM('Tersedia', 'Dipinjam', 'Rusak', 'Hilang', 'Dalam_Perbaikan') DEFAULT 'Tersedia',
kondisi ENUM('Baik', 'Cukup', 'Buruk') DEFAULT 'Baik',
lokasi_rak VARCHAR(20),
tanggal_masuk DATE,
harga_beli DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (isbn) REFERENCES buku(isbn) ON DELETE CASCADE,
INDEX idx_status (status_buku),
INDEX idx_lokasi (lokasi_rak)
);
-- Tabel Peminjaman
CREATE TABLE peminjaman (
id_peminjaman INT PRIMARY KEY AUTO_INCREMENT,
nim VARCHAR(20),
id_eksemplar INT,
tanggal_pinjam DATE NOT NULL,
tanggal_jatuh_tempo DATE NOT NULL,
tanggal_kembali DATE NULL,
status_pinjam ENUM('Aktif', 'Dikembalikan', 'Terlambat', 'Hilang') DEFAULT 'Aktif',
denda DECIMAL(10,2) DEFAULT 0,
catatan TEXT,
petugas_pinjam VARCHAR(50),
petugas_kembali VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (id_eksemplar) REFERENCES eksemplar(id_eksemplar) ON DELETE CASCADE,
INDEX idx_status (status_pinjam),
INDEX idx_tanggal (tanggal_pinjam),
INDEX idx_mahasiswa (nim)
);
-- Tabel Reservasi Buku
CREATE TABLE reservasi (
id_reservasi INT PRIMARY KEY AUTO_INCREMENT,
nim VARCHAR(20),
isbn VARCHAR(20),
tanggal_reservasi TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tanggal_expired DATE,
status_reservasi ENUM('Aktif', 'Dipenuhi', 'Dibatalkan', 'Expired') DEFAULT 'Aktif',
prioritas INT DEFAULT 1,
catatan TEXT,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (isbn) REFERENCES buku(isbn) ON DELETE CASCADE,
INDEX idx_status (status_reservasi),
INDEX idx_tanggal (tanggal_reservasi)
);
-- Tabel Denda
CREATE TABLE denda (
id_denda INT PRIMARY KEY AUTO_INCREMENT,
id_peminjaman INT,
jumlah_denda DECIMAL(10,2) NOT NULL,
tanggal_denda DATE,
status_bayar ENUM('Belum_Bayar', 'Sudah_Bayar', 'Dibebaskan') DEFAULT 'Belum_Bayar',
tanggal_bayar DATE NULL,
metode_bayar VARCHAR(50),
petugas VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_peminjaman) REFERENCES peminjaman(id_peminjaman) ON DELETE CASCADE,
INDEX idx_status (status_bayar)
);
-- View untuk laporan peminjaman aktif
CREATE VIEW v_peminjaman_aktif AS
SELECT
p.id_peminjaman,
m.nim,
m.nama_mahasiswa,
b.judul,
e.kode_buku,
p.tanggal_pinjam,
p.tanggal_jatuh_tempo,
DATEDIFF(CURDATE(), p.tanggal_jatuh_tempo) as hari_terlambat,
CASE
WHEN CURDATE() > p.tanggal_jatuh_tempo THEN
GREATEST(0, DATEDIFF(CURDATE(), p.tanggal_jatuh_tempo) * 1000)
ELSE 0
END as denda_hitung
FROM peminjaman p
JOIN mahasiswa m ON p.nim = m.nim
JOIN eksemplar e ON p.id_eksemplar = e.id_eksemplar
JOIN buku b ON e.isbn = b.isbn
WHERE p.status_pinjam = 'Aktif';
Contoh 4: ERD Sistem Penjadwalan Kuliah
ERD khusus untuk sistem penjadwalan kuliah yang kompleks dengan manajemen ruangan dan konflik jadwal. Implementasi ini sangat berguna untuk desain sistem informasi berbasis web yang modern.
ERD Sistem Penjadwalan Kuliah
Nama_Ruangan
Kapasitas
Tipe_Ruangan
Fasilitas
Status
Hari
Jam_Mulai
Jam_Selesai
Sesi
ID_Kelas (FK)
ID_Ruangan (FK)
ID_Slot (FK)
Semester_Aktif
Status_Jadwal
ID_Jadwal1 (FK)
ID_Jadwal2 (FK)
Jenis_Konflik
Status_Resolved
ID_Jadwal (FK)
Tanggal_Perubahan
Alasan
Status_Approval
ID_Jadwal (FK)
NIM (FK)
Tanggal
Status_Hadir
SQL Implementation Sistem Penjadwalan:
-- Tabel Ruangan
CREATE TABLE ruangan (
id_ruangan INT PRIMARY KEY AUTO_INCREMENT,
kode_ruangan VARCHAR(10) UNIQUE NOT NULL,
nama_ruangan VARCHAR(100) NOT NULL,
kapasitas INT NOT NULL,
tipe_ruangan ENUM('Kelas', 'Lab_Komputer', 'Lab_Bahasa', 'Auditorium', 'Seminar') DEFAULT 'Kelas',
fasilitas JSON, -- {"proyektor": true, "ac": true, "wifi": true}
lokasi VARCHAR(100),
status_ruangan ENUM('Aktif', 'Maintenance', 'Rusak') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_tipe (tipe_ruangan),
INDEX idx_kapasitas (kapasitas)
);
-- Tabel Waktu Slot
CREATE TABLE waktu_slot (
id_slot INT PRIMARY KEY AUTO_INCREMENT,
hari ENUM('Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu') NOT NULL,
jam_mulai TIME NOT NULL,
jam_selesai TIME NOT NULL,
sesi VARCHAR(20), -- 'Pagi', 'Siang', 'Sore'
durasi_menit INT GENERATED ALWAYS AS (
TIME_TO_SEC(jam_selesai) / 60 - TIME_TO_SEC(jam_mulai) / 60
) STORED,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_hari (hari),
INDEX idx_sesi (sesi)
);
-- Tabel Jadwal Kuliah
CREATE TABLE jadwal_kuliah (
id_jadwal INT PRIMARY KEY AUTO_INCREMENT,
id_kelas INT,
id_ruangan INT,
id_slot INT,
semester_aktif VARCHAR(10), -- Format: 2024/1
minggu_efektif INT DEFAULT 16,
tanggal_mulai DATE,
tanggal_selesai DATE,
status_jadwal ENUM('Draft', 'Approved', 'Active', 'Cancelled') DEFAULT 'Draft',
catatan TEXT,
created_by VARCHAR(50),
approved_by VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
approved_at TIMESTAMP NULL,
FOREIGN KEY (id_kelas) REFERENCES kelas(id_kelas) ON DELETE CASCADE,
FOREIGN KEY (id_ruangan) REFERENCES ruangan(id_ruangan) ON DELETE CASCADE,
FOREIGN KEY (id_slot) REFERENCES waktu_slot(id_slot) ON DELETE CASCADE,
UNIQUE KEY unique_schedule (id_ruangan, id_slot, semester_aktif),
INDEX idx_semester (semester_aktif),
INDEX idx_status (status_jadwal)
);
-- Tabel Konflik Jadwal
CREATE TABLE konflik_jadwal (
id_konflik INT PRIMARY KEY AUTO_INCREMENT,
id_jadwal1 INT,
id_jadwal2 INT,
jenis_konflik ENUM('Ruangan', 'Dosen', 'Mahasiswa', 'Waktu') NOT NULL,
deskripsi_konflik TEXT,
tingkat_prioritas ENUM('Low', 'Medium', 'High', 'Critical') DEFAULT 'Medium',
status_resolved BOOLEAN DEFAULT FALSE,
resolved_by VARCHAR(50),
resolved_at TIMESTAMP NULL,
solusi TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_jadwal1) REFERENCES jadwal_kuliah(id_jadwal) ON DELETE CASCADE,
FOREIGN KEY (id_jadwal2) REFERENCES jadwal_kuliah(id_jadwal) ON DELETE CASCADE,
INDEX idx_jenis (jenis_konflik),
INDEX idx_status (status_resolved)
);
-- Tabel Perubahan Jadwal
CREATE TABLE perubahan_jadwal (
id_perubahan INT PRIMARY KEY AUTO_INCREMENT,
id_jadwal INT,
tanggal_perubahan DATE NOT NULL,
jam_mulai_baru TIME,
jam_selesai_baru TIME,
id_ruangan_baru INT,
alasan TEXT NOT NULL,
status_approval ENUM('Pending', 'Approved', 'Rejected') DEFAULT 'Pending',
requested_by VARCHAR(50),
approved_by VARCHAR(50),
notifikasi_sent BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
approved_at TIMESTAMP NULL,
FOREIGN KEY (id_jadwal) REFERENCES jadwal_kuliah(id_jadwal) ON DELETE CASCADE,
FOREIGN KEY (id_ruangan_baru) REFERENCES ruangan(id_ruangan) ON DELETE SET NULL,
INDEX idx_tanggal (tanggal_perubahan),
INDEX idx_status (status_approval)
);
-- Tabel Kehadiran
CREATE TABLE kehadiran (
id_kehadiran INT PRIMARY KEY AUTO_INCREMENT,
id_jadwal INT,
nim VARCHAR(20),
tanggal_kuliah DATE NOT NULL,
waktu_masuk TIME,
waktu_keluar TIME,
status_hadir ENUM('Hadir', 'Terlambat', 'Izin', 'Sakit', 'Alpha') DEFAULT 'Alpha',
catatan VARCHAR(255),
metode_absen ENUM('Manual', 'QR_Code', 'RFID', 'Biometric') DEFAULT 'Manual',
koordinat_gps POINT, -- Untuk absen berbasis lokasi
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_jadwal) REFERENCES jadwal_kuliah(id_jadwal) ON DELETE CASCADE,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
UNIQUE KEY unique_attendance (id_jadwal, nim, tanggal_kuliah),
INDEX idx_tanggal (tanggal_kuliah),
INDEX idx_status (status_hadir)
);
-- Tabel Evaluasi Jadwal
CREATE TABLE evaluasi_jadwal (
id_evaluasi INT PRIMARY KEY AUTO_INCREMENT,
id_jadwal INT,
nim VARCHAR(20),
rating_waktu INT CHECK (rating_waktu >= 1 AND rating_waktu <= 5), rating_ruangan INT CHECK (rating_ruangan >= 1 AND rating_ruangan <= 5),
komentar TEXT,
saran TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_jadwal) REFERENCES jadwal_kuliah(id_jadwal) ON DELETE CASCADE,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
INDEX idx_rating (rating_waktu, rating_ruangan)
);
-- View untuk jadwal lengkap
CREATE VIEW v_jadwal_lengkap AS
SELECT
jk.id_jadwal,
mk.kode_mk,
mk.nama_mk,
mk.sks,
d.nama_dosen,
r.nama_ruangan,
r.kapasitas,
ws.hari,
ws.jam_mulai,
ws.jam_selesai,
jk.semester_aktif,
jk.status_jadwal,
COUNT(n.nim) as jumlah_mahasiswa
FROM jadwal_kuliah jk
JOIN kelas k ON jk.id_kelas = k.id_kelas
JOIN mata_kuliah mk ON k.kode_mk = mk.kode_mk
JOIN dosen d ON k.nip = d.nip
JOIN ruangan r ON jk.id_ruangan = r.id_ruangan
JOIN waktu_slot ws ON jk.id_slot = ws.id_slot
LEFT JOIN nilai n ON k.id_kelas = n.id_kelas
GROUP BY jk.id_jadwal;
Contoh 5: ERD Sistem Keuangan Akademik
ERD untuk sistem keuangan akademik yang mengelola pembayaran SPP, beasiswa, dan transaksi keuangan lainnya.
ERD Sistem Keuangan Akademik
NIM (FK)
Jenis_Tagihan
Jumlah
Jatuh_Tempo
Status
ID_Tagihan (FK)
Jumlah_Bayar
Tanggal_Bayar
Metode_Bayar
Status_Bayar
Nama_Beasiswa
Jenis_Beasiswa
Jumlah_Dana
Periode
Syarat
NIM (FK)
ID_Beasiswa (FK)
Tanggal_Terima
Status_Aktif
IPK_Syarat
SQL Implementation Sistem Keuangan:
-- Tabel Jenis Tagihan
CREATE TABLE jenis_tagihan (
id_jenis_tagihan INT PRIMARY KEY AUTO_INCREMENT,
nama_tagihan VARCHAR(100) NOT NULL,
deskripsi TEXT,
kategori ENUM('SPP', 'Pendaftaran', 'Praktikum', 'Wisuda', 'Lainnya'),
is_wajib BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabel Tagihan
CREATE TABLE tagihan (
id_tagihan INT PRIMARY KEY AUTO_INCREMENT,
nim VARCHAR(20),
id_jenis_tagihan INT,
semester VARCHAR(10),
jumlah_tagihan DECIMAL(12,2) NOT NULL,
tanggal_tagihan DATE NOT NULL,
jatuh_tempo DATE NOT NULL,
denda_per_hari DECIMAL(10,2) DEFAULT 0,
maksimal_denda DECIMAL(12,2) DEFAULT 0,
status_tagihan ENUM('Belum_Bayar', 'Sebagian', 'Lunas', 'Overdue') DEFAULT 'Belum_Bayar',
keterangan TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (id_jenis_tagihan) REFERENCES jenis_tagihan(id_jenis_tagihan) ON DELETE CASCADE,
INDEX idx_status (status_tagihan),
INDEX idx_jatuh_tempo (jatuh_tempo),
INDEX idx_semester (semester)
);
-- Tabel Pembayaran
CREATE TABLE pembayaran (
id_pembayaran INT PRIMARY KEY AUTO_INCREMENT,
id_tagihan INT,
jumlah_bayar DECIMAL(12,2) NOT NULL,
tanggal_bayar TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
metode_bayar ENUM('Tunai', 'Transfer', 'Kartu_Kredit', 'E-Wallet', 'Virtual_Account'),
nomor_referensi VARCHAR(100),
bank_asal VARCHAR(50),
status_bayar ENUM('Pending', 'Success', 'Failed', 'Cancelled') DEFAULT 'Pending',
bukti_bayar VARCHAR(255),
denda_dibayar DECIMAL(10,2) DEFAULT 0,
diskon DECIMAL(10,2) DEFAULT 0,
keterangan_diskon VARCHAR(255),
petugas_kasir VARCHAR(50),
verified_at TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_tagihan) REFERENCES tagihan(id_tagihan) ON DELETE CASCADE,
INDEX idx_status (status_bayar),
INDEX idx_tanggal (tanggal_bayar),
INDEX idx_referensi (nomor_referensi)
);
-- Tabel Beasiswa
CREATE TABLE beasiswa (
id_beasiswa INT PRIMARY KEY AUTO_INCREMENT,
nama_beasiswa VARCHAR(100) NOT NULL,
jenis_beasiswa ENUM('Prestasi', 'Ekonomi', 'Daerah', 'Pemerintah', 'Swasta'),
pemberi_beasiswa VARCHAR(100),
jumlah_dana DECIMAL(12,2) NOT NULL,
periode_mulai DATE,
periode_selesai DATE,
kuota_penerima INT,
syarat_ipk DECIMAL(3,2),
syarat_semester INT,
syarat_lainnya TEXT,
status_beasiswa ENUM('Aktif', 'Nonaktif', 'Selesai') DEFAULT 'Aktif',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_jenis (jenis_beasiswa),
INDEX idx_status (status_beasiswa)
);
-- Tabel Penerima Beasiswa
CREATE TABLE penerima_beasiswa (
id_penerima INT PRIMARY KEY AUTO_INCREMENT,
nim VARCHAR(20),
id_beasiswa INT,
tanggal_terima DATE NOT NULL,
periode_penerimaan VARCHAR(20), -- '2024/1', '2024/2'
jumlah_diterima DECIMAL(12,2),
ipk_saat_terima DECIMAL(3,2),
semester_saat_terima INT,
status_penerima ENUM('Aktif', 'Selesai', 'Dicabut') DEFAULT 'Aktif',
alasan_pencabutan TEXT,
dokumen_pendukung JSON, -- {"ktp": "path", "kk": "path", "slip_gaji": "path"}
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (nim) REFERENCES mahasiswa(nim) ON DELETE CASCADE,
FOREIGN KEY (id_beasiswa) REFERENCES beasiswa(id_beasiswa) ON DELETE CASCADE,
UNIQUE KEY unique_penerima_periode (nim, id_beasiswa, periode_penerimaan),
INDEX idx_status (status_penerima),
INDEX idx_periode (periode_penerimaan)
);
-- Tabel Cicilan Pembayaran
CREATE TABLE cicilan_pembayaran (
id_cicilan INT PRIMARY KEY AUTO_INCREMENT,
id_tagihan INT,
cicilan_ke INT NOT NULL,
jumlah_cicilan DECIMAL(12,2) NOT NULL,
jatuh_tempo_cicilan DATE NOT NULL,
status_cicilan ENUM('Belum_Bayar', 'Lunas', 'Terlambat') DEFAULT 'Belum_Bayar',
tanggal_bayar_cicilan DATE NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_tagihan) REFERENCES tagihan(id_tagihan) ON DELETE CASCADE,
INDEX idx_status (status_cicilan),
INDEX idx_jatuh_tempo (jatuh_tempo_cicilan)
);
-- Tabel Laporan Keuangan
CREATE TABLE laporan_keuangan (
id_laporan INT PRIMARY KEY AUTO_INCREMENT,
periode VARCHAR(10), -- '2024/1'
total_tagihan DECIMAL(15,2),
total_pembayaran DECIMAL(15,2),
total_tunggakan DECIMAL(15,2),
total_beasiswa DECIMAL(15,2),
jumlah_mahasiswa_aktif INT,
jumlah_mahasiswa_menunggak INT,
tanggal_generate DATE,
generated_by VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_periode (periode)
);
-- View untuk ringkasan keuangan mahasiswa
CREATE VIEW v_ringkasan_keuangan_mahasiswa AS
SELECT
m.nim,
m.nama_mahasiswa,
j.nama_jurusan,
COALESCE(SUM(CASE WHEN t.status_tagihan != 'Lunas' THEN t.jumlah_tagihan ELSE 0 END), 0) as total_tunggakan,
COALESCE(SUM(p.jumlah_bayar), 0) as total_pembayaran,
COALESCE(SUM(pb.jumlah_diterima), 0) as total_beasiswa,
COUNT(DISTINCT CASE WHEN t.status_tagihan != 'Lunas' THEN t.id_tagihan END) as jumlah_tagihan_belum_lunas
FROM mahasiswa m
LEFT JOIN jurusan j ON m.id_jurusan = j.id_jurusan
LEFT JOIN tagihan t ON m.nim = t.nim
LEFT JOIN pembayaran p ON t.id_tagihan = p.id_tagihan AND p.status_bayar = 'Success'
LEFT JOIN penerima_beasiswa pb ON m.nim = pb.nim AND pb.status_penerima = 'Aktif'
GROUP BY m.nim;
Contoh 6: ERD Sistem Manajemen Penelitian
ERD untuk sistem manajemen penelitian akademik yang mencakup proposal, publikasi, dan kolaborasi penelitian.
ERD Sistem Manajemen Penelitian
Judul_Penelitian
Abstrak
Bidang_Penelitian
Status
Tanggal_Mulai
ID_Penelitian (FK)
NIP (FK)
Peran
Kontribusi
Status_Aktif
ID_Penelitian (FK)
Judul_Publikasi
Jurnal
Tahun_Terbit
Impact_Factor
ID_Penelitian (FK)
Sumber_Dana
Jumlah_Dana
Periode
Status_Pencairan
ID_Penelitian (FK)
Periode_Laporan
Progress_Persen
Kendala
Rencana_Selanjutnya
ID_Penelitian (FK)
Institusi_Partner
Jenis_Kolaborasi
MOU_File
Status_Kolaborasi
SQL Implementation Sistem Penelitian:
-- Tabel Bidang Penelitian
CREATE TABLE bidang_penelitian (
id_bidang INT PRIMARY KEY AUTO_INCREMENT,
nama_bidang VARCHAR(100) NOT NULL,
deskripsi TEXT,
kategori ENUM('Sains', 'Teknologi', 'Sosial', 'Humaniora', 'Kesehatan'),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabel Penelitian
CREATE TABLE penelitian (
id_penelitian INT PRIMARY KEY AUTO_INCREMENT,
judul_penelitian VARCHAR(255) NOT NULL,
abstrak TEXT,
id_bidang INT,
jenis_penelitian ENUM('Dasar', 'Terapan', 'Pengembangan', 'Evaluasi'),
tingkat_penelitian ENUM('Lokal', 'Nasional', 'Internasional'),
tanggal_mulai DATE,
tanggal_selesai_rencana DATE,
tanggal_selesai_aktual DATE,
status_penelitian ENUM('Proposal', 'Berjalan', 'Selesai', 'Ditunda', 'Dibatalkan') DEFAULT 'Proposal',
luaran_target TEXT, -- Target publikasi, paten, dll
keyword_penelitian JSON, -- ["machine learning", "data mining", "AI"]
metodologi TEXT,
ketua_peneliti VARCHAR(20), -- NIP
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (id_bidang) REFERENCES bidang_penelitian(id_bidang) ON DELETE SET NULL,
FOREIGN KEY (ketua_peneliti) REFERENCES dosen(nip) ON DELETE SET NULL,
INDEX idx_status (status_penelitian),
INDEX idx_bidang (id_bidang),
INDEX idx_tanggal (tanggal_mulai)
);
-- Tabel Tim Peneliti
CREATE TABLE tim_peneliti (
id_tim INT PRIMARY KEY AUTO_INCREMENT,
id_penelitian INT,
nip VARCHAR(20),
peran ENUM('Ketua', 'Anggota', 'Mahasiswa', 'Konsultan', 'Teknisi'),
kontribusi_persen DECIMAL(5,2) DEFAULT 0,
tugas_spesifik TEXT,
status_aktif BOOLEAN DEFAULT TRUE,
tanggal_bergabung DATE,
tanggal_keluar DATE NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_penelitian) REFERENCES penelitian(id_penelitian) ON DELETE CASCADE,
FOREIGN KEY (nip) REFERENCES dosen(nip) ON DELETE CASCADE,
INDEX idx_peran (peran),
INDEX idx_status (status_aktif)
);
-- Tabel Publikasi
CREATE TABLE publikasi (
id_publikasi INT PRIMARY KEY AUTO_INCREMENT,
id_penelitian INT,
judul_publikasi VARCHAR(255) NOT NULL,
jenis_publikasi ENUM('Jurnal', 'Konferensi', 'Buku', 'Paten', 'Prosiding'),
nama_jurnal VARCHAR(200),
penerbit VARCHAR(100),
issn_isbn VARCHAR(20),
volume VARCHAR(10),
nomor VARCHAR(10),
halaman VARCHAR(20),
tahun_terbit YEAR,
impact_factor DECIMAL(5,3),
quartile ENUM('Q1', 'Q2', 'Q3', 'Q4'),
url_publikasi VARCHAR(500),
doi VARCHAR(100),
status_publikasi ENUM('Draft', 'Submitted', 'Under_Review', 'Accepted', 'Published', 'Rejected'),
tanggal_submit DATE,
tanggal_terbit DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_penelitian) REFERENCES penelitian(id_penelitian) ON DELETE CASCADE,
INDEX idx_jenis (jenis_publikasi),
INDEX idx_status (status_publikasi),
INDEX idx_tahun (tahun_terbit)
);
-- Tabel Dana Penelitian
CREATE TABLE dana_penelitian (
id_dana INT PRIMARY KEY AUTO_INCREMENT,
id_penelitian INT,
sumber_dana ENUM('Internal', 'DIKTI', 'Kemenristek', 'Industri', 'Luar_Negeri', 'Lainnya'),
nama_pemberi_dana VARCHAR(100),
skema_dana VARCHAR(100), -- 'Hibah Penelitian Dasar', 'PDUPT', dll
jumlah_dana DECIMAL(15,2) NOT NULL,
mata_uang VARCHAR(3) DEFAULT 'IDR',
periode_dana VARCHAR(20), -- '2024-2026'
tanggal_kontrak DATE,
tanggal_mulai_dana DATE,
tanggal_selesai_dana DATE,
status_pencairan ENUM('Belum', 'Sebagian', 'Lunas') DEFAULT 'Belum',
jumlah_tercair DECIMAL(15,2) DEFAULT 0,
nomor_kontrak VARCHAR(100),
file_kontrak VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_penelitian) REFERENCES penelitian(id_penelitian) ON DELETE CASCADE,
INDEX idx_sumber (sumber_dana),
INDEX idx_status (status_pencairan)
);
-- Tabel Laporan Kemajuan
CREATE TABLE laporan_kemajuan (
id_laporan INT PRIMARY KEY AUTO_INCREMENT,
id_penelitian INT,
periode_laporan VARCHAR(20), -- 'Tahun 1 Semester 1'
tanggal_laporan DATE,
progress_persen DECIMAL(5,2) CHECK (progress_persen >= 0 AND progress_persen <= 100),
capaian_luaran TEXT,
kendala TEXT,
solusi_kendala TEXT,
rencana_selanjutnya TEXT,
anggaran_terpakai DECIMAL(12,2),
file_laporan VARCHAR(255),
status_review ENUM('Draft', 'Submitted', 'Under_Review', 'Approved', 'Revision_Required'),
reviewer VARCHAR(20), -- NIP reviewer
catatan_reviewer TEXT,
tanggal_review DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_penelitian) REFERENCES penelitian(id_penelitian) ON DELETE CASCADE,
FOREIGN KEY (reviewer) REFERENCES dosen(nip) ON DELETE SET NULL,
INDEX idx_periode (periode_laporan),
INDEX idx_status (status_review)
);
-- Tabel Kolaborasi
CREATE TABLE kolaborasi (
id_kolaborasi INT PRIMARY KEY AUTO_INCREMENT,
id_penelitian INT,
institusi_partner VARCHAR(200) NOT NULL,
negara_partner VARCHAR(50),
jenis_kolaborasi ENUM('Penelitian_Bersama', 'Pertukaran_Peneliti', 'Sharing_Fasilitas', 'Joint_Publication'),
contact_person VARCHAR(100),
email_contact VARCHAR(100),
mou_file VARCHAR(255),
tanggal_mou DATE,
tanggal_mulai_kolaborasi DATE,
tanggal_selesai_kolaborasi DATE,
status_kolaborasi ENUM('Proposal', 'Negosiasi', 'Aktif', 'Selesai', 'Dibatalkan') DEFAULT 'Proposal',
benefit_kolaborasi TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_penelitian) REFERENCES penelitian(id_penelitian) ON DELETE CASCADE,
INDEX idx_status (status_kolaborasi),
INDEX idx_negara (negara_partner)
);
-- View untuk dashboard penelitian
CREATE VIEW v_dashboard_penelitian AS
SELECT
p.id_penelitian,
p.judul_penelitian,
bp.nama_bidang,
d.nama_dosen as ketua_peneliti,
p.status_penelitian,
p.tanggal_mulai,
p.tanggal_selesai_rencana,
COUNT(DISTINCT tp.nip) as jumlah_anggota,
COUNT(DISTINCT pub.id_publikasi) as jumlah_publikasi,
COALESCE(SUM(dp.jumlah_dana), 0) as total_dana,
AVG(lk.progress_persen) as rata_rata_progress
FROM penelitian p
LEFT JOIN bidang_penelitian bp ON p.id_bidang = bp.id_bidang
LEFT JOIN dosen d ON p.ketua_peneliti = d.nip
LEFT JOIN tim_peneliti tp ON p.id_penelitian = tp.id_penelitian AND tp.status_aktif = TRUE
LEFT JOIN publikasi pub ON p.id_penelitian = pub.id_penelitian
LEFT JOIN dana_penelitian dp ON p.id_penelitian = dp.id_penelitian
LEFT JOIN laporan_kemajuan lk ON p.id_penelitian = lk.id_penelitian
GROUP BY p.id_penelitian;
Best Practices Perancangan ERD Sistem Akademik
✅ Do’s (Yang Harus Dilakukan)
- Identifikasi semua stakeholder dan kebutuhan mereka
- Gunakan naming convention yang konsisten dan deskriptif
- Terapkan normalisasi database untuk menghindari redundansi
- Buat foreign key constraints untuk menjaga integritas data
- Dokumentasikan setiap entitas dan relationship dengan jelas
- Pertimbangkan scalability dan performance dari awal
- Implementasikan audit trail untuk tracking perubahan data
❌ Don’ts (Yang Harus Dihindari)
- Jangan membuat ERD tanpa analisis kebutuhan yang mendalam
- Hindari over-normalization yang dapat menurunkan performance
- Jangan mengabaikan constraint dan validation rules
- Hindari penggunaan composite key yang terlalu kompleks
- Jangan lupakan indexing untuk kolom yang sering di-query
- Hindari hardcode values, gunakan lookup tables
- Jangan mengabaikan backup dan recovery strategy
Panduan Implementasi ERD ke Database
🔧 Tahap Implementasi
- Analisis dan validasi ERD
- Konversi ERD ke physical design
- Pembuatan script DDL (CREATE TABLE)
- Implementasi constraints dan indexes
- Testing dan validasi struktur
- Data migration (jika ada)
- Performance tuning
⚡ Optimasi Performance
- Buat index pada foreign keys
- Gunakan composite index untuk query kompleks
- Partitioning untuk tabel besar
- Implementasi caching strategy
- Query optimization dan execution plan analysis
- Regular maintenance dan statistics update
Kesalahan Umum dalam ERD Sistem Akademik
⚠️ Many-to-Many Relationship Tidak Diresolved
Masalah: Membiarkan M:N relationship tanpa junction table
Solusi: Selalu buat junction table untuk M:N dengan atribut tambahan jika diperlukan
⚠️ Normalisasi Tidak Optimal
Masalah: Data redundancy atau over-normalization
Solusi: Terapkan normalisasi hingga 3NF, denormalisasi hanya jika diperlukan untuk performance
⚠️ Kurang Mempertimbangkan Historical Data
Masalah: Tidak menyimpan history perubahan data penting
Solusi: Implementasikan audit tables atau temporal tables untuk tracking changes
Frequently Asked Questions (FAQ)
Bagaimana cara menentukan primary key yang tepat untuk entitas mahasiswa?
Untuk entitas mahasiswa, gunakan NIM (Nomor Induk Mahasiswa) sebagai primary key karena bersifat unik, tidak berubah, dan sudah menjadi standar identifikasi. Hindari menggunakan nama atau email sebagai PK karena bisa berubah. Jika sistem belum memiliki NIM, buat auto-increment ID sebagai surrogate key.
Kapan harus menggunakan weak entity dalam ERD sistem akademik?
Gunakan weak entity ketika entitas tidak bisa exist secara independen tanpa entitas lain. Contoh: entitas “Nilai” adalah weak entity yang bergantung pada “Mahasiswa” dan “Mata Kuliah”. Weak entity biasanya menggunakan composite key yang mencakup foreign key dari strong entity.
Bagaimana menangani relationship ternary dalam sistem akademik?
Relationship ternary seperti “Mahasiswa-Dosen-Mata Kuliah” dalam konteks bimbingan skripsi sebaiknya dikonversi menjadi entitas tersendiri (misalnya “Bimbingan”) dengan relationship binary ke masing-masing entitas. Ini memberikan fleksibilitas lebih untuk menambah atribut dan constraint.
Bagaimana cara mendesain ERD untuk sistem yang mendukung multiple semester dan tahun akademik?
Buat entitas “Periode Akademik” atau “Semester” sebagai entitas terpisah dengan atribut tahun, semester (ganjil/genap), status (aktif/nonaktif). Kemudian reference periode ini di entitas yang time-dependent seperti “Kelas”, “Nilai”, dan “Jadwal”. Ini memungkinkan historical data dan fleksibilitas dalam manajemen periode akademik.
Apakah perlu membuat ERD terpisah untuk setiap modul dalam sistem akademik?
Untuk sistem besar, buat ERD modular: ERD overview untuk gambaran keseluruhan, kemudian ERD detail untuk setiap subsistem (akademik, keuangan, perpustakaan, dll). Pastikan konsistensi entitas yang shared antar modul. Gunakan tools seperti database schema versioning untuk maintain consistency across modules.
Kesimpulan
Perancangan ERD sistem informasi akademik memerlukan pemahaman mendalam tentang proses bisnis institusi pendidikan. Dari contoh-contoh yang telah dibahas, kita dapat melihat kompleksitas dan keterkaitan antar entitas dalam ekosistem akademik.
ERD yang baik harus mempertimbangkan scalability, maintainability, dan performance. Implementasi yang tepat akan menghasilkan sistem yang robust, efisien, dan dapat beradaptasi dengan perubahan kebutuhan institusi.
Kunci sukses dalam merancang ERD adalah iterasi berkelanjutan, validasi dengan stakeholder, dan testing menyeluruh sebelum implementasi production. Dengan foundation ERD yang solid, pengembangan sistem informasi akademik akan lebih terarah dan sustainable.