Normalisasi 1NF, 2NF, 3NF: Contoh Soal dari Tabel KRS sampai 3NF
Contoh soal normalisasi database 1NF, 2NF, 3NF dari tabel KRS mentah: dependensi fungsional, kunci komposit, isi tabel tiap tahap, dan anomali yang hilang.

Di halaman ini
- Tabel KRS mentah yang akan dinormalisasi
- Bagaimana mengubah tabel ke 1NF?
- Cara menulis dependensi fungsional dan menentukan kunci
- Langkah ke 2NF: memisahkan dependensi parsial
- Langkah ke 3NF: memisahkan dependensi transitif
- Anomali apa yang hilang setelah normalisasi?
- Kesalahan yang sering terjadi di soal normalisasi
- FAQ
- Apakah tabel 3NF di contoh ini juga sudah BCNF?
- Bagaimana kalau mahasiswa mengulang mata kuliah yang sama?
- Bagaimana kalau satu mata kuliah diampu lebih dari satu dosen?
- Apakah IPK perlu disimpan sebagai kolom di tabel MAHASISWA?
- Apakah semua tabel harus dinormalisasi sampai 3NF?
Normalisasi database 1NF, 2NF, dan 3NF dikerjakan dengan tiga langkah berurutan: pecah sel yang berisi banyak nilai (1NF), pisahkan atribut yang hanya bergantung pada sebagian kunci komposit (2NF), lalu pisahkan atribut yang bergantung pada atribut bukan kunci (3NF). Kuncinya ada di daftar dependensi fungsional. Kalau daftar itu benar, pemecahan tabelnya hampir mekanis. Contoh soal di bawah memakai satu tabel KRS dan nilai mahasiswa yang dibawa sampai 3NF, dengan isi tabel ditulis di setiap tahap.
Tabel KRS mentah yang akan dinormalisasi
Bagian akademik sebuah kampus mencatat KRS dan nilai satu semester di satu lembar seperti ini:
| NIM | NamaMhs | KodeProdi | NamaProdi | Mata kuliah yang diambil |
|---|---|---|---|---|
| 2201001 | Rina Putri | SI | Sistem Informasi | IF201 Basis Data, 3 SKS, D01 Budi Santoso, nilai A; IF202 Struktur Data, 3 SKS, D02 Sari Dewi, nilai B |
| 2201002 | Andi Saputra | TI | Teknik Informatika | IF201 Basis Data, 3 SKS, D01 Budi Santoso, nilai B; MA101 Kalkulus I, 3 SKS, D03 Hadi Prasetyo, nilai C |
| 2201003 | Dewi Lestari | SI | Sistem Informasi | IF202 Struktur Data, 3 SKS, D02 Sari Dewi, nilai A |
Aturan bisnis yang berlaku: satu mata kuliah diampu satu dosen, satu mahasiswa punya satu prodi, dan nilai dicatat per mahasiswa per mata kuliah. Aturan ini penting, karena dependensi fungsional diturunkan dari aturan bisnis, bukan dari data contoh yang kebetulan ada.
Bagaimana mengubah tabel ke 1NF?
Tabel memenuhi 1NF kalau setiap sel berisi satu nilai (atomik), tidak ada kelompok kolom yang berulang, dan setiap baris bisa dibedakan dengan kunci. Kolom "Mata kuliah yang diambil" melanggar aturan pertama karena satu sel memuat dua mata kuliah sekaligus.
Perbaikannya: satu baris untuk satu mata kuliah yang diambil satu mahasiswa, dan setiap informasi mata kuliah diberi kolom sendiri.
| NIM | NamaMhs | KodeProdi | NamaProdi | KodeMK | NamaMK | SKS | KodeDosen | NamaDosen | Nilai |
|---|---|---|---|---|---|---|---|---|---|
| 2201001 | Rina Putri | SI | Sistem Informasi | IF201 | Basis Data | 3 | D01 | Budi Santoso | A |
| 2201001 | Rina Putri | SI | Sistem Informasi | IF202 | Struktur Data | 3 | D02 | Sari Dewi | B |
| 2201002 | Andi Saputra | TI | Teknik Informatika | IF201 | Basis Data | 3 | D01 | Budi Santoso | B |
| 2201002 | Andi Saputra | TI | Teknik Informatika | MA101 | Kalkulus I | 3 | D03 | Hadi Prasetyo | C |
| 2201003 | Dewi Lestari | SI | Sistem Informasi | IF202 | Struktur Data | 3 | D02 | Sari Dewi | A |
Tiga baris mentah menjadi lima baris. Data memang jadi lebih berulang (nama Rina tertulis dua kali), dan itu wajar. 1NF baru membereskan bentuk sel. Pengulangan dibereskan di 2NF dan 3NF.
Cara menulis dependensi fungsional dan menentukan kunci
Dependensi fungsional A → B berarti satu nilai A selalu menentukan tepat satu nilai B. Dari aturan bisnis di atas, daftarnya:
NIM → NamaMhs, KodeProdi(satu mahasiswa, satu nama, satu prodi)KodeProdi → NamaProdiKodeMK → NamaMK, SKS, KodeDosen(satu mata kuliah, satu dosen pengampu)KodeDosen → NamaDosenNIM, KodeMK → Nilai
Untuk mencari kunci, hitung penutup (closure) dari calon kunci, yaitu semua atribut yang bisa dicapai lewat dependensi di atas.
- Penutup {NIM} = NIM, NamaMhs, KodeProdi, lalu lewat dependensi 2 dapat NamaProdi. KodeMK tidak tercapai, jadi NIM saja bukan kunci.
- Penutup {KodeMK} = KodeMK, NamaMK, SKS, KodeDosen, lalu NamaDosen. NIM tidak tercapai, jadi bukan kunci juga.
- Penutup {NIM, KodeMK} = gabungan keduanya ditambah Nilai lewat dependensi 5. Kesepuluh kolom tercapai.
Kunci primer tabel 1NF adalah kunci komposit (NIM, KodeMK). Kunci ini minimal, karena membuang salah satu kolomnya membuat beberapa atribut tidak tercapai.
Langkah ke 2NF: memisahkan dependensi parsial
Tabel memenuhi 2NF kalau sudah 1NF dan tidak ada atribut bukan kunci yang bergantung hanya pada sebagian kunci komposit. Kunci kita (NIM, KodeMK), jadi periksa setiap atribut bukan kunci:
| Atribut | Ditentukan oleh | Jenis |
|---|---|---|
| NamaMhs, KodeProdi, NamaProdi | NIM saja | parsial |
| NamaMK, SKS, KodeDosen, NamaDosen | KodeMK saja | parsial |
| Nilai | NIM dan KodeMK | penuh |
Hanya Nilai yang butuh seluruh kunci. Atribut yang bergantung parsial dipindah ke tabel baru bersama penentunya, dan penentu itu tetap tinggal di tabel asal sebagai foreign key.
MAHASISWA (NIM, NamaMhs, KodeProdi, NamaProdi)
| NIM | NamaMhs | KodeProdi | NamaProdi |
|---|---|---|---|
| 2201001 | Rina Putri | SI | Sistem Informasi |
| 2201002 | Andi Saputra | TI | Teknik Informatika |
| 2201003 | Dewi Lestari | SI | Sistem Informasi |
MATAKULIAH (KodeMK, NamaMK, SKS, KodeDosen, NamaDosen)
| KodeMK | NamaMK | SKS | KodeDosen | NamaDosen |
|---|---|---|---|---|
| IF201 | Basis Data | 3 | D01 | Budi Santoso |
| IF202 | Struktur Data | 3 | D02 | Sari Dewi |
| MA101 | Kalkulus I | 3 | D03 | Hadi Prasetyo |
KRS (NIM, KodeMK, Nilai)
| NIM | KodeMK | Nilai |
|---|---|---|
| 2201001 | IF201 | A |
| 2201001 | IF202 | B |
| 2201002 | IF201 | B |
| 2201002 | MA101 | C |
| 2201003 | IF202 | A |
Lima baris KRS tetap lima, tetapi Basis Data sekarang hanya tertulis sekali. Tabel MAHASISWA dan MATAKULIAH punya kunci satu kolom, jadi keduanya otomatis lolos 2NF. Pertanyaannya tinggal apakah mereka lolos 3NF.
Langkah ke 3NF: memisahkan dependensi transitif
Tabel memenuhi 3NF kalau sudah 2NF dan tidak ada dependensi transitif, yaitu atribut bukan kunci yang ditentukan oleh atribut bukan kunci lain. Di hasil 2NF ada dua:
- Di MAHASISWA:
NIM → KodeProdidanKodeProdi → NamaProdi. NamaProdi bergantung ke NIM hanya lewat KodeProdi. Buktinya terlihat di data: "Sistem Informasi" tertulis dua kali. - Di MATAKULIAH:
KodeMK → KodeDosendanKodeDosen → NamaDosen.
Pisahkan rantai kedua: NamaProdi pindah ke tabel PRODI, NamaDosen pindah ke tabel DOSEN. KodeProdi dan KodeDosen tetap tinggal sebagai foreign key. Hasil akhirnya lima tabel:
| Tabel | Kunci primer | Foreign key | Isi |
|---|---|---|---|
| PRODI | KodeProdi | SI Sistem Informasi; TI Teknik Informatika | |
| DOSEN | KodeDosen | D01 Budi Santoso; D02 Sari Dewi; D03 Hadi Prasetyo | |
| MAHASISWA | NIM | KodeProdi ke PRODI | 3 baris: NIM, NamaMhs, KodeProdi |
| MATAKULIAH | KodeMK | KodeDosen ke DOSEN | 3 baris: KodeMK, NamaMK, SKS, KodeDosen |
| KRS | (NIM, KodeMK) | NIM ke MAHASISWA, KodeMK ke MATAKULIAH | 5 baris seperti di atas |
Kalau dosenmu meminta DDL, tabel KRS ditulis seperti ini. Bagian REFERENCES adalah yang paling sering lupa:
CREATE TABLE krs (
nim CHAR(7) NOT NULL REFERENCES mahasiswa(nim),
kode_mk VARCHAR(6) NOT NULL REFERENCES matakuliah(kode_mk),
nilai CHAR(2),
PRIMARY KEY (nim, kode_mk)
);
Cara cepat memeriksa hasilnya: gabungkan kembali kelima tabel dengan JOIN. Kalau hasilnya persis lima baris tabel 1NF, tanpa baris tambahan dan tanpa yang hilang, pemecahanmu tidak kehilangan informasi. Cara menulis query gabungannya ada di contoh soal SQL JOIN.
Anomali apa yang hilang setelah normalisasi?
Alasan semua langkah di atas adalah tiga anomali yang ada di tabel 1NF. Ketiganya bisa ditunjukkan dengan data yang sama.
- Anomali update. SKS Basis Data tertulis di dua baris (Rina dan Andi). Kalau kurikulum mengubahnya menjadi 4 SKS dan hanya satu baris yang diganti, tabel mengatakan Basis Data 3 SKS sekaligus 4 SKS. Di 3NF, SKS hanya ada di satu baris MATAKULIAH.
- Anomali insert. Prodi menambah mata kuliah IF301 Jaringan Komputer yang belum diambil siapa pun. Di tabel 1NF mata kuliah itu tidak bisa dicatat, karena kunci primernya (NIM, KodeMK) dan NIM tidak boleh kosong. Di 3NF cukup tambahkan satu baris ke MATAKULIAH.
- Anomali delete. Kalkulus I hanya diambil Andi. Kalau Andi membatalkan Kalkulus I dan barisnya dihapus, ikut hilang juga informasi bahwa MA101 bernilai 3 SKS dan diampu Hadi Prasetyo. Di 3NF yang terhapus hanya satu baris KRS.
Anomali yang sama menimpa Dewi. Kalau satu-satunya baris miliknya dihapus, data bahwa Dewi mahasiswa Sistem Informasi ikut lenyap.
Kesalahan yang sering terjadi di soal normalisasi
- Mencari dependensi parsial di tabel berkunci tunggal. Dependensi parsial hanya mungkin ada kalau kuncinya komposit. Tabel 1NF yang semua kunci kandidatnya satu kolom otomatis sudah 2NF, jadi jangan memecah MAHASISWA "demi 2NF".
- Memindahkan atribut tanpa meninggalkan penentunya. Kalau NamaProdi dipindah ke PRODI tetapi KodeProdi ikut dihapus dari MAHASISWA, kamu tidak bisa lagi tahu Rina kuliah di prodi apa.
- Lupa menandai foreign key. Di jawaban UTS, garis bawah untuk kunci primer saja tidak cukup. Tandai juga kolom mana merujuk ke tabel mana.
- Menurunkan dependensi dari data contoh. Di data contoh tidak ada dua mahasiswa bernama sama, tetapi itu tidak berarti
NamaMhs → NIM. Dependensi berasal dari aturan bisnis. - Memakai nama sebagai kunci. Dua mahasiswa bisa bernama Dewi Lestari. Pakai NIM atau kode.
- Menulis 3NF dulu sebelum 2NF. Hasil akhirnya mungkin benar, tetapi soal biasanya menilai tabel di setiap tahap.
Normalisasi biasanya berangkat dari tabel mentah. Kalau soalmu berangkat dari diagram, langkahnya berbeda dan dibahas di mengubah ERD ke tabel.
FAQ
Apakah tabel 3NF di contoh ini juga sudah BCNF?
Ya. BCNF meminta setiap penentu dalam dependensi fungsional adalah kunci kandidat. Di kelima tabel akhir, penentunya hanya kunci primer masing-masing, jadi syarat itu terpenuhi.
Bagaimana kalau mahasiswa mengulang mata kuliah yang sama?
Kunci (NIM, KodeMK) tidak cukup lagi, karena Andi bisa punya dua nilai Kalkulus I dari semester berbeda. Tambahkan kolom tahun akademik atau semester ke kunci KRS, misalnya (NIM, KodeMK, TahunAkademik).
Bagaimana kalau satu mata kuliah diampu lebih dari satu dosen?
Dependensi KodeMK → KodeDosen tidak berlaku lagi, jadi KodeDosen tidak boleh tinggal di MATAKULIAH. Buat tabel penghubung PENGAMPU (KodeMK, KodeDosen) dengan kunci komposit kedua kolom.
Apakah IPK perlu disimpan sebagai kolom di tabel MAHASISWA?
Di desain 3NF tidak, karena IPK bisa dihitung dari KRS dan SKS di MATAKULIAH. Menyimpannya membuat anomali update baru setiap ada nilai yang berubah. Untuk mengecek hitungan manualnya, pakai kalkulator IPK.
Apakah semua tabel harus dinormalisasi sampai 3NF?
Untuk tugas kuliah dan sistem transaksi, 3NF adalah target yang umum. Sistem laporan dan gudang data kadang sengaja menyimpan data berulang supaya query lebih cepat, tetapi keputusan itu diambil setelah desain 3NF-nya dipahami, bukan sebagai pengganti.
