BAB 27. NORMALISASI DATABASE
Pendahuluan
Database TemuBelajar dinormalisasi hingga Third Normal Form (3NF) untuk menghilangkan redundansi data, menjaga konsistensi, dan memudahkan pemeliharaan jangka panjang.
First Normal Form (1NF)
Aturan
Setiap kolom hanya menyimpan satu nilai atomik — tidak ada kolom yang menyimpan daftar atau nilai berulang.
Masalah Sebelum 1NF
| id | student_name | skills |
|---|---|---|
| 1 | Andi | Matematika, Fisika, Kimia |
| 2 | Budi | Bahasa Inggris |
❌ Kolom skills menyimpan banyak nilai → tidak atomik
Solusi 1NF: Tabel student_skills
| id | student_id | skill_id |
|---|---|---|
| 1 | 1 | 1 (Matematika) |
| 2 | 1 | 2 (Fisika) |
| 3 | 1 | 3 (Kimia) |
| 4 | 2 | 4 (Bahasa Inggris) |
✅ Setiap baris menyimpan satu nilai per kolom
Second Normal Form (2NF)
Aturan
Semua kolom non-key harus bergantung penuh pada seluruh primary key (bukan sebagian).
Masalah Sebelum 2NF
Jika sebuah tabel memiliki composite key (student_id, classroom_id):
| student_id | classroom_id | student_name | classroom_name |
|---|---|---|---|
| 1 | 10 | Andi | XII IPA 1 |
❌ student_name hanya bergantung pada student_id — bukan seluruh composite key
❌ classroom_name hanya bergantung pada classroom_id
Solusi 2NF: Pisahkan ke Tabel Terpisah
Tabel students: student_id → student_name
Tabel classrooms: classroom_id → classroom_name
✅ Tidak ada ketergantungan parsial
Third Normal Form (3NF)
Aturan
Tidak ada kolom non-key yang bergantung pada kolom non-key lainnya (transitive dependency).
Masalah Sebelum 3NF
| id | student_id | subject_id | subject_name | topic_id | topic_name |
|---|---|---|---|---|---|
| 1 | 5 | 2 | Matematika | 8 | Integral |
❌ subject_name bergantung pada subject_id (bukan id)
❌ topic_name bergantung pada topic_id (bukan id)
Solusi 3NF: Tabel Referensi Terpisah
| Sebelum | Sesudah |
|---|---|
requests menyimpan nama mata pelajaran | requests menyimpan subject_id → join ke subjects |
requests menyimpan nama materi | requests menyimpan topic_id → join ke topics |
students menyimpan nama kelas | students menyimpan classroom_id → join ke classrooms |
users menyimpan nama sekolah | users menyimpan school_id → join ke schools |
✅ Tidak ada transitive dependency
Hasil Normalisasi
| Bentuk Normal | Status | Keterangan |
|---|---|---|
| 1NF | ✅ Terpenuhi | Semua kolom atomik, tabel pivot untuk relasi M-to-M |
| 2NF | ✅ Terpenuhi | Tidak ada partial dependency |
| 3NF | ✅ Terpenuhi | Tidak ada transitive dependency |
Denormalisasi Terkontrol
Untuk performa query yang lebih baik, beberapa denormalisasi terkontrol diterapkan pada kolom agregat:
| Kolom | Lokasi | Alasan |
|---|---|---|
sis_score | students | Hindari hitung ulang SIS setiap query |
xp | students | Counter cepat untuk leaderboard |
average_rating | students | Hindari AVG() berulang pada tabel ratings |
total_sessions_as_tutor | students | Counter statistik profil |
:::note Catatan Kolom denormalisasi diperbarui secara otomatis via Laravel Observer setiap kali data terkait berubah, sehingga konsistensi tetap terjaga. :::