Mengenal 3NF Dalam Database
by Ahmad Afan Shobari

Assalamualaikum, pada kesempatan kali ini kita akan membuat pengenalan tentang 3NF pada database,singkatnya 3nf adalah sebuah metode dimana memastikan setiap kolom di sebuah tabel cuma menyimpan data yang benar-benar terkait dengan satu hal utama saja, atau bisa juga pengelompokan.
1. Contoh Masalah
1.2 Kantin Sekolah

Masalah yang terlihat:
hp_santri,daftar_item,metode_bayar,rincian_bayar= multi-nilai (melanggar 1NF).Identitas santri & kasir diulang antar transaksi (redundan).
total_sebelum_diskonbisa dihitung dari item (redun dan rawan salah).
2. Penyelesaianya
2.1 1NF Kolom Atomic.
Tujuan: setiap kolom harus atomic (satu sel = satu nilai).
Pecah
hp_santri→ tabel terpisah: SANTRI_HP(nis, nomor_hp).Pecah
daftar_itemper baris item → DETAIL_TRANSAKSI(transaksi_id, produk_kode, nama_produk, qty, harga_satuan).Pecah pembayaran multi-metode → PEMBAYARAN(transaksi_id, metode, nominal).
Catatan: Di 1NF, boleh masih simpan
nama_santri,kelas,asrama,nama_kasir,jabatan_kasirdi tabel transaksi. Fokus dulu atomisasi nilai.
Output 1NF (daftar tabel minimal):
KANTIN_TRANSAKSI(id_transaksi, tgl_waktu, nis_santri, nama_santri, kelas, asrama, nama_kasir, jabatan_kasir, total_sebelum_diskon, kembalian, catatan)
SANTRI_HP(nis, nomor_hp)
DETAIL_TRANSAKSI(id_transaksi, produk_kode, nama_produk, qty, harga_satuan)
PEMBAYARAN(id_transaksi, metode, nominal)
maka tablenya akan seperti ini:

2.2 2NF bergantung penuh pada primary key.
Tujuan: kolom non-key bergantung penuh pada primary key tabelnya.
Pisahkan entitas yang bukan milik transaksi:
SANTRI(nis, nama, kelas, asrama) (di KANTIN_TRANSAKSI cukup simpan nis)
PEGAWAI(id_pegawai, nama, jabatan) (di KANTIN_TRANSAKSI simpan pegawai_id)
PRODUK(kode, nama, harga_default?) (tetap simpan harga_satuan_saat_transaksi di DETAIL_TRANSAKSI)
Revisi tabel:
KANTIN_TRANSAKSI(id_transaksi, tgl_waktu, nis, pegawai_id, total_sebelum_diskon, kembalian, catatan)
SANTRI(nis, nama, kelas, asrama)
PEGAWAI(id_pegawai, nama, jabatan)
PRODUK(kode, nama)
DETAIL_TRANSAKSI(id_transaksi, produk_kode, qty, harga_satuan)
PEMBAYARAN(id_transaksi, metode, nominal)
SANTRI_HP(nis, nomor_hp)
Alasan 2NF:
nama_santri/kelas/asramabergantung ke NIS (santri), bukan ke transaksi.nama_kasir/jabatanbergantung ke pegawai, bukan langsung transaksi.
maka akan jadi seperti ini:

2.3 3NF ketergantungan transitif.
Tujuan: tidak ada ketergantungan transitif (non-key → non-key).
Pastikan atribut seperti
jabatanhanya ada di PEGAWAI, bukan di transaksi.kelas&asramabila ingin lebih rapi bisa dipisah:- KELAS(id, nama), ASRAMA(id, nama), lalu di SANTRI simpan kelas_id & asrama_id. (opsional untuk tugas 30 menit; cukup catat idenya)
Harga historis: tetap simpan harga_satuan di DETAIL_TRANSAKSI (fakta saat jual), agar transaksi lama tidak berubah meski harga produk update.
Struktur Final Minimal (3NF, versi ringkas):
SANTRI(nis PK, nama, kelas, asrama)
PEGAWAI(id_pegawai PK, nama, jabatan)
PRODUK(kode PK, nama)
KANTIN_TRANSAKSI(id_transaksi PK, tgl_waktu, nis FK→SANTRI, pegawai_id FK→PEGAWAI, kembalian, catatan)
DETAIL_TRANSAKSI(id_transaksi FK, produk_kode FK, qty, harga_satuan)
PEMBAYARAN(id_transaksi FK, metode, nominal)
SANTRI_HP(nis FK, nomor_hp)
Catatan:
total_sebelum_diskontidak wajib disimpan (bisa dihitung dari DETAIL). Jika disimpan untuk performa, dokumentasikan sebagai denormalisasi terkontrol.
bila dibuat erd maka akan menjadi seperti ini:

3. Praktik Di SQL
- setelah kita membuat erdnya maka kita akam membuat sqlnya




4. Penutupan
- mungkin cukup sekian dari saya bila ada salah mohon dimaafkan thanks….see you next time



