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_idstudent_name Tabel classrooms: classroom_idclassroom_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. :::