Lewati ke konten utama

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​

idstudent_nameskills
1AndiMatematika, Fisika, Kimia
2BudiBahasa Inggris

❌ Kolom skills menyimpan banyak nilai → tidak atomik

Solusi 1NF: Tabel student_skills​

idstudent_idskill_id
111 (Matematika)
212 (Fisika)
313 (Kimia)
424 (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_idclassroom_idstudent_nameclassroom_name
110AndiXII 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​

idstudent_idsubject_idsubject_nametopic_idtopic_name
152Matematika8Integral

❌ subject_name bergantung pada subject_id (bukan id) ❌ topic_name bergantung pada topic_id (bukan id)

Solusi 3NF: Tabel Referensi Terpisah​

SebelumSesudah
requests menyimpan nama mata pelajaranrequests menyimpan subject_id → join ke subjects
requests menyimpan nama materirequests menyimpan topic_id → join ke topics
students menyimpan nama kelasstudents menyimpan classroom_id → join ke classrooms
users menyimpan nama sekolahusers menyimpan school_id → join ke schools

✅ Tidak ada transitive dependency


Hasil Normalisasi​

Bentuk NormalStatusKeterangan
1NF✅ TerpenuhiSemua kolom atomik, tabel pivot untuk relasi M-to-M
2NF✅ TerpenuhiTidak ada partial dependency
3NF✅ TerpenuhiTidak ada transitive dependency

Denormalisasi Terkontrol​

Untuk performa query yang lebih baik, beberapa denormalisasi terkontrol diterapkan pada kolom agregat:

KolomLokasiAlasan
sis_scorestudentsHindari hitung ulang SIS setiap query
xpstudentsCounter cepat untuk leaderboard
average_ratingstudentsHindari AVG() berulang pada tabel ratings
total_sessions_as_tutorstudentsCounter statistik profil

:::note Catatan Kolom denormalisasi diperbarui secara otomatis via Laravel Observer setiap kali data terkait berubah, sehingga konsistensi tetap terjaga. :::