Post 10: Apa itu Normalisasi pada ERD
Apa itu Normalisasi pada ERD?
Normalisasi adalah proses mengorganisir data dalam database untuk mengurangi redundansi (duplikasi data) dan meningkatkan integritas data. Dalam konteks ERD (Entity Relationship Diagram), normalisasi membantu kita merancang struktur database yang efisien dengan memecah tabel-tabel besar menjadi tabel-tabel yang lebih kecil dan terstruktur dengan baik.
Tujuan Normalisasi
- Menghilangkan redundansi data - Mengurangi duplikasi data yang tidak perlu
- Mencegah anomali data - Anomali insert, update, dan delete
- Meningkatkan integritas data - Data menjadi lebih konsisten
- Mengoptimalkan storage - Menghemat ruang penyimpanan
- Mempermudah maintenance - Database lebih mudah dikelola
- Meningkatkan performa query - Query menjadi lebih efisien
Anomali Data yang Terjadi Tanpa Normalisasi
1. Insert Anomaly (Anomali Penyisipan)
Tidak dapat menambahkan data baru tanpa informasi lengkap dari entitas lain.
Contoh: Tidak bisa menambah data mata kuliah baru jika belum ada mahasiswa yang mengambilnya.
2. Update Anomaly (Anomali Pembaruan)
Harus mengubah data di banyak tempat ketika ada perubahan, jika tidak konsisten akan terjadi inkonsistensi data.
Contoh: Jika nama jurusan berubah, harus update di semua record mahasiswa yang ada di jurusan tersebut.
3. Delete Anomaly (Anomali Penghapusan)
Menghapus data dapat menghilangkan informasi penting lainnya.
Contoh: Menghapus mahasiswa terakhir dari suatu mata kuliah dapat menghilangkan informasi tentang mata kuliah tersebut.
Bentuk Normal (Normal Forms)
1. First Normal Form (1NF) - Bentuk Normal Pertama
Aturan 1NF:
- Setiap kolom hanya berisi nilai atomic (tidak dapat dibagi lagi)
- Tidak boleh ada repeated groups (kelompok data yang berulang)
- Setiap kolom harus memiliki nama yang unik
- Urutan data tidak penting
❌ Contoh Tabel yang TIDAK memenuhi 1NF
| NIM | Nama | Mata_Kuliah | Nilai |
|---|---|---|---|
| 24416255201003 | Gilang Ramadhan | Basis Data, Web Programming | A, B |
Masalah: Kolom Mata_Kuliah dan Nilai berisi multiple values (tidak atomic)
✅ Tabel yang MEMENUHI 1NF
| NIM | Nama | Mata_Kuliah | Nilai |
|---|---|---|---|
| 24416255201003 | Gilang Ramadhan | Basis Data | A |
| 24416255201003 | Gilang Ramadhan | Web Programming | B |
Solusi: Setiap baris sekarang memiliki satu nilai per kolom (atomic)
2. Second Normal Form (2NF) - Bentuk Normal Kedua
Aturan 2NF:
- Harus sudah memenuhi 1NF
- Semua atribut non-key harus bergantung penuh pada primary key (tidak boleh partial dependency)
- Berlaku untuk tabel dengan composite primary key
❌ Contoh Tabel yang TIDAK memenuhi 2NF
| NIM | Kode_MK | Nama_Mahasiswa | Nama_MK | Nilai |
|---|---|---|---|---|
| 24416255201003 | TI101 | Gilang Ramadhan | Basis Data | A |
| 24416255201003 | TI102 | Gilang Ramadhan | Web Programming | B |
Masalah:
- Primary Key: (NIM, Kode_MK)
- Nama_Mahasiswa hanya bergantung pada NIM (partial dependency)
- Nama_MK hanya bergantung pada Kode_MK (partial dependency)
✅ Tabel yang MEMENUHI 2NF - Dipecah menjadi 3 tabel
Tabel MAHASISWA
| NIM (PK) | Nama_Mahasiswa |
|---|---|
| 24416255201003 | Gilang Ramadhan |
Tabel MATA_KULIAH
| Kode_MK (PK) | Nama_MK |
|---|---|
| TI101 | Basis Data |
| TI102 | Web Programming |
Tabel KRS
| NIM (FK) | Kode_MK (FK) | Nilai |
|---|---|---|
| 24416255201003 | TI101 | A |
| 24416255201003 | TI102 | B |
CREATE TABLE mahasiswa (
nim VARCHAR(15) PRIMARY KEY,
nama_mahasiswa VARCHAR(100)
);
CREATE TABLE mata_kuliah (
kode_mk VARCHAR(10) PRIMARY KEY,
nama_mk VARCHAR(100)
);
CREATE TABLE krs (
nim VARCHAR(15),
kode_mk VARCHAR(10),
nilai CHAR(2),
PRIMARY KEY (nim, kode_mk),
FOREIGN KEY (nim) REFERENCES mahasiswa(nim),
FOREIGN KEY (kode_mk) REFERENCES mata_kuliah(kode_mk)
);
3. Third Normal Form (3NF) - Bentuk Normal Ketiga
Aturan 3NF:
- Harus sudah memenuhi 2NF
- Tidak boleh ada transitive dependency (atribut non-key bergantung pada atribut non-key lain)
- Semua atribut non-key harus bergantung langsung pada primary key
❌ Contoh Tabel yang TIDAK memenuhi 3NF
| NIM | Nama | Kode_Jurusan | Nama_Jurusan | Gedung |
|---|---|---|---|---|
| 24416255201003 | Gilang | TI | Teknik Informatika | Gedung A |
| 24416255201004 | Budi | TI | Teknik Informatika | Gedung A |
Masalah:
- Primary Key: NIM
- Nama_Jurusan bergantung pada Kode_Jurusan (bukan NIM)
- Gedung bergantung pada Kode_Jurusan (bukan NIM)
- Ini adalah transitive dependency: NIM → Kode_Jurusan → Nama_Jurusan
✅ Tabel yang MEMENUHI 3NF - Dipecah menjadi 2 tabel
Tabel JURUSAN
| Kode_Jurusan (PK) | Nama_Jurusan | Gedung |
|---|---|---|
| TI | Teknik Informatika | Gedung A |
Tabel MAHASISWA
| NIM (PK) | Nama | Kode_Jurusan (FK) |
|---|---|---|
| 24416255201003 | Gilang | TI |
| 24416255201004 | Budi | TI |
CREATE TABLE jurusan (
kode_jurusan VARCHAR(5) PRIMARY KEY,
nama_jurusan VARCHAR(100),
gedung VARCHAR(50)
);
CREATE TABLE mahasiswa (
nim VARCHAR(15) PRIMARY KEY,
nama VARCHAR(100),
kode_jurusan VARCHAR(5),
FOREIGN KEY (kode_jurusan) REFERENCES jurusan(kode_jurusan)
);
Keuntungan:
- ✅ Tidak ada redundansi data Nama_Jurusan dan Gedung
- ✅ Update nama jurusan hanya di satu tempat
- ✅ Bisa menambah jurusan baru tanpa harus ada mahasiswa
Perbandingan: Sebelum vs Sesudah Normalisasi
Studi Kasus: Sistem Akademik Kampus
❌ SEBELUM Normalisasi (Tidak Normal)
| NIM | Nama | Jurusan | Gedung | MK1 | Nilai1 | MK2 | Nilai2 |
|---|---|---|---|---|---|---|---|
| 001 | Gilang | TI | A | Basis Data | A | Web | B |
Masalah:
- Repeated groups (MK1, MK2, dst)
- Redundansi data Jurusan dan Gedung
- Sulit menambah mata kuliah baru
- Waste storage space
✅ SESUDAH Normalisasi (3NF)
JURUSAN ← 1:N → MAHASISWA ← 1:N → KRS ← N:1 → MATA_KULIAH
4 Tabel Terpisah:
- JURUSAN (kode_jurusan, nama_jurusan, gedung)
- MAHASISWA (nim, nama, kode_jurusan)
- MATA_KULIAH (kode_mk, nama_mk, sks)
- KRS (nim, kode_mk, semester, nilai)
Keuntungan:
- ✅ Tidak ada redundansi data
- ✅ Mudah maintenance
- ✅ Fleksibel menambah data baru
- ✅ Integritas data terjaga
Kapan Menggunakan Denormalisasi?
Meskipun normalisasi penting, kadang kita perlu melakukan denormalisasi (sengaja menambah redundansi) untuk:
- Meningkatkan performa read: Mengurangi JOIN yang kompleks
- Data warehouse: Untuk reporting dan analytics
- Caching: Menyimpan data yang sering diakses
- Read-heavy application: Aplikasi dengan banyak query SELECT
Pertimbangan: Denormalisasi meningkatkan kompleksitas maintenance dan risiko inkonsistensi data.
Langkah-langkah Normalisasi pada ERD
Step-by-Step Normalisasi:
- Identifikasi entitas: Tentukan objek-objek utama dalam sistem
- Terapkan 1NF: Pastikan semua attribute atomic dan tidak ada repeated groups
- Terapkan 2NF: Hilangkan partial dependency dengan memecah tabel
- Terapkan 3NF: Hilangkan transitive dependency
- Buat ERD: Gambarkan relasi antar entitas yang sudah dinormalisasi
- Validasi: Pastikan tidak ada anomali data
- Implementasi: Buat DDL SQL dari ERD yang sudah dinormalisasi
Best Practices Normalisasi
✅ Do's:
- Selalu mulai dengan 1NF sebelum ke normal form selanjutnya
- Dokumentasikan alasan setiap keputusan normalisasi
- Gunakan naming convention yang konsisten
- Buat foreign key constraints untuk integritas referensial
- Test dengan data sample untuk memastikan tidak ada anomali
❌ Don'ts:
- Jangan over-normalize hingga performa menurun drastis
- Jangan lupakan business requirements
- Jangan normalisasi tanpa memahami query patterns
- Jangan abaikan performa untuk mencapai 3NF
Kesimpulan
Normalisasi adalah teknik fundamental dalam desain database yang membantu menciptakan struktur data yang efisien, konsisten, dan mudah dimaintain. Dengan memahami 1NF, 2NF, dan 3NF, Anda dapat merancang ERD yang baik dan menghindarkan database dari anomali data. Normalisasi adalah keseimbangan antara efisiensi storage, integritas data, dan performa query. Tonton video tutorial di atas untuk pemahaman yang lebih mendalam tentang normalisasi database!