Dalam pembuatan aplikasi berbasis database, salah satu hal penting yang perlu diperhatikan adalah bagaimana menyusun data agar terstruktur, tidak berulang secara berlebihan, dan mudah dikelola.
Misalnya, ketika membuat aplikasi akademik, data mahasiswa, dosen, mata kuliah, dan nilai sebaiknya tidak disimpan secara sembarangan dalam satu tabel besar. Jika struktur database tidak dirancang dengan baik, kita dapat mengalami masalah seperti data ganda, kesulitan memperbarui informasi, hingga ketidakkonsistenan data.
Salah satu teknik yang digunakan untuk mengatasi permasalahan tersebut adalah normalisasi database.
Normalisasi database merupakan proses mengorganisasi struktur tabel dan hubungan antartabel agar data tersimpan secara lebih teratur serta mengurangi redundansi atau pengulangan data yang tidak diperlukan.
Dalam perancangan database relasional, terdapat beberapa tahapan normalisasi yang dikenal sebagai First Normal Form (1NF), Second Normal Form (2NF), dan Third Normal Form (3NF).
Pada artikel ini, kita akan mempelajari pengertian normalisasi database, tujuan penerapannya, perbedaan 1NF, 2NF, dan 3NF, serta contoh proses normalisasi menggunakan studi kasus sederhana.
1. Apa Itu Normalisasi Database?
Normalisasi database adalah proses mengatur struktur database dengan membagi data ke dalam beberapa tabel berdasarkan hubungan dan ketergantungan antaratribut.
Tujuannya adalah mengurangi pengulangan data, menjaga konsistensi informasi, serta mempermudah proses pengelolaan database.
Normalisasi biasanya dilakukan ketika merancang database relasional, terutama pada aplikasi yang memiliki banyak jenis data dan hubungan antartabel.
Sebagai contoh, sebuah aplikasi akademik menyimpan informasi mahasiswa, mata kuliah, dosen, dan nilai. Jika seluruh informasi tersebut disimpan dalam satu tabel, nama mahasiswa, nama mata kuliah, dan nama dosen dapat berulang berkali-kali.
Kondisi tersebut dapat menyebabkan redundansi data.
Dengan normalisasi, informasi dapat dipisahkan ke dalam tabel yang lebih terstruktur, kemudian dihubungkan menggunakan Primary Key dan Foreign Key.
2. Tujuan dan Manfaat Normalisasi Database
Normalisasi database bukan hanya bertujuan membagi satu tabel menjadi beberapa tabel. Proses ini juga bertujuan memastikan bahwa struktur database memiliki hubungan yang tepat dan dapat dikelola dengan baik.
Berikut beberapa tujuan dan manfaat normalisasi database.
A. Mengurangi Redundansi Data
Redundansi adalah kondisi ketika informasi yang sama disimpan berulang kali tanpa kebutuhan yang jelas.
Contohnya, nama mahasiswa dan nama jurusan ditulis berulang pada setiap baris nilai.
Dengan normalisasi, informasi mahasiswa dapat disimpan pada tabel tersendiri sehingga tidak perlu ditulis ulang pada setiap transaksi atau aktivitas akademik.
B. Menjaga Konsistensi Data
Ketika data yang sama disimpan di banyak tempat, perubahan informasi dapat menyebabkan perbedaan nilai.
Misalnya, nama jurusan berubah dari Teknik Informatika menjadi Informatika. Jika nama tersebut tersimpan pada banyak baris, seluruh data yang terkait harus diperbarui.
Normalisasi membantu mengurangi risiko ketidakkonsistenan tersebut.
C. Mencegah Anomali Data
Struktur database yang kurang baik dapat menyebabkan beberapa masalah yang disebut anomali data.
Terdapat tiga jenis anomali yang umum dibahas:
- Insert Anomaly: kesulitan menambahkan data baru karena data lain yang tidak seharusnya wajib tersedia.
- Update Anomaly: perubahan informasi harus dilakukan pada banyak baris sehingga berisiko menghasilkan data yang tidak konsisten.
- Delete Anomaly: penghapusan suatu data dapat menyebabkan informasi lain yang masih dibutuhkan ikut hilang.
Normalisasi membantu mengurangi risiko ketiga permasalahan tersebut.
D. Mempermudah Pemeliharaan Database
Database yang terstruktur akan lebih mudah dikembangkan, diperbarui, dan dipelihara.
Ketika aplikasi bertambah kompleks, pengelolaan data dapat dilakukan melalui tabel-tabel yang memiliki fungsi dan hubungan masing-masing.
E. Mempermudah Pengelolaan Relasi Antartabel
Normalisasi membantu menentukan hubungan antarentitas, seperti mahasiswa dengan nilai, pelanggan dengan transaksi, serta produk dengan kategori.
Hubungan tersebut dapat diterapkan menggunakan Primary Key dan Foreign Key.
3. Mengenal Bentuk Normalisasi Database (Normal Forms)
Dalam normalisasi database, terdapat beberapa tingkatan atau bentuk normal yang digunakan untuk memperbaiki struktur tabel.
Tiga bentuk normal yang paling sering dipelajari adalah:
- First Normal Form (1NF).
- Second Normal Form (2NF).
- Third Normal Form (3NF).
Selain ketiga bentuk tersebut, terdapat juga Boyce-Codd Normal Form (BCNF), Fourth Normal Form (4NF), dan Fifth Normal Form (5NF) untuk kebutuhan desain yang lebih kompleks.
Pada pembahasan ini, kita akan berfokus pada 1NF, 2NF, dan 3NF karena ketiganya merupakan dasar penting dalam pembelajaran perancangan database.
4. First Normal Form (1NF)
First Normal Form atau 1NF merupakan bentuk normal pertama dalam proses normalisasi database. Sebuah tabel memenuhi 1NF jika setiap kolom menyimpan nilai yang bersifat atomik atau satu nilai pada setiap baris dan kolom, serta tidak menggunakan kelompok data berulang dalam satu kolom.
Dengan kata lain, satu sel tabel sebaiknya hanya berisi satu nilai untuk atribut yang didefinisikan.
Contoh Tabel Sebelum 1NF
Misalnya, sebuah aplikasi akademik menyimpan data mahasiswa dan mata kuliah yang diambil.
| id_mahasiswa | nama_mahasiswa | mata_kuliah |
|---|---|---|
| 1 | Andi | Basis Data, Pemrograman Web |
| 2 | Budi | Jaringan Komputer |
| 3 | Citra | Basis Data, Sistem Informasi |
Pada tabel tersebut, kolom mata_kuliah berisi lebih dari satu nilai dalam satu sel.
Struktur seperti ini tidak memenuhi prinsip 1NF karena data mata kuliah belum disimpan secara atomik.
Contoh Tabel Setelah 1NF
Untuk memenuhi 1NF, setiap mata kuliah disimpan pada baris yang terpisah.
| id_mahasiswa | nama_mahasiswa | mata_kuliah |
|---|---|---|
| 1 | Andi | Basis Data |
| 1 | Andi | Pemrograman Web |
| 2 | Budi | Jaringan Komputer |
| 3 | Citra | Basis Data |
| 3 | Citra | Sistem Informasi |
Sekarang, setiap kolom hanya memiliki satu nilai pada setiap baris.
Namun, tabel tersebut masih memiliki pengulangan nama mahasiswa. Oleh karena itu, kita perlu melanjutkan proses normalisasi ke tahap berikutnya.
5. Second Normal Form (2NF)
Second Normal Form atau 2NF merupakan bentuk normal kedua yang bertujuan menghilangkan ketergantungan parsial atau partial dependency.
Sebuah tabel harus terlebih dahulu memenuhi 1NF sebelum dapat dikatakan memenuhi 2NF. Selain itu, setiap atribut non-prime harus bergantung secara penuh pada seluruh candidate key, bukan hanya sebagian dari kunci gabungan.
Ketergantungan parsial biasanya ditemukan pada tabel yang menggunakan Composite Primary Key atau Primary Key gabungan.
Contoh Tabel Sebelum 2NF
Kita menggunakan tabel mahasiswa dan mata kuliah dari contoh sebelumnya. Misalnya, kombinasi id_mahasiswa dan id_mata_kuliah digunakan sebagai Primary Key gabungan.
| id_mahasiswa | nama_mahasiswa | id_mata_kuliah | nama_mata_kuliah |
|---|---|---|---|
| 1 | Andi | MK01 | Basis Data |
| 1 | Andi | MK02 | Pemrograman Web |
| 2 | Budi | MK03 | Jaringan Komputer |
| 3 | Citra | MK01 | Basis Data |
Pada tabel tersebut:
id_mahasiswamenentukannama_mahasiswa.id_mata_kuliahmenentukannama_mata_kuliah.- Kombinasi kedua ID digunakan untuk mengidentifikasi satu baris data secara unik.
Masalahnya, nama mahasiswa hanya bergantung pada sebagian Primary Key, yaitu id_mahasiswa. Begitu juga nama mata kuliah hanya bergantung pada id_mata_kuliah. Kondisi tersebut disebut ketergantungan parsial.
Contoh Tabel Setelah 2NF
Untuk menghilangkan ketergantungan parsial, tabel tersebut dapat dipecah menjadi tiga tabel.
Tabel mahasiswa
| id_mahasiswa | nama_mahasiswa |
|---|---|
| 1 | Andi |
| 2 | Budi |
| 3 | Citra |
Tabel mata_kuliah
| id_mata_kuliah | nama_mata_kuliah |
|---|---|
| MK01 | Basis Data |
| MK02 | Pemrograman Web |
| MK03 | Jaringan Komputer |
Tabel krs
| id_mahasiswa | id_mata_kuliah |
|---|---|
| 1 | MK01 |
| 1 | MK02 |
| 2 | MK03 |
| 3 | MK01 |
Pada struktur tersebut:
- Tabel mahasiswa menyimpan informasi mahasiswa.
- Tabel mata_kuliah menyimpan informasi mata kuliah.
- Tabel krs menyimpan hubungan antara mahasiswa dan mata kuliah.
Dengan demikian, atribut nama mahasiswa dan nama mata kuliah tidak lagi bergantung pada sebagian dari kunci gabungan.
Perlu diperhatikan bahwa tabel krs menggunakan kombinasi id_mahasiswa dan id_mata_kuliah sebagai Primary Key gabungan agar pasangan mahasiswa dan mata kuliah tidak tercatat berulang.
6. Third Normal Form (3NF)
Third Normal Form atau 3NF merupakan bentuk normal ketiga yang bertujuan menghilangkan ketergantungan transitif atau transitive dependency pada atribut non-prime.
Sebuah tabel harus memenuhi 2NF sebelum dapat dikatakan memenuhi 3NF.
Secara sederhana, atribut non-prime harus bergantung pada candidate key, seluruh candidate key, dan tidak bergantung secara transitif pada candidate key melalui atribut non-prime lainnya.
Contoh Tabel Sebelum 3NF
Misalnya, kita memiliki tabel mahasiswa yang menyimpan informasi jurusan.
| id_mahasiswa | nama_mahasiswa | id_jurusan | nama_jurusan |
|---|---|---|---|
| 1 | Andi | J01 | Informatika |
| 2 | Budi | J02 | Sistem Informasi |
| 3 | Citra | J01 | Informatika |
| 4 | Dedi | J03 | Teknik Komputer |
Pada tabel tersebut terdapat ketergantungan:
id_mahasiswamenentukannama_mahasiswa.id_mahasiswamenentukanid_jurusan.id_jurusanmenentukannama_jurusan.
Dengan demikian, nama jurusan bergantung pada ID jurusan, bukan secara langsung pada identitas mahasiswa. Hal tersebut merupakan contoh ketergantungan transitif.
Contoh Tabel Setelah 3NF
Untuk menghilangkan ketergantungan transitif, tabel tersebut dipisahkan menjadi dua tabel.
Tabel mahasiswa
| id_mahasiswa | nama_mahasiswa | id_jurusan |
|---|---|---|
| 1 | Andi | J01 |
| 2 | Budi | J02 |
| 3 | Citra | J01 |
| 4 | Dedi | J03 |
Tabel jurusan
| id_jurusan | nama_jurusan |
|---|---|
| J01 | Informatika |
| J02 | Sistem Informasi |
| J03 | Teknik Komputer |
Pada struktur tersebut, informasi jurusan hanya disimpan satu kali pada tabel jurusan. Sementara itu, tabel mahasiswa menyimpan id_jurusan sebagai Foreign Key yang menghubungkan mahasiswa dengan jurusannya.
Dengan demikian, pengulangan nama jurusan dapat dikurangi dan perubahan informasi jurusan dapat dikelola melalui satu tabel.
7. Perbedaan 1NF, 2NF, dan 3NF
Setelah mempelajari setiap tahapan, kita dapat melihat bahwa 1NF, 2NF, dan 3NF memiliki fokus perbaikan yang berbeda.
| Bentuk Normal | Fokus Utama | Permasalahan yang Diatasi |
|---|---|---|
| 1NF | Nilai atomik | Data berulang dalam satu kolom atau sel |
| 2NF | Ketergantungan penuh pada seluruh candidate key | Ketergantungan parsial |
| 3NF | Menghilangkan ketergantungan transitif | Atribut non-prime bergantung pada atribut non-prime lainnya |
Secara sederhana:
- 1NF memastikan setiap sel menyimpan satu nilai.
- 2NF memastikan atribut non-prime bergantung secara penuh pada seluruh candidate key.
- 3NF memastikan tidak terdapat ketergantungan transitif pada atribut non-prime.
Ketiga tahapan tersebut membantu menghasilkan struktur database yang lebih terorganisasi.
8. Contoh Implementasi Normalisasi Database Menggunakan MySQL
Setelah memahami konsep 1NF, 2NF, dan 3NF, sekarang kita akan mencoba menerapkan normalisasi menggunakan MySQL.
Kita akan membuat contoh database akademik sederhana yang memiliki tiga tabel, yaitu mahasiswa, jurusan, dan mata_kuliah, serta satu tabel penghubung bernama krs.
Langkah 1. Membuat Database
Buat database bernama db_normalisasi.
CREATE DATABASE db_normalisasi;
Kemudian pilih database tersebut.
USE db_normalisasi;
Langkah 2. Membuat Tabel Jurusan
Tabel jurusan digunakan untuk menyimpan informasi setiap jurusan.
CREATE TABLE jurusan (
id_jurusan VARCHAR(10) PRIMARY KEY,
nama_jurusan VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
Langkah 3. Membuat Tabel Mahasiswa
Tabel mahasiswa menyimpan informasi mahasiswa dan ID jurusan yang menjadi referensinya.
CREATE TABLE mahasiswa (
id_mahasiswa INT AUTO_INCREMENT PRIMARY KEY,
nama_mahasiswa VARCHAR(100) NOT NULL,
id_jurusan VARCHAR(10) NOT NULL,
FOREIGN KEY (id_jurusan)
REFERENCES jurusan(id_jurusan)
) ENGINE=InnoDB;
Langkah 4. Membuat Tabel Mata Kuliah
Tabel mata_kuliah digunakan untuk menyimpan informasi mata kuliah.
CREATE TABLE mata_kuliah (
id_mata_kuliah VARCHAR(10) PRIMARY KEY,
nama_mata_kuliah VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
Langkah 5. Membuat Tabel KRS
Tabel KRS digunakan untuk menghubungkan mahasiswa dengan mata kuliah.
CREATE TABLE krs (
id_mahasiswa INT NOT NULL,
id_mata_kuliah VARCHAR(10) NOT NULL,
PRIMARY KEY (id_mahasiswa, id_mata_kuliah),
FOREIGN KEY (id_mahasiswa)
REFERENCES mahasiswa(id_mahasiswa),
FOREIGN KEY (id_mata_kuliah)
REFERENCES mata_kuliah(id_mata_kuliah)
) ENGINE=InnoDB;
Pada tabel tersebut, kombinasi id_mahasiswa dan id_mata_kuliah menjadi Composite Primary Key.
Struktur ini mencegah pasangan mahasiswa dan mata kuliah yang sama dicatat lebih dari satu kali dalam tabel KRS.
Langkah 6. Memasukkan Data Jurusan
INSERT INTO jurusan (id_jurusan, nama_jurusan)
VALUES
('J01', 'Informatika'),
('J02', 'Sistem Informasi'),
('J03', 'Teknik Komputer');
Langkah 7. Memasukkan Data Mahasiswa
INSERT INTO mahasiswa (nama_mahasiswa, id_jurusan)
VALUES
('Andi', 'J01'),
('Budi', 'J02'),
('Citra', 'J01'),
('Dedi', 'J03');
Langkah 8. Memasukkan Data Mata Kuliah
INSERT INTO mata_kuliah
(id_mata_kuliah, nama_mata_kuliah)
VALUES
('MK01', 'Basis Data'),
('MK02', 'Pemrograman Web'),
('MK03', 'Jaringan Komputer');
Langkah 9. Memasukkan Data KRS
INSERT INTO krs (id_mahasiswa, id_mata_kuliah)
VALUES
(1, 'MK01'),
(1, 'MK02'),
(2, 'MK03'),
(3, 'MK01'),
(4, 'MK02');
Langkah 10. Menampilkan Data dengan JOIN
Setelah semua tabel memiliki data, kita dapat menggabungkannya untuk menampilkan informasi mahasiswa, jurusan, dan mata kuliah.
SELECT
mahasiswa.id_mahasiswa,
mahasiswa.nama_mahasiswa,
jurusan.nama_jurusan,
mata_kuliah.nama_mata_kuliah
FROM mahasiswa
INNER JOIN jurusan
ON mahasiswa.id_jurusan = jurusan.id_jurusan
INNER JOIN krs
ON mahasiswa.id_mahasiswa = krs.id_mahasiswa
INNER JOIN mata_kuliah
ON krs.id_mata_kuliah = mata_kuliah.id_mata_kuliah;
Hasil query:
| id_mahasiswa | nama_mahasiswa | nama_jurusan | nama_mata_kuliah |
|---|---|---|---|
| 1 | Andi | Informatika | Basis Data |
| 1 | Andi | Informatika | Pemrograman Web |
| 2 | Budi | Sistem Informasi | Jaringan Komputer |
| 3 | Citra | Informatika | Basis Data |
| 4 | Dedi | Teknik Komputer | Pemrograman Web |
Dari hasil tersebut, kita dapat melihat bahwa data yang sebelumnya dikelola dalam beberapa tabel tetap dapat ditampilkan sebagai satu informasi yang lengkap menggunakan JOIN.
Inilah salah satu manfaat normalisasi database. Data disimpan berdasarkan fungsinya masing-masing, tetapi tetap dapat digabungkan ketika dibutuhkan.
9. Apakah Normalisasi Database Selalu Harus Sampai 3NF?
Dalam perancangan database, normalisasi hingga 3NF sering digunakan sebagai dasar untuk menghasilkan struktur database relasional yang baik.
Namun, tidak berarti setiap database harus selalu berhenti pada 3NF atau semua sistem harus memiliki struktur yang sama.
Tingkat normalisasi perlu disesuaikan dengan kebutuhan aplikasi, kompleksitas data, dan pola penggunaan database.
Pada beberapa sistem, proses normalisasi dapat dilanjutkan ke bentuk yang lebih tinggi seperti BCNF, 4NF, dan 5NF.
Di sisi lain, terdapat kondisi tertentu ketika denormalisasi digunakan untuk meningkatkan performa pembacaan data.
Denormalisasi merupakan pendekatan yang menggabungkan atau menyimpan kembali sebagian informasi yang sebelumnya dipisahkan melalui normalisasi.
Contohnya, sistem pelaporan dengan volume data besar terkadang menggunakan tabel ringkasan untuk mengurangi kebutuhan JOIN yang kompleks.
Namun, denormalisasi harus dirancang dengan hati-hati karena dapat meningkatkan redundansi dan kebutuhan pemeliharaan konsistensi data.
Oleh karena itu, normalisasi sebaiknya dilakukan terlebih dahulu sebagai dasar perancangan, kemudian optimasi disesuaikan dengan kebutuhan aplikasi.
10. Kesalahan yang Sering Terjadi Saat Melakukan Normalisasi Database
Bagi pemula, terdapat beberapa kesalahan yang sering terjadi ketika merancang database menggunakan normalisasi.
1. Menganggap normalisasi hanya memecah tabel
Normalisasi bukan sekadar membagi satu tabel menjadi beberapa tabel. Proses ini harus didasarkan pada hubungan dan ketergantungan antaratribut.
2. Tidak menentukan Primary Key dengan tepat
Primary Key harus mampu mengidentifikasi setiap baris secara unik. Kesalahan dalam menentukan kunci dapat menyebabkan masalah pada proses normalisasi.
3. Tidak memahami Composite Primary Key
Pada beberapa tabel, satu kolom saja tidak cukup untuk mengidentifikasi baris secara unik. Kombinasi beberapa kolom dapat digunakan sebagai Primary Key.
4. Mengabaikan ketergantungan parsial
Kesalahan ini sering terjadi ketika merancang tabel dengan Primary Key gabungan. Pastikan setiap atribut non-prime bergantung pada seluruh candidate key.
5. Tidak memperhatikan ketergantungan transitif
Atribut non-prime yang bergantung pada atribut non-prime lainnya perlu dianalisis agar struktur tabel dapat memenuhi 3NF.
6. Membuat terlalu banyak tabel tanpa alasan yang jelas
Normalisasi harus berdasarkan kebutuhan dan aturan data, bukan sekadar memperbanyak jumlah tabel.
Dengan memahami prinsip tersebut, kita dapat merancang database yang lebih tepat dan mudah dikembangkan.
Kesimpulan
Normalisasi database merupakan proses penting dalam perancangan database relasional untuk mengurangi redundansi, menjaga konsistensi data, dan menghindari berbagai anomali.
Terdapat tiga bentuk normalisasi dasar yang perlu dipahami, yaitu First Normal Form (1NF), Second Normal Form (2NF), dan Third Normal Form (3NF).
1NF berfokus pada penyimpanan nilai yang atomik, 2NF menghilangkan ketergantungan parsial, sedangkan 3NF menghilangkan ketergantungan transitif pada atribut non-prime.
Dalam pengembangan aplikasi, normalisasi membantu menghasilkan struktur database yang lebih terorganisasi dan mudah dikelola.
Bagi mahasiswa yang sedang mengerjakan Skripsi atau Tugas Akhir, memahami normalisasi database sangat penting, terutama ketika menyusun ERD, menentukan Primary Key dan Foreign Key, serta membuat relasi antartabel menggunakan MySQL.
Dengan menerapkan normalisasi secara tepat, kita dapat membangun database yang lebih konsisten, terstruktur, dan siap dikembangkan sesuai kebutuhan aplikasi.
Artikel terkait: