MODUL PERTEMUAN 6
NORMALISASI DATA (1NF â 3NF)
A. INFORMASI UMUM MATA KULIAH
| Item | Keterangan |
|---|---|
| Mata Kuliah | Data Modelling |
| Kode MK | SSD1019 |
| Bobot | 3 SKS (Praktikum) |
| Semester | 4 (Empat) |
| Program Studi | Sains Data |
| Fakultas | Ekonomi dan Bisnis Islam |
| Universitas | UIN K.H. Abdurrahman Wahid Pekalongan |
| Dosen Pengampu | Mohammad Reza Maulana, M.Kom |
B. INFORMASI PERTEMUAN
B.1 Sub-CPMK Pertemuan 6
Sub-CPMK 4.1: Mahasiswa mampu menyusun dan memvalidasi model data logikal yang bebas dari redundansi dan anomali, dengan menerapkan teknik normalisasi secara sistematis dari bentuk tidak normal hingga Third Normal Form (3NF).
B.2 Tujuan Pembelajaran (Learning Objectives)
Setelah mengikuti pertemuan ini, mahasiswa akan mampu:
- Menjelaskan tiga jenis anomali data (insertion, update, deletion) dan dampaknya terhadap integritas database (C2 â Memahami)
- Mengidentifikasi functional dependency (FD) dari sebuah relasi berdasarkan semantik bisnis (C3 â Mengaplikasikan)
- Membedakan jenis-jenis ketergantungan: full FD, partial dependency, dan transitive dependency (C2 â Memahami)
- Menerapkan normalisasi 1NF, 2NF, dan 3NF secara step-by-step pada tabel yang diberikan (C3 â Mengaplikasikan)
- Menganalisis sebuah tabel untuk menentukan apakah sudah memenuhi syarat bentuk normal tertentu (C4 â Menganalisis)
- Merancang skema relasional yang ternormalisasi hingga 3NF dari narasi bisnis yang diberikan (C4 â Menganalisis)
B.3 Kompetensi yang Dikembangkan
| Domain | Kompetensi |
|---|---|
| Kognitif | Memahami anomali dan FD (C2), Menerapkan normalisasi (C3), Menganalisis tabel (C4) |
| Afektif | Mengembangkan ketelitian dalam memeriksa dependensi; menghargai pentingnya desain database yang bersih |
| Psikomotorik | Mendokumentasikan langkah normalisasi secara runtut; menulis skema hasil normalisasi dalam notasi formal |
B.4 Indikator Pencapaian
Setelah mengikuti pertemuan ini, mahasiswa diharapkan mampu:
- Mencontohkan ketiga jenis anomali dari satu tabel yang sama secara konkret
- Menuliskan semua functional dependency yang ada dalam sebuah relasi
- Memverifikasi apakah sebuah relasi memenuhi 1NF, 2NF, atau 3NF
- Mendekomposisi tabel yang tidak normal menjadi tabel-tabel yang memenuhi 3NF
- Membuktikan bahwa dekomposisi yang dilakukan tidak kehilangan informasi (lossless decomposition)
B.5 Alokasi Waktu
| No | Kegiatan | Durasi | Keterangan |
|---|---|---|---|
| 1 | Pembukaan & Review Tugas Mapping Pertemuan 5 | 10 menit | Highlight pola umum dari tugas mahasiswa |
| 2 | Aktivitas Pemantik: "Database Bermasalah" | 10 menit | Eksplorasi spreadsheet data yang kotor |
| 3 | Materi 1: Anomali Data â Tiga Penyakit Database | 20 menit | Ceramah + demonstrasi konkret |
| 4 | Materi 2: Functional Dependency â Bahasa Normalisasi | 20 menit | Ceramah + latihan identifikasi FD |
| 5 | Break | 10 menit | â |
| 6 | Materi 3: First Normal Form (1NF) | 15 menit | Ceramah + latihan |
| 7 | Materi 4: Second Normal Form (2NF) | 20 menit | Ceramah + latihan bertahap |
| 8 | Materi 5: Third Normal Form (3NF) | 20 menit | Ceramah + latihan bertahap |
| 9 | Praktikum Terbimbing: Normalisasi End-to-End | 20 menit | Latihan individual/berpasangan |
| 10 | Review & Diskusi Hasil Praktikum | 10 menit | Pembahasan bersama, tanya jawab |
| 11 | Evaluasi, Briefing Tugas & Penutup | 10 menit | Kuis, penjelasan tugas normalisasi, refleksi |
| Total | 165 menit | (termasuk fleksibilitas 5 menit) |
C. MATERI PEMBELAJARAN
C.1 Aktivitas Pemantik â "Database Bermasalah"
Instruksi (10 menit): Dosen menampilkan tabel berikut di layar. Tabel ini adalah rekaman data yang disimpan oleh sebuah toko buku dalam satu spreadsheet Excel. Mahasiswa diminta mengamati dan menjawab pertanyaan.
Tabel: TRANSAKSI_TOKO_BUKU
| no_faktur | tgl_faktur | id_pembeli | nama_pembeli | kota_pembeli | kode_buku | judul_buku | nama_penulis | harga | qty | subtotal |
|---|---|---|---|---|---|---|---|---|---|---|
| F001 | 2025-01-10 | C001 | Andi Wijaya | Semarang | B101 | Belajar Python | Rudi Hartono | 85000 | 2 | 170000 |
| F001 | 2025-01-10 | C001 | Andi Wijaya | Semarang | B205 | Data Science | Maya Sari | 120000 | 1 | 120000 |
| F002 | 2025-01-11 | C002 | Budi Santoso | Pekalongan | B101 | Belajar Python | Rudi Hartono | 85000 | 1 | 85000 |
| F003 | 2025-01-12 | C001 | Andi Wijaya | Jakarta | B310 | Machine Learning | Dewi Lestari | 150000 | 3 | 450000 |
| F004 | 2025-01-15 | C003 | Citra Dewi | Semarang | B205 | Data Science | Maya Sari | 95000 | 2 | 190000 |
Pertanyaan Pemantik:
-
Temukan inkonsistensi! Perhatikan data
C001 - Andi Wijaya. Ada apa yang janggal di baris F001 dibanding F003? -
Bayangkan skenario ini: Harga buku B205 "Data Science" naik dari 120.000 menjadi 130.000. Berapa baris yang harus diubah? Apa risikonya?
-
Bayangkan skenario lain: Faktur F004 ternyata dibatalkan dan harus dihapus. Apa informasi lain yang ikut hilang?
-
Bisakah kita memasukkan data buku baru (kode_buku: B400, judul: "SQL Dasar", harga: 75.000) sebelum ada pembeli yang membeli buku tersebut?
Rangkuman Dosen: "Keempat masalah yang baru kalian temukan ini adalah bukti nyata mengapa normalisasi penting. Ini bukan sekadar teori â ini adalah penyakit nyata yang menyebabkan data tidak dapat dipercaya. Hari ini kita akan belajar teknik untuk menyembuhkannya secara sistematis."
C.2 Materi 1: Anomali Data â Tiga Penyakit Database
Anomali data adalah masalah yang timbul saat kita melakukan operasi manipulasi data (insert, update, delete) pada tabel yang tidak dirancang dengan baik. Ada tiga jenis anomali utama, dan ketiganya muncul akibat satu penyebab yang sama: redundansi data (data yang sama disimpan di lebih dari satu tempat).
C.2.1 Update Anomaly (Anomali Pembaruan)
Terjadi ketika memperbarui satu fakta membutuhkan pembaruan di banyak baris. Jika tidak semua baris diperbarui, timbul inkonsistensi.
CONTOH â Tabel PESANAN_DETAIL (tidak ternormalisasi):
| pesanan_id | pelanggan_id | nama_pelanggan | kota_pelanggan | produk_id | nama_produk | harga |
|------------|--------------|----------------|----------------|-----------|----------------|--------|
| P001 | C001 | Andi Wijaya | Semarang | PRD01 | Batik Motif A | 150000 |
| P001 | C001 | Andi Wijaya | Semarang | PRD02 | Batik Motif B | 200000 |
| P002 | C001 | Andi Wijaya | Semarang | PRD03 | Batik Motif C | 175000 |
| P003 | C002 | Budi Santoso | Pekalongan | PRD01 | Batik Motif A | 150000 |
SKENARIO: Andi Wijaya pindah dari Semarang ke Yogyakarta.
MASALAH:
Harus update 3 baris (semua baris yang berisi C001).
Jika admin hanya update 2 baris dari 3:
â Baris pertama: kota = "Yogyakarta" â diperbarui
â Baris kedua: kota = "Yogyakarta" â diperbarui
â Baris ketiga: kota = "Semarang" â LUPA! Inkonsistensi!
DAMPAK: Laporan yang berbeda menghasilkan data berbeda untuk pelanggan yang sama.C.2.2 Insertion Anomaly (Anomali Penyisipan)
Terjadi ketika kita tidak bisa menyimpan data tentang satu entitas tanpa harus menyimpan data entitas lain secara bersamaan.
CONTOH â Tabel MENGAJAR (tidak ternormalisasi):
| dosen_id | nama_dosen | kode_mk | nama_mk | ruangan | semester |
|----------|--------------|---------|-----------------|---------|----------|
| D001 | Prof. Ahmad | MK101 | Matematika Dasar| R201 | Ganjil |
| D001 | Prof. Ahmad | MK102 | Kalkulus | R305 | Ganjil |
| D002 | Dr. Budi | MK201 | Statistika | R102 | Ganjil |
SKENARIO: Seorang dosen baru (D003, Dr. Citra) bergabung, tetapi belum mengampu
mata kuliah apapun semester ini.
MASALAH:
Tidak bisa insert data D003 karena:
â kode_mk adalah bagian dari PK (tidak boleh NULL atau kosong)
â Tidak ada MK yang diajarkan â tidak ada baris yang bisa dibuat
Akibatnya, data dosen baru tidak tersimpan padahal sudah ada di sistem HR!
SKENARIO LAIN: Kita ingin mendaftarkan MK baru (MK301, Aljabar Linear)
sebelum ada dosen yang ditugaskan:
â Tidak bisa! Karena dosen_id juga bagian dari PK.C.2.3 Deletion Anomaly (Anomali Penghapusan)
Terjadi ketika menghapus satu data secara tidak sengaja menghapus data lain yang seharusnya dipertahankan.
CONTOH â Tabel MENGAJAR (sama seperti di atas):
| dosen_id | nama_dosen | kode_mk | nama_mk | ruangan | semester |
|----------|--------------|---------|-----------------|---------|----------|
| D001 | Prof. Ahmad | MK101 | Matematika Dasar| R201 | Ganjil |
| D001 | Prof. Ahmad | MK102 | Kalkulus | R305 | Ganjil |
| D002 | Dr. Budi | MK201 | Statistika | R102 | Ganjil |
SKENARIO: Dr. Budi (D002) mengundurkan diri. Kita hapus semua baris terkait D002.
MASALAH:
Saat menghapus baris D002:
â Data mata kuliah MK201 (Statistika) ikut hilang!
â Informasi bahwa MK201 pernah ada di sistem terhapus.
Jika ada mahasiswa yang sudah mengambil MK201, referensi mereka menjadi rusak.
Jika ingin menugaskan dosen lain untuk MK201, tidak ada data MK yang tersisa.
AKAR MASALAH KETIGANYA:
Semua anomali berasal dari satu masalah yang sama:
REDUNDANSI â informasi yang sama (nama dosen, nama MK) disimpan di banyak baris.
Normalisasi adalah teknik untuk menghilangkan redundansi ini secara sistematis.C.3 Materi 2: Functional Dependency â Bahasa Normalisasi
Sebelum bisa melakukan normalisasi, kita harus memahami functional dependency (FD) â konsep yang menjadi "bahasa" untuk mendeskripsikan hubungan antar atribut dalam sebuah relasi.
C.3.1 Definisi Functional Dependency
Definisi Formal: Dalam relasi R, atribut B functionally dependent pada atribut A (ditulis A â B) jika dan hanya jika: untuk setiap nilai A yang sama, pasti ada nilai B yang sama.
Cara membaca: "A menentukan B" atau "B bergantung pada A" atau "Jika A sama, maka B pasti sama."
NOTASI: A â B
Dibaca: "A secara fungsional menentukan B"
"A determines B"
"B is functionally dependent on A"
CONTOH INTUITIF:
NIM â Nama_Mahasiswa
"Jika NIM sama, maka Nama_Mahasiswa pasti sama"
â Benar! Satu NIM hanya untuk satu mahasiswa.
â Ini adalah Functional Dependency yang valid.
Kode_MK â Nama_MK, SKS
"Jika Kode_MK sama, maka Nama_MK dan SKS pasti sama"
â Benar! Satu kode MK punya satu nama dan satu jumlah SKS.
â Ini adalah Functional Dependency yang valid.
Nama â NIM
"Jika Nama sama, maka NIM pasti sama"
â TIDAK BENAR! Ada mahasiswa bernama sama tapi NIM berbeda.
â Bukan Functional Dependency yang valid.
INGAT: FD bukan tentang nilai spesifik dalam data saat ini.
FD adalah tentang ATURAN SEMANTIK BISNIS yang harus selalu berlaku.C.3.2 Cara Mengidentifikasi Functional Dependency
Langkah-langkah mengidentifikasi FD dari sebuah relasi:
LANGKAH 1: Tentukan semua atribut dalam relasi
LANGKAH 2: Untuk setiap pasang (atau grup) atribut, tanyakan:
"Apakah mengetahui nilai [A] sudah cukup untuk menentukan nilai [B]?"
"Bisakah dua baris memiliki nilai [A] yang sama tetapi [B] yang berbeda?"
LANGKAH 3: Identifikasi PK (sumber semua FD yang "kuat")
LANGKAH 4: Cari FD yang melibatkan kolom non-kunci â ini kandidat masalah normalisasi
CONTOH â Relasi: FAKTUR(no_faktur, tgl_faktur, id_pembeli, nama_pembeli,
kota_pembeli, kode_buku, judul_buku, harga, qty, subtotal)
IDENTIFIKASI FD:
Dari no_faktur:
no_faktur â tgl_faktur â (satu faktur punya satu tanggal)
no_faktur â id_pembeli â (satu faktur dibuat oleh satu pembeli)
no_faktur, kode_buku â qty â (dalam faktur tertentu, qty item tertentu sudah pasti)
Dari id_pembeli:
id_pembeli â nama_pembeli â (satu ID pembeli punya satu nama)
id_pembeli â kota_pembeli â (satu ID pembeli punya satu kota)
Dari kode_buku:
kode_buku â judul_buku â (satu kode buku punya satu judul)
kode_buku â harga â (satu buku punya satu harga)
Derived:
no_faktur, kode_buku â subtotal â (subtotal = qty à harga, diturunkan)
PK dari relasi ini:
(no_faktur, kode_buku) â karena satu faktur bisa berisi banyak buku,
dan kita perlu tahu faktur mana + buku mana untuk mengidentifikasi satu baris.C.3.3 Jenis-Jenis Functional Dependency
Ada tiga jenis FD yang kritis untuk normalisasi:
1. Full Functional Dependency (FD Penuh)
DEFINISI: B fully functionally dependent pada A jika B bergantung pada
SELURUH A, dan tidak bisa bergantung hanya pada bagian dari A.
Notasi: A â B (dimana A adalah PK komposit dan B tidak bisa ditentukan
oleh subset manapun dari A)
CONTOH â dalam FAKTUR(no_faktur, kode_buku, qty):
{no_faktur, kode_buku} â qty
Apakah qty bisa ditentukan oleh no_faktur saja? TIDAK
(satu faktur bisa punya banyak item dengan qty berbeda)
Apakah qty bisa ditentukan oleh kode_buku saja? TIDAK
(satu buku muncul di banyak faktur dengan qty berbeda)
â qty fully functionally dependent pada {no_faktur, kode_buku} â2. Partial Dependency (Ketergantungan Parsial)
DEFINISI: B partially dependent pada A jika B bergantung hanya pada
SEBAGIAN dari A (dimana A adalah PK komposit).
Ini adalah MASALAH yang harus diselesaikan oleh 2NF.
CONTOH â dalam FAKTUR(no_faktur, kode_buku, nama_pembeli, judul_buku, qty):
PK: {no_faktur, kode_buku}
no_faktur â nama_pembeli
(nama_pembeli hanya bergantung pada no_faktur, bukan pada kombinasi keduanya!)
â nama_pembeli PARTIALLY DEPENDENT pada PK â MASALAH!
kode_buku â judul_buku
(judul_buku hanya bergantung pada kode_buku, bukan pada kombinasi keduanya!)
â judul_buku PARTIALLY DEPENDENT pada PK â MASALAH!
{no_faktur, kode_buku} â qty
(qty bergantung pada keduanya, tidak bisa hanya satu)
â qty FULLY DEPENDENT pada PK â3. Transitive Dependency (Ketergantungan Transitif)
DEFINISI: C transitively dependent pada A jika:
A â B dan B â C, sehingga A â C (melalui perantara B)
dan B bukan merupakan candidate key dari relasi tersebut.
Ini adalah MASALAH yang harus diselesaikan oleh 3NF.
CONTOH â dalam KARYAWAN(emp_id, nama, dept_id, nama_dept, lokasi_dept):
PK: emp_id
emp_id â dept_id â (karyawan punya satu departemen)
dept_id â nama_dept â (departemen punya satu nama)
dept_id â lokasi_dept â (departemen punya satu lokasi)
Sehingga: emp_id â dept_id â nama_dept
nama_dept TRANSITIVELY DEPENDENT pada emp_id (melalui dept_id) â MASALAH!
Kita bisa menentukan nama_dept dari emp_id, tapi HANYA melalui perantara dept_id.
dept_id bukanlah candidate key â ini adalah transitive dependency.C.3.4 Visualisasi Ketiga Jenis Dependency
RINGKASAN VISUAL:
FULL FD (baik, tidak ada masalah):
{A, B} âââââââââââââââââââ C
PK komposit Non-key attr
PARTIAL DEPENDENCY (masalah 2NF):
A âââââââââââââââââââââââ C â C hanya bergantung pada A!
â Bukan pada seluruh {A, B}
{A, B}
â
B âââââââââââââââââââââââ D â D hanya bergantung pada B!
TRANSITIVE DEPENDENCY (masalah 3NF):
A âââââââââââ B âââââââââââ C
PK Non-key attr Non-key attr
(mediator)
â
Ini bukan candidate key!
Itulah masalahnya.C.4 Materi 3: First Normal Form (1NF)
C.4.1 Definisi dan Syarat 1NF
Sebuah relasi memenuhi First Normal Form (1NF) jika:
- Semua atribut memiliki nilai atomik (tidak bisa dibagi lagi, single value)
- Tidak ada repeating groups (kelompok kolom berulang)
- Tidak ada multivalued attribute (setiap sel berisi tepat satu nilai)
- Semua baris unik (ada primary key)
PELANGGARAN 1NF â CONTOH 1: Multivalued dalam Satu Sel
SEBELUM 1NF (pelanggaran: nomor_hp berisi banyak nilai):
| mahasiswa_id | nama | nomor_hp |
|--------------|-------|-----------------------------|
| M001 | Andi | 081234, 085678, 089012 | â PELANGGARAN!
| M002 | Budi | 087654 |
SETELAH 1NF:
MAHASISWA:
| mahasiswa_id | nama |
|--------------|-------|
| M001 | Andi |
| M002 | Budi |
MAHASISWA_HP:
| mahasiswa_id | nomor_hp |
|--------------|----------|
| M001 | 081234 |
| M001 | 085678 |
| M001 | 089012 |
| M002 | 087654 |
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
PELANGGARAN 1NF â CONTOH 2: Repeating Groups (Kolom Berulang)
SEBELUM 1NF (repeating groups: buku1, buku2, buku3, ...):
| id_peminjam | nama | buku1 | tgl_pinjam1 | buku2 | tgl_pinjam2 |
|-------------|-------|-----------|-------------|----------------|-------------|
| P001 | Andi | Belajar R | 2025-01-10 | Data Mining | 2025-01-10 |
| P002 | Budi | Python 3 | 2025-01-11 | NULL | NULL |
MASALAH:
- Jika seseorang meminjam 4 buku, harus tambah 2 kolom lagi
- NULL yang tidak bermakna
- Query yang sangat sulit
SETELAH 1NF (pisahkan ke relasi terpisah):
PEMINJAM:
| id_peminjam | nama |
|-------------|-------|
| P001 | Andi |
| P002 | Budi |
PEMINJAMAN:
| id_peminjam | kode_buku | tgl_pinjam |
|-------------|-----------|-------------|
| P001 | BK001 | 2025-01-10 |
| P001 | BK002 | 2025-01-10 |
| P002 | BK003 | 2025-01-11 |
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
PELANGGARAN 1NF â CONTOH 3: Nilai Komposit (Non-Atomik)
SEBELUM 1NF (alamat disimpan satu kolom, tidak atomik):
| pelanggan_id | nama | alamat_lengkap |
|--------------|------|------------------------------------------|
| CUS001 | Ani | Jl. Merdeka No.5, Podosugih, Pekalongan |
MASALAH: Tidak bisa filter berdasarkan kota, tidak bisa sort berdasarkan kecamatan
SETELAH 1NF:
| pelanggan_id | nama | jalan | kelurahan | kota |
|--------------|------|----------------|-----------|------------|
| CUS001 | Ani | Jl. Merdeka 5 | Podosugih | Pekalongan |C.4.2 Apakah Semua Nilai Harus Dipecah?
PERTANYAAN PENTING: Seberapa jauh harus dipecah?
JAWABAN: Bergantung pada kebutuhan bisnis (use case)
CONTOH â Nama Lengkap:
"Ahmad Fauzi Santoso"
â Jika hanya ditampilkan: BOLEH satu kolom (nama_lengkap)
â Jika perlu sort by nama belakang: HARUS pisah (nama_depan, nama_belakang)
â Jika perlu greeting formal: HARUS pisah (gelar, nama_depan, nama_belakang)
PRINSIP: Setiap atribut harus atomik dari sudut pandang OPERASI BISNIS
yang akan dilakukan, bukan atomik secara absolut.C.5 Materi 4: Second Normal Form (2NF)
C.5.1 Definisi dan Syarat 2NF
Sebuah relasi memenuhi Second Normal Form (2NF) jika:
- Sudah dalam 1NF, DAN
- Setiap atribut non-kunci fully functionally dependent pada seluruh primary key (tidak ada partial dependency)
Catatan Penting: 2NF hanya relevan jika tabelnya memiliki PK komposit. Tabel dengan single-column PK yang sudah 1NF otomatis juga 2NF (tidak mungkin ada partial dependency).
C.5.2 Langkah Mencapai 2NF
ALGORITMA MENCAPAI 2NF:
1. Identifikasi semua partial dependency
(atribut non-kunci yang hanya bergantung pada SEBAGIAN PK komposit)
2. Untuk setiap partial dependency A â B (dimana A adalah bagian dari PK):
a. Hapus kolom B dari tabel asli
b. Buat tabel baru dengan A sebagai PK dan B sebagai atributnya
3. Tabel asli hanya menyimpan atribut yang fully dependent pada seluruh PKC.5.3 Contoh Penerapan 2NF
TABEL AWAL (sudah 1NF, belum 2NF):
DETAIL_PESANAN(no_pesanan, kode_produk, nama_produk, harga_satuan,
nama_pembeli, kota_pembeli, qty, subtotal)
PK: {no_pesanan, kode_produk}
IDENTIFIKASI FD:
{no_pesanan, kode_produk} â qty â FULL FD â
{no_pesanan, kode_produk} â subtotal â FULL FD â (tapi derived)
no_pesanan â nama_pembeli â PARTIAL DEPENDENCY â
no_pesanan â kota_pembeli â PARTIAL DEPENDENCY â
kode_produk â nama_produk â PARTIAL DEPENDENCY â
kode_produk â harga_satuan â PARTIAL DEPENDENCY â
DIAGRAM DEPENDENCY:
no_pesanan âââŦâââ nama_pembeli â PARTIAL (masalah!)
ââââ kota_pembeli â PARTIAL (masalah!)
kode_produk ââŦâââ nama_produk â PARTIAL (masalah!)
ââââ harga_satuan â PARTIAL (masalah!)
{no_pesanan, kode_produk} âââ qty â FULL â
âââ subtotal â FULL â
PROSES DEKOMPOSISI ke 2NF:
LANGKAH 1: Pisahkan setiap kelompok partial dependency menjadi tabel baru
Dari partial dependency no_pesanan â {nama_pembeli, kota_pembeli}:
â Buat tabel: PESANAN(no_pesanan, nama_pembeli, kota_pembeli)
^^^^^^^^^^
PK
Dari partial dependency kode_produk â {nama_produk, harga_satuan}:
â Buat tabel: PRODUK(kode_produk, nama_produk, harga_satuan)
^^^^^^^^^^^
PK
LANGKAH 2: Tabel asli hanya simpan atribut yang fully dependent
DETAIL_PESANAN(no_pesanan*, kode_produk*, qty)
^^^^^^^^^^ ^^^^^^^^^^^
PK komposit (keduanya FK juga)
LANGKAH 3: Hapus derived attribute (subtotal = qty à harga, tidak perlu disimpan)
HASIL AKHIR (sudah 2NF):
PESANAN(no_pesanan, nama_pembeli, kota_pembeli)
^^^^^^^^^^
PK
PRODUK(kode_produk, nama_produk, harga_satuan)
^^^^^^^^^^^
PK
DETAIL_PESANAN(no_pesanan*, kode_produk*, qty)
^^^^^^^^^^ ^^^^^^^^^^^
PK: {no_pesanan, kode_produk}
no_pesanan â FK ke PESANAN
kode_produk â FK ke PRODUK
VERIFIKASI: Tidak ada lagi partial dependency di ketiga tabel.
Semua atribut non-kunci fully dependent pada PK masing-masing. âC.5.4 Mengapa 2NF Menyelesaikan Sebagian Anomali?
TABEL SEBELUM 2NF: DETAIL_PESANAN(no_pesanan, kode_produk, nama_produk,
harga_satuan, nama_pembeli, qty)
Update Anomaly:
Ubah nama produk kode PRD01 â harus update N baris â
Insertion Anomaly:
Tidak bisa simpan produk baru sebelum ada pesanan â
Deletion Anomaly:
Hapus pesanan terakhir yang berisi PRD01 â data produk hilang â
SETELAH 2NF:
Tabel PRODUK terpisah:
Update nama produk â hanya 1 baris di PRODUK â
Insert produk baru tanpa pesanan â bisa, cukup insert ke PRODUK â
Hapus semua pesanan â data produk di tabel PRODUK tetap ada â
TAPI masih ada masalah lain (transitive dependency) â itulah tugas 3NF!C.6 Materi 5: Third Normal Form (3NF)
C.6.1 Definisi dan Syarat 3NF
Sebuah relasi memenuhi Third Normal Form (3NF) jika:
- Sudah dalam 2NF, DAN
- Tidak ada atribut non-kunci yang transitively dependent pada primary key
Dengan kata lain: setiap atribut non-kunci harus bergantung langsung pada PK â bukan pada atribut non-kunci lainnya.
Cara cepat mengidentifikasi pelanggaran 3NF: Jika ada atribut non-kunci A yang menentukan atribut non-kunci B (A â B), maka B transitively dependent pada PK (melalui A). Ini adalah pelanggaran 3NF.
C.6.2 Langkah Mencapai 3NF
ALGORITMA MENCAPAI 3NF:
1. Identifikasi semua transitive dependency
(atribut non-kunci yang bergantung pada atribut non-kunci lain, bukan pada PK)
Ciri: Ada FD: X â Y dimana X bukan PK (X hanya atribut non-kunci/FK)
2. Untuk setiap transitive dependency X â Y:
a. Hapus kolom Y dari tabel asli
b. Buat tabel baru dengan X sebagai PK dan Y sebagai atributnya
c. X tetap ada di tabel asli (sebagai FK ke tabel baru)
3. Tabel asli hanya menyimpan atribut yang langsung bergantung pada PKC.6.3 Contoh Penerapan 3NF
TABEL AWAL (sudah 2NF, belum 3NF):
KARYAWAN(emp_id, nama, jabatan_id, nama_jabatan, gaji_pokok, dept_id, nama_dept, lokasi_dept)
^^^^^^
PK
IDENTIFIKASI FD:
emp_id â nama â direct dependency pada PK
emp_id â jabatan_id â direct dependency pada PK
emp_id â gaji_pokok â direct dependency pada PK
emp_id â dept_id â direct dependency pada PK
jabatan_id â nama_jabatan â TRANSITIVE! (jabatan_id bukan PK)
dept_id â nama_dept â TRANSITIVE! (dept_id bukan PK)
dept_id â lokasi_dept â TRANSITIVE! (dept_id bukan PK)
Rantai ketergantungan:
emp_id â jabatan_id â nama_jabatan â transitive dependency â
emp_id â dept_id â nama_dept â transitive dependency â
emp_id â dept_id â lokasi_dept â transitive dependency â
PROSES DEKOMPOSISI ke 3NF:
LANGKAH 1: Pisahkan transitive dependency jabatan_id â nama_jabatan
â Buat tabel: JABATAN(jabatan_id, nama_jabatan)
^^^^^^^^^^^
PK
LANGKAH 2: Pisahkan transitive dependency dept_id â {nama_dept, lokasi_dept}
â Buat tabel: DEPARTEMEN(dept_id, nama_dept, lokasi_dept)
^^^^^^^
PK
LANGKAH 3: Tabel KARYAWAN hanya simpan atribut yang langsung bergantung pada emp_id
KARYAWAN(emp_id, nama, jabatan_id*, gaji_pokok, dept_id*)
^^^^^^ ^^^^^^^
PK jabatan_id â FK ke JABATAN
dept_id â FK ke DEPARTEMEN
HASIL AKHIR (sudah 3NF):
JABATAN(jabatan_id, nama_jabatan)
^^^^^^^^^^^
PK
DEPARTEMEN(dept_id, nama_dept, lokasi_dept)
^^^^^^^
PK
KARYAWAN(emp_id, nama, jabatan_id*, gaji_pokok, dept_id*)
^^^^^^
PK
VERIFIKASI 3NF:
JABATAN: emp_id? Tidak ada. nama_jabatan bergantung langsung pada jabatan_id â
DEPARTEMEN: nama_dept bergantung langsung pada dept_id â
KARYAWAN: nama, jabatan_id, gaji_pokok, dept_id semua bergantung langsung pada emp_id â
Tidak ada lagi transitive dependency! âC.6.4 Contoh Lengkap End-to-End: 0NF â 1NF â 2NF â 3NF
Kita akan transformasi satu tabel dari bentuk tidak normal (0NF) secara bertahap hingga 3NF, menggunakan domain sistem akademik sederhana.
TABEL AWAL (0NF / Un-normalized Form):
NILAI_MAHASISWA(nim, nama_mahasiswa, kode_mk, nama_mk, sks, kode_prodi, nama_prodi,
nilai_huruf, nilai_angka, semester, tahun)
Contoh Data:
| nim | nama_mhs | kode_mk | nama_mk | sks | kode_prodi | nama_prodi | nilai_huruf | nilai_angka | smt | thn |
|------------|------------|---------|-----------------|-----|------------|------------|------------|------------|--------|------|
| 2021001001 | Andi | SSD1019 | Data Modelling | 3 | SSD | Sains Data | A | 4.0 | Ganjil | 2025 |
| 2021001001 | Andi | SSD2034 | Machine Learning| 3 | SSD | Sains Data | B+ | 3.5 | Ganjil | 2025 |
| 2021001002 | Budi | SSD1019 | Data Modelling | 3 | SSD | Sains Data | B | 3.0 | Ganjil | 2025 |
| 2021001002 | Budi | SSD3001 | Data Warehouse | 3 | SSD | Sains Data | A- | 3.7 | Genap | 2025 |
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
STEP 1: CEK 1NF
- Apakah ada multivalued dalam satu sel? TIDAK â
- Apakah ada repeating groups? TIDAK â
- Apakah semua nilai atomik? YA â
- PK yang logis: {nim, kode_mk, semester, tahun}
â Tabel sudah 1NF â
STEP 2: CEK 2NF
PK: {nim, kode_mk, semester, tahun}
Identifikasi FD:
nim â nama_mahasiswa â PARTIAL! (hanya bergantung pada nim)
nim â kode_prodi â PARTIAL! (hanya bergantung pada nim)
kode_mk â nama_mk â PARTIAL! (hanya bergantung pada kode_mk)
kode_mk â sks â PARTIAL! (hanya bergantung pada kode_mk)
{nim, kode_mk, semester, tahun} â nilai_huruf â FULL â
{nim, kode_mk, semester, tahun} â nilai_angka â FULL â
â Tabel BELUM 2NF! Ada partial dependency.
DEKOMPOSISI ke 2NF:
Dari nim â {nama_mahasiswa, kode_prodi}:
MAHASISWA_2NF(nim, nama_mahasiswa, kode_prodi)
Dari kode_mk â {nama_mk, sks}:
MATA_KULIAH_2NF(kode_mk, nama_mk, sks)
Tabel utama (hanya fully dependent):
NILAI_2NF(nim*, kode_mk*, semester, tahun, nilai_huruf, nilai_angka)
PK: {nim, kode_mk, semester, tahun}
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
STEP 3: CEK 3NF
Periksa ketiga tabel hasil 2NF:
MAHASISWA_2NF(nim, nama_mahasiswa, kode_prodi):
nim â nama_mahasiswa â direct, OK â
nim â kode_prodi â direct, OK â
kode_prodi â nama_prodi? â TUNGGU! nama_prodi TIDAK ADA di tabel ini!
Kita sudah memisahkannya? Belum! Periksa lagi...
Dari tabel 2NF ini: kode_prodi â nama_prodi tidak terlihat karena nama_prodi
tidak ada di tabel ini. Ini karena sudah terpisah. â
TAPI: Hati-hati â ada transitive dependency yang TERSEMBUNYI:
nim â kode_prodi, dan kode_prodi harusnya â nama_prodi
Tapi nama_prodi tidak ada di tabel ini (sudah benar!).
Hmm, tapi seharusnya kita juga butuh nama_prodi... Mari kita periksa
tabel mana yang menyimpannya. Ternyata TIDAK ADA! Kita perlu tambahkan.
REVISI: Tambahkan tabel PRODI:
PRODI(kode_prodi, nama_prodi)
MAHASISWA_2NF hanya berisi: nim, nama_mahasiswa, kode_prodi
(kode_prodi adalah FK ke PRODI)
MATA_KULIAH_2NF(kode_mk, nama_mk, sks):
kode_mk â nama_mk â direct, OK â
kode_mk â sks â direct, OK â
Tidak ada transitive dependency â sudah 3NF â
NILAI_2NF(nim*, kode_mk*, semester, tahun, nilai_huruf, nilai_angka):
{nim, kode_mk, semester, tahun} â nilai_huruf â direct â
{nim, kode_mk, semester, tahun} â nilai_angka â direct â
nilai_huruf â nilai_angka?
PERIKSA: A â B+, A- â ... ada pola? YA!
nilai_huruf â nilai_angka (A = 4.0, B+ = 3.5, dst.)
ini adalah TRANSITIVE DEPENDENCY! nilai_angka bergantung pada nilai_huruf,
bukan langsung pada PK.
â PERLU DEKOMPOSISI ke 3NF!
Dari nilai_huruf â nilai_angka:
KONVERSI_NILAI(nilai_huruf, nilai_angka)
^^^^^^^^^^^^
PK
NILAI_2NF direvisi â NILAI_3NF:
NILAI(nim*, kode_mk*, semester, tahun, nilai_huruf, nilai_angka)
PK: {nim, kode_mk, semester, tahun}
nilai_huruf â FK ke KONVERSI_NILAI
HASIL AKHIR (semua tabel dalam 3NF):
PRODI(kode_prodi, nama_prodi)
- PK: kode_prodi
MAHASISWA(nim, nama_mahasiswa, kode_prodi)
- PK: nim
- FK: kode_prodi â PRODI(kode_prodi)
MATA_KULIAH(kode_mk, nama_mk, sks)
- PK: kode_mk
KONVERSI_NILAI(nilai_huruf, nilai_angka)
- PK: nilai_huruf
NILAI(nim, kode_mk, semester, tahun, nilai_huruf)
- PK: {nim, kode_mk, semester, tahun}
- FK: nim â MAHASISWA(nim), kode_mk â MATA_KULIAH(kode_mk), nilai_huruf â KONVERSI_NILAI(nilai_huruf)
TOTAL: 5 tabel dari 1 tabel un-normalizedC.7 Ringkasan: Tiga Normal Form dalam Satu Pandangan
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â RINGKASAN: 1NF, 2NF, 3NF â
â ââââââââââââĻâââââââââââââââââââââââââĻââââââââââââââââââââââââââââââââŖ
â NF â SYARAT â MASALAH YANG DISELESAIKAN â
â ââââââââââââŦâââââââââââââââââââââââââŦââââââââââââââââââââââââââââââââŖ
â 1NF â âĸ Nilai atomik â âĸ Multivalued attribute â
â â âĸ Tidak ada repeating â âĸ Repeating groups â
â â groups â âĸ Nilai non-atomik â
â â âĸ PK ada â â
â ââââââââââââŦâââââââââââââââââââââââââŦââââââââââââââââââââââââââââââââŖ
â 2NF â âĸ Sudah 1NF â âĸ Partial dependency pada â
â â âĸ Tidak ada partial â PK komposit â
â â dependency â âĸ Redundansi akibat â
â â (hanya relevan jika â atribut yang "nebeng" â
â â PK komposit) â di tabel yang salah â
â ââââââââââââŦâââââââââââââââââââââââââŦââââââââââââââââââââââââââââââââŖ
â 3NF â âĸ Sudah 2NF â âĸ Transitive dependency â
â â âĸ Tidak ada transitive â âĸ Atribut non-kunci yang â
â â dependency â menentukan atribut non-kunciâ
â â â lainnya â
â ââââââââââââŦâââââââââââââââââââââââââŦââââââââââââââââââââââââââââââââŖ
â ANALOGI â 1NF: Setiap sel â â
â â berisi SATU nilai â â
â â â â
â â 2NF: Setiap atribut â â
â â bergantung pada â â
â â SELURUH PK â â
â â â â
â â 3NF: Setiap atribut â â
â â bergantung HANYA â â
â â pada PK, bukan â â
â â atribut lain â â
âââââââââââââŠâââââââââââââââââââââââââŠââââââââââââââââââââââââââââââââ
CARA MUDAH MENGINGAT (Parafrase dari William Kent, 1983):
"Every non-key attribute must depend on the key,
the whole key, and nothing but the key."
â "the key" = 1NF (ada PK)
â "the whole key" = 2NF (full dependency, bukan partial)
â "nothing but the key" = 3NF (tidak ada transitive)C.8 Studi Kasus: Normalisasi Sistem Pemesanan Hotel
C.8.1 Tabel Un-normalized
PEMESANAN_HOTEL (tabel mentah dari Excel staff hotel):
| id_booking | tgl_booking | nama_tamu | email_tamu | no_telp_tamu | id_kamar | tipe_kamar | harga_malam | jml_malam | total_biaya | nama_hotel | kota_hotel | fasilitas_kamar |
|------------|-------------|-------------|---------------------|--------------|----------|------------|-------------|-----------|-------------|-----------------|------------|------------------------|
| BK001 | 2025-01-10 | Andi W | andi@email.com | 081234567890 | K101 | Deluxe | 500000 | 3 | 1500000 | Hotel Santika | Semarang | AC, WiFi, TV, Kolam |
| BK002 | 2025-01-11 | Budi S | budi@email.com | 087654321098 | K205 | Suite | 1200000 | 2 | 2400000 | Hotel Santika | Semarang | AC, WiFi, TV, Jacuzzi |
| BK003 | 2025-01-12 | Andi W | andi@email.com | 081234567890 | K101 | Deluxe | 500000 | 1 | 500000 | Hotel Santika | Semarang | AC, WiFi, TV, Kolam |
| BK004 | 2025-01-15 | Citra D | citra@email.com | 089012345678 | K101 | Deluxe | 500000 | 2 | 1000000 | Hotel Mutiara | Pekalongan | AC, WiFi, TV |C.8.2 Langkah 1: Identifikasi Masalah
ANOMALI YANG ADA:
Update Anomaly: Harga kamar K101 naik â update banyak baris
BK001 (harga: 500000) + BK003 (harga: 500000) + BK004 (harga: 500000)
Insertion Anomaly: Tidak bisa daftarkan tamu baru tanpa booking
Tidak bisa simpan data Andi W jika belum pesan kamar
Deletion Anomaly: Hapus BK002 â kehilangan info kamar K205 dan Suite
Masalah Multivalued: Kolom fasilitas_kamar berisi banyak nilai!
"AC, WiFi, TV, Kolam" = 4 nilai dalam 1 sel â pelanggaran 1NFC.8.3 Langkah 2: Normalisasi ke 1NF
CEK 1NF:
Pelanggaran: fasilitas_kamar berisi lebih dari 1 nilai per sel.
TINDAKAN:
- Pisahkan fasilitas_kamar menjadi tabel tersendiri
- Tentukan PK yang tepat: {id_booking, id_kamar} â tunggu, lihat lagi...
â satu booking sudah pasti untuk satu kamar, jadi PK: id_booking saja?
â Tidak! Tabel ini mencakup info level booking DAN level kamar.
â Untuk saat ini, PK sementara: id_booking (karena satu booking = satu kamar)
TABEL SETELAH 1NF:
PEMESANAN_1NF(id_booking, tgl_booking, nama_tamu, email_tamu, no_telp_tamu,
id_kamar, tipe_kamar, harga_malam, jml_malam, total_biaya,
nama_hotel, kota_hotel)
PK: id_booking
KAMAR_FASILITAS(id_kamar, fasilitas) â pisahkan multivalued
PK: {id_kamar, fasilitas}
| id_kamar | fasilitas |
|----------|-----------|
| K101 | AC |
| K101 | WiFi |
| K101 | TV |
| K101 | Kolam |
| K205 | AC |
| K205 | WiFi |
| K205 | TV |
| K205 | Jacuzzi |C.8.4 Langkah 3: Normalisasi ke 2NF
CEK 2NF pada PEMESANAN_1NF:
PK: id_booking (single column â otomatis 2NF? Cek dulu FD-nya...)
Meski PK single-column, kita perlu cek apakah ada FD internal yang bermasalah:
id_booking â tgl_booking, nama_tamu, email_tamu, no_telp_tamu, id_kamar â
id_booking â jml_malam, total_biaya â
id_kamar â tipe_kamar â id_kamar bukan PK, tapi menentukan non-key atribut lain
id_kamar â harga_malam â sama, ini bukan 2NF tapi masalah 3NF (transitive)
id_kamar â nama_hotel â transitive dependency via id_kamar
id_kamar â kota_hotel â transitive dependency via id_kamar
email_tamu â nama_tamu â email unik per tamu (transitive via email)
email_tamu â no_telp_tamu â transitive via email
PK adalah single column â tidak ada partial dependency â sudah 2NF â
(Masalah yang ada adalah transitive dependency â tangani di 3NF)
CEK 2NF pada KAMAR_FASILITAS:
PK: {id_kamar, fasilitas} (komposit)
Tidak ada atribut non-kunci lain â tidak mungkin partial/transitive â sudah 3NF âC.8.5 Langkah 4: Normalisasi ke 3NF
CEK 3NF pada PEMESANAN_1NF:
Transitive dependencies yang ditemukan:
id_booking â email_tamu â nama_tamu â TRANSITIVE â
id_booking â email_tamu â no_telp_tamu â TRANSITIVE â
id_booking â id_kamar â tipe_kamar â TRANSITIVE â
id_booking â id_kamar â harga_malam â TRANSITIVE â
id_booking â id_kamar â nama_hotel â TRANSITIVE â
id_booking â id_kamar â kota_hotel â TRANSITIVE â
DEKOMPOSISI ke 3NF:
Dari email_tamu â {nama_tamu, no_telp_tamu}:
â Buat tabel: TAMU(email_tamu, nama_tamu, no_telp_tamu)
^^^^^^^^^^
PK
Dari id_kamar â {tipe_kamar, harga_malam, nama_hotel, kota_hotel}:
â Buat tabel: KAMAR(id_kamar, tipe_kamar, harga_malam, nama_hotel, kota_hotel)
^^^^^^^^
PK
Tabel PEMESANAN bersih (hanya atribut yang langsung bergantung pada id_booking):
PEMESANAN(id_booking, tgl_booking, email_tamu*, id_kamar*, jml_malam, total_biaya)
^^^^^^^^^^
PK
HASIL AKHIR (3NF):
TAMU(email_tamu, nama_tamu, no_telp_tamu)
^^^^^^^^^^
KAMAR(id_kamar, tipe_kamar, harga_malam, nama_hotel, kota_hotel)
^^^^^^^^
PEMESANAN(id_booking, tgl_booking, email_tamu*, id_kamar*, jml_malam)
^^^^^^^^^^
(total_biaya dihapus â derived dari harga_malam à jml_malam)
KAMAR_FASILITAS(id_kamar*, fasilitas)
PK: {id_kamar, fasilitas}
Total: 4 tabel dari 1 tabel mentah. Semua anomali telah teratasi!
VERIFIKASI AKHIR:
Update harga kamar â update 1 baris di KAMAR â
Insert tamu baru tanpa booking â bisa (insert ke TAMU) â
Hapus semua booking â data TAMU dan KAMAR tetap ada â
Tambah fasilitas kamar baru â insert ke KAMAR_FASILITAS âD. PRAKTIKUM TERBIMBING
D.1 Latihan 1: Identifikasi Anomali dan FD (Berpasangan, 10 menit)
Perhatikan tabel berikut dan jawab pertanyaan di bawahnya:
Tabel: PENDAFTARAN_KURSUS
| id_pendaftaran | nama_peserta | email_peserta | kota_peserta | kode_kursus | nama_kursus | nama_instruktur | biaya | status_bayar |
|---|---|---|---|---|---|---|---|---|
| REG001 | Siti Rahma | siti@mail.com | Semarang | KRS-01 | Python Dasar | Pak Hendra | 500000 | Lunas |
| REG002 | Andi Wijaya | andi@mail.com | Pekalongan | KRS-01 | Python Dasar | Pak Hendra | 500000 | Belum |
| REG003 | Siti Rahma | siti@mail.com | Jakarta | KRS-02 | Machine Learning | Bu Dewi | 750000 | Lunas |
| REG004 | Budi Santoso | budi@mail.com | Semarang | KRS-01 | Python Dasar | Pak Hendra | 500000 | Lunas |
Pertanyaan:
-
Identifikasi anomali (berikan contoh konkret dari tabel di atas):
- Update Anomaly: ___________________________________________________
- Insertion Anomaly: _________________________________________________
- Deletion Anomaly: __________________________________________________
-
Identifikasi semua Functional Dependency yang berlaku: (Petunjuk: Pikirkan nilai mana yang "menentukan" nilai lainnya berdasarkan aturan bisnis)
_____ â nama_kursus _____ â nama_instruktur _____ â biaya _____ â nama_peserta _____ â kota_peserta _____ â status_bayar
-
Tentukan PK yang tepat untuk tabel ini dan jelaskan alasannya: PK: _______________ Alasan: _________________________________________
-
Apakah ada partial dependency? Jika ya, sebutkan!
-
Apakah ada transitive dependency? Jika ya, sebutkan!
D.2 Praktikum: Normalisasi End-to-End (Individual, 20 menit)
Instruksi: Normalisasikan tabel berikut secara bertahap dari 0NF hingga 3NF. Dokumentasikan setiap langkah (cek kondisi, identifikasi masalah, tindakan dekomposisi, hasil).
Tabel: LAPORAN_PENJUALAN (dari sistem toko elektronik)
| id_transaksi | tgl_transaksi | id_kasir | nama_kasir | shift_kasir | id_pelanggan | nama_pelanggan | no_telp_pelanggan | kode_barang | nama_barang | kategori_barang | harga_jual | qty | diskon_pct | total_item |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TR001 | 2025-01-10 | KSR01 | Hendra | Pagi | PLG001 | Andi W | 08123 | ELK001 | Laptop ASUS | Laptop | 8000000 | 1 | 10 | 7200000 |
| TR001 | 2025-01-10 | KSR01 | Hendra | Pagi | PLG001 | Andi W | 08123 | ELK005 | Mouse Logitech | Aksesoris | 150000 | 2 | 0 | 300000 |
| TR002 | 2025-01-11 | KSR02 | Siti | Siang | PLG002 | Budi S | 08765 | ELK001 | Laptop ASUS | Laptop | 8000000 | 1 | 5 | 7600000 |
| TR003 | 2025-01-12 | KSR01 | Hendra | Malam | PLG001 | Andi W | 08123 | ELK010 | Printer Canon | Printer | 2500000 | 1 | 0 | 2500000 |
Panduan Pengerjaan:
LANGKAH 1: Cek 1NF
- Apakah ada multivalued attribute? _______
- Apakah ada repeating groups? _______
- Tentukan PK: _______
- Apakah sudah 1NF? _______
- Jika belum: dekomposisi
LANGKAH 2: Cek 2NF
- PK adalah: _______ (single/komposit?)
- Jika komposit, identifikasi semua FD:
___ â ___ (full/partial?)
___ â ___ (full/partial?)
...
- Apakah ada partial dependency? _______
- Jika ada: dekomposisi
LANGKAH 3: Cek 3NF
- Untuk setiap tabel hasil 2NF, cek transitive dependency:
___ â ___ â ___ (transitive?)
...
- Jika ada: dekomposisi
LANGKAH 4: Tulis hasil akhir dalam notasi skema relasionalE. EVALUASI DAN PENILAIAN
E.1 Kuis Penutup (10 menit, bobot partisipasi)
-
Jelaskan dengan singkat apa yang dimaksud dengan update anomaly dan berikan satu contoh konkret dari domain yang kamu pilih untuk proyek!
-
Diberikan tabel
KONTRAK(no_kontrak, kode_vendor, nama_vendor, kota_vendor, kode_item, nama_item, harga, qty)dengan PK{no_kontrak, kode_item}. Sebutkan semua partial dependency yang ada dalam tabel ini! -
Tabel berikut sudah 2NF:
KARYAWAN(emp_id, nama, dept_id, nama_dept, gaji). Apakah tabel ini sudah 3NF? Jika tidak, identifikasi transitive dependency-nya dan lakukan dekomposisi! -
Mengapa tabel dengan single-column PK yang sudah 1NF otomatis juga 2NF? Jelaskan alasannya secara konseptual!
-
Setelah normalisasi, sebuah database yang awalnya 1 tabel menjadi 6 tabel. Apa keuntungan yang diperoleh? Apa kerugian atau potensi masalah yang mungkin muncul?
E.2 Tugas Normalisasi (dikumpulkan sebelum pertemuan 7)
Judul: Normalisasi Logical Model Proyek
Konteks: Tugas ini adalah kelanjutan dari tugas mapping pertemuan 5. Mahasiswa akan mengaudit dan memperbaiki skema relasional yang sudah dibuat, memastikan semuanya memenuhi 3NF.
Ketentuan:
Bagian 1: Audit Skema Existing (analisis)
Untuk setiap tabel dalam logical model dari pertemuan 5:
- Tuliskan semua Functional Dependency yang berlaku
- Identifikasi apakah ada pelanggaran 1NF, 2NF, atau 3NF
- Beri kesimpulan: tabel sudah di normal form mana?
Format tabel audit:
| Nama Tabel | FD yang Ada | Pelanggaran NF | Kesimpulan |
|---|---|---|---|
| 1NF / 2NF / 3NF / Tidak ada | Sudah/Belum 3NF |
Bagian 2: Dekomposisi (jika ada pelanggaran)
Untuk setiap tabel yang belum 3NF:
- Tunjukkan langkah dekomposisi secara bertahap (0NF â 1NF â 2NF â 3NF)
- Tulis skema tabel baru yang dihasilkan
Bagian 3: Skema Final (setelah normalisasi)
- Tulis ulang skema lengkap semua tabel dalam format notasi relasional
- Tambahkan komentar singkat: "Tabel ini dalam 3NF karena..."
- Bandingkan jumlah tabel sebelum dan sesudah normalisasi
Bagian 4: Reflection (setengah halaman)
- Apakah logical model dari pertemuan 5 sudah sebagian besar 3NF, atau banyak yang perlu diubah?
- Kesalahan desain apa yang paling sering kamu temukan dalam auditmu sendiri?
- Bagaimana normalisasi mengubah cara kamu melihat desain tabel?
Format: PDF, minimal 4 halaman, font 11pt, margin 2.5cm
Nama file: Normalisasi_[NIM]_[Nama]_[Domain].pdf
Deadline: Dikumpulkan ke Ngaji UIN Gusdur sebelum jam kuliah pertemuan 7 dimulai
F. PERSIAPAN PERTEMUAN 7
F.1 Yang Akan Dipelajari
Pertemuan 7 membahas Normalisasi Lanjutan dan Evaluasi Model Data â meliputi Boyce-Codd Normal Form (BCNF), trade-off normalisasi vs performa (kapan tidak menormalisasi?), dan sesi validasi/review model data proyek semester. Ini adalah pertemuan terakhir sebelum UTS.
Topik utama pertemuan 7:
- BCNF: versi 3NF yang lebih ketat â mengapa 3NF saja terkadang tidak cukup?
- Trade-off normalisasi vs denormalisasi: kapan aturan boleh "dilanggar" untuk performa?
- Validasi logical model: checklist komprehensif untuk memastikan model siap
- Review proyek semester: sesi peer review dan umpan balik
F.2 Bacaan Wajib Sebelum Pertemuan 7
- Elmasri & Navathe, Chapter 15: Basics of Functional Dependencies and Normalization â Bagian BCNF
- Hoberman, Chapter 8: When NOT to Normalize
F.3 Pertanyaan Pemantik untuk Pertemuan 7
Bayangkan sebuah sistem e-commerce dengan ratusan ribu transaksi per hari. Tabel utamanya sudah 3NF dengan banyak JOIN diperlukan untuk mengambil data laporan penjualan harian.
- Apakah kita tetap mempertahankan 3NF meskipun laporan menjadi lambat?
- Apa alternatif yang bisa dilakukan?
- Apa risiko "melonggarkan" normalisasi?
G. REFERENSI
G.1 Referensi Utama
-
Elmasri, R. & Navathe, S. B. (2015). Fundamentals of Database Systems (7th Edition). Pearson. ISBN: 978-0133970777
- Chapter 14: Basics of Functional Dependencies and Normalization for Relational Databases (bacaan utama pertemuan ini)
- Section 14.1: Informal Design Guidelines
- Section 14.2: Functional Dependencies
- Section 14.3: Normal Forms Based on Primary Keys (1NF, 2NF, 3NF)
-
Hoberman, S. (2009). Data Modeling Made Simple (2nd Edition). Technics Publications. ISBN: 978-0977140060
- Chapter 7: Normalization â Why and How
- Section 7.1â7.4: 1NF, 2NF, 3NF dengan contoh praktis
-
Connolly, T. & Begg, C. (2014). Database Systems: A Practical Approach to Design, Implementation, and Management (6th Edition). Pearson.
- Chapter 14: Normalization
- Section 14.2â14.5: Functional Dependency, 1NF, 2NF, 3NF
G.2 Referensi Pendukung
-
Date, C. J. (2012). Database Design and Relational Theory: Normal Forms and All That Jazz. O'Reilly Media.
- Chapter 3: Normalization: Some Preliminaries
- Chapter 4: First, Second, and Third Normal Forms
-
Kent, W. (1983). "A Simple Guide to Five Normal Forms in Relational Database Theory." Communications of the ACM, 26(2), 120â125. (Makalah klasik yang memperkenalkan parafrase "the key, the whole key, nothing but the key")
G.3 Referensi Online
- Tutorialspoint. "DBMS â Normalization" â https://www.tutorialspoint.com/dbms/database_normalization.htm (opens in a new tab)
- Database Star. "Database Normalization: A Step-By-Step Guide" â https://www.databasestar.com/database-normalization/ (opens in a new tab)
- Guru99. "1NF, 2NF, 3NF, BCNF in Database Normalization" â https://www.guru99.com/database-normalization.html (opens in a new tab)
G.4 Video Resources
- Decomplexify â "Learn Database Normalization â 1NF, 2NF, 3NF, 4NF, 5NF" (YouTube â penjelasan visual terbaik)
- freeCodeCamp â "Database Design Course" â Bagian Normalisasi (YouTube)
- Khan Academy â "Relational Databases: Data Modeling" (YouTube â pengantar yang ramah pemula)
H. LAMPIRAN
Lampiran A: Lembar Kerja Praktikum Pertemuan 6
LEMBAR KERJA: NORMALISASI DATA Nama: ___________________________ NIM: _______________ Tanggal: ________________________
BAGIAN 1: Identifikasi Anomali â Tabel PENDAFTARAN_KURSUS
| Jenis Anomali | Contoh Konkret dari Tabel | Dampak |
|---|---|---|
| Update Anomaly | ||
| Insertion Anomaly | ||
| Deletion Anomaly |
BAGIAN 2: Identifikasi Functional Dependency
Tuliskan semua FD yang berlaku dalam tabel LAPORAN_PENJUALAN:
| Determinant (A) | Dependent (B) | Jenis FD | Apakah Masalah? |
|---|---|---|---|
| Full / Partial / Transitive | Ya / Tidak | ||
BAGIAN 3: Proses Normalisasi Bertahap
Tabel Awal (tulis nama dan kolom):
_________________________________ (_____________________)
PK: ___________________CEK 1NF:
- Multivalued attribute: Ada / Tidak â ___________________________
- Repeating groups: Ada / Tidak â _______________________________
- Tindakan: _____________________________________________________
- Hasil 1NF: ____________________________________________________
CEK 2NF:
- PK tabel: __________________ (single / komposit)
- Partial dependency: Ada / Tidak Jika ada: ___________________________________________________
- Dekomposisi: Tabel baru 1: _______________________________________________ Tabel baru 2: _______________________________________________
- Hasil 2NF: ___________________________________________________
CEK 3NF:
- Transitive dependency: Ada / Tidak Jika ada: ___________________________________________________
- Dekomposisi: Tabel baru 1: _______________________________________________ Tabel baru 2: _______________________________________________
- Hasil 3NF: ___________________________________________________
BAGIAN 4: Skema Relasional Final
Tulis skema semua tabel hasil normalisasi:
1. _______________________________________________
2. _______________________________________________
3. _______________________________________________
4. _______________________________________________
5. _______________________________________________Refleksi Singkat (2-3 kalimat):
Lampiran B: Panduan Cepat Identifikasi Normal Form
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â PANDUAN CEPAT: CEK NORMAL FORM SEBUAH TABEL â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŖ
â â
â LANGKAH 1: CEK 1NF â
â âââââââââââââââââââ â
â Pertanyaan: â
â ⥠Ada sel yang berisi lebih dari satu nilai? â Tidak 1NF â
â ⥠Ada kelompok kolom berulang (A1, A2, A3...)? â Tidak 1NF â
â ⥠Sudah ada PK yang jelas? â Kalau tidak, tentukan dulu â
â â
â Jika semua OK â Lanjut ke 2NF â
â â
â LANGKAH 2: CEK 2NF â
â âââââââââââââââââââ â
â Prasyarat: PK HARUS KOMPOSIT untuk ada risiko partial dep. â
â â
â Pertanyaan: â
â ⥠PK-nya komposit? Jika tidak â otomatis 2NF, skip ke 3NF â
â ⥠Ada atribut non-kunci yang bergantung hanya pada â
â SEBAGIAN PK? â Partial dependency â Tidak 2NF â
â â
â Cara cek: Untuk setiap bagian PK secara terpisah, â
â tanyakan: "Apakah [bagian PK ini] saja sudah cukup â
â menentukan [atribut non-kunci ini]?" â
â Jika ya â partial dependency! â
â â
â Jika semua OK â Lanjut ke 3NF â
â â
â LANGKAH 3: CEK 3NF â
â âââââââââââââââââââ â
â Pertanyaan: â
â ⥠Ada atribut non-kunci (X) yang menentukan â
â atribut non-kunci lain (Y)? X â Y? â
â ⥠Apakah X adalah candidate key? Jika tidak â Tidak 3NF â
â â
â Tanda bahaya: Jika ada atribut yang "berasa seperti" â
â FK tapi belum jadi FK â kemungkinan transitive dependency! â
â (misal: ada dept_id dan nama_dept di tabel KARYAWAN) â
â â
â Jika semua OK â Tabel sudah 3NF â â
â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââŖ
â â
â CARA DEKOMPOSISI: â
â â
â Partial dependency A â B (A bagian dari PK komposit {A,C}): â
â â Buat tabel baru: TABEL_A(A, B) â A jadi PK baru â
â â Hapus B dari tabel asli â
â â A tetap di tabel asli sebagai FK ke TABEL_A â
â â
â Transitive dependency X â Y (X adalah non-kunci): â
â â Buat tabel baru: TABEL_X(X, Y) â X jadi PK baru â
â â Hapus Y dari tabel asli â
â â X tetap di tabel asli sebagai FK ke TABEL_X â
â â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââLampiran C: Checklist Normalisasi (untuk Tugas dan Proyek)
1NF Checklist:
- Tidak ada sel yang berisi lebih dari satu nilai (tidak ada daftar dalam sel)
- Tidak ada kelompok kolom berulang (A1, A2, A3, ...)
- Setiap baris dapat dibedakan secara unik (ada primary key)
- Setiap kolom berisi nilai dari satu domain yang sama
2NF Checklist (hanya untuk tabel dengan PK komposit):
- Semua atribut non-kunci bergantung pada SELURUH PK, bukan hanya sebagian
- Setiap partial dependency sudah dipisah menjadi tabel tersendiri
- Tabel tersendiri hasil pemisahan sudah diberi PK yang tepat
- FK sudah ditambahkan ke tabel asal untuk mempertahankan relasi
3NF Checklist:
- Tidak ada atribut non-kunci yang menentukan atribut non-kunci lain
- Tidak ada "FD tersembunyi" antar kolom non-kunci (perhatikan kolom yang tampak seperti FK tapi belum jadi FK)
- Setiap transitive dependency sudah dipisah menjadi tabel tersendiri
- Tabel hasil pemisahan sudah diberi PK yang tepat
- FK sudah ditambahkan ke tabel asal
Kelengkapan Umum:
- Semua tabel hasil normalisasi masih mempertahankan semua informasi asli (lossless)
- Semua FK terdefinisi dengan benar
- Nama tabel dan kolom konsisten
- Derived attribute tidak disimpan sebagai kolom (kecuali ada alasan khusus)
Lampiran D: Contoh Dokumentasi Functional Dependency
Gunakan format diagram FD berikut untuk mendokumentasikan ketergantungan dalam suatu tabel:
FORMAT DIAGRAM FD:
RELASI: NAMA_TABEL(kolom1, kolom2, kolom3, ...)
^^^^^^
PK
FD SET:
F1: kolom1 ââââââââââââââââââââââââââââââââ kolom2
(deskripsi mengapa FD ini berlaku)
F2: kolom1 ââââââââââââââââââââââââââââââââ kolom3, kolom4
(satu determinant bisa menentukan banyak atribut)
F3: kolom3 ââââââââ kolom5
MASALAH: kolom3 bukan PK â transitive dependency!
Rantai transitive:
kolom1 âââ kolom3 âââ kolom5
PK non-key non-key
â â
determinant yang valid mediator (bukan PK â masalah 3NF!)
DIAGNOSIS:
- 1NF: â/â (alasan)
- 2NF: â/â (alasan; jika PK single â otomatis 2NF)
- 3NF: â/â (alasan; sebutkan transitive dependency jika ada)
DEKOMPOSISI (jika diperlukan):
Dari F3 (transitive: kolom3 â kolom5):
â Tabel baru: TABEL_BARU(kolom3, kolom5)
â Tabel asli: hapus kolom5, kolom3 menjadi FK ke TABEL_BARUPENUTUP
Pertemuan 6 melengkapi kemampuan merancang logical model yang benar secara teoritis. Normalisasi bukan sekedar latihan akademik â ini adalah fondasi database yang dapat dipercaya, mudah dikelola, dan bebas dari inkonsistensi yang tersembunyi.
Key Messages Pertemuan 6:
- Anomali data (update, insertion, deletion) adalah gejala â penyebabnya adalah redundansi. Normalisasi mengobati penyebab, bukan gejalanya
- Functional Dependency adalah bahasa formal untuk mendeskripsikan hubungan atribut â pahami FD, dan normalisasi menjadi mekanis dan sistematis
- "The key, the whole key, and nothing but the key" â parafrase paling mudah untuk mengingat syarat 1NF, 2NF, dan 3NF
- Setiap dekomposisi harus lossless â kita tidak boleh kehilangan informasi saat memecah tabel
- 3NF bukan tujuan akhir â ini adalah standar minimum yang harus dipenuhi sebelum membangun sistem produksi
- Ada satu kasus tepi penting di mana tabel yang sudah memenuhi 3NF masih bisa mengalami anomali: ketika sebuah tabel memiliki multiple overlapping candidate keys (dua atau lebih candidate key yang berbagi atribut). Di sinilah 3NF tidak cukup â dan BCNF hadir untuk menutup celah ini
Koneksi ke Proyek Semester: Tugas normalisasi pertemuan ini adalah Tahap 4 dari proyek bertahap â Validated Logical Model. Setelah pertemuan ini, model data kamu seharusnya sudah siap secara teoritis untuk diimplementasikan. Pertemuan 7 (Tahap 5 â peer review) akan memvalidasi model ini, sebelum Pertemuan 9 (Tahap 6 â Physical Model) mengimplementasikannya ke dalam SQL DDL scripts.
Preview Pertemuan 7 (Pertemuan Terakhir Sebelum UTS):
Kita akan belajar BCNF â Boyce-Codd Normal Form, versi 3NF yang lebih ketat. Kasus pemicunya: bayangkan sebuah tabel pendaftaran kursus di mana satu instruktur hanya mengajar satu kursus (sehingga instruktur â kursus), tapi satu kursus bisa diajarkan oleh banyak instruktur. Tabel ini bisa memenuhi 3NF namun masih mengandung anomali update. Pertemuan 7 akan mengupas kasus ini secara mendalam, plus mendiskusikan kapan denormalisasi disengaja untuk performa. Bawa hasil tugas normalisasi untuk didiskusikan!
Disusun oleh: Mohammad Reza Maulana, M.Kom Program Studi Sains Data Fakultas Ekonomi dan Bisnis Islam UIN K.H. Abdurrahman Wahid Pekalongan
Revisi: Februari 2026