LMS-SPADA INDONESIA
Normalisasi, dalam konteks ini, adalah proses pengorganisasian data dalam basis data ( basis data relasional ) untuk menghilangkan anomali data, seperti redundansi.
Dalam istilah yang lebih sederhana, ini melibatkan pemecahan tabel yang besar dan kompleks menjadi tabel yang lebih kecil dan lebih sederhana dengan tetap menjaga hubungan data.
Normalisasi umumnya digunakan saat menangani kumpulan data besar.
Mari kita lihat sekilas beberapa skenario di mana normalisasi sering digunakan.
Bayangkan sebuah basis data yang berisi informasi pelanggan. Tanpa normalisasi, jika pelanggan mengubah usianya, kami perlu memperbaruinya di beberapa tempat, yang akan meningkatkan risiko ketidakkonsistenan. Dengan menormalkan data, kami dapat memiliki tabel terpisah yang ditautkan dengan pengenal unik yang akan memastikan bahwa data tetap akurat dan konsisten.
Mari kita pertimbangkan database yang kompleks dengan beberapa tabel terkait yang menyimpan informasi yang redundan. Dalam skenario ini, kueri yang melibatkan penggabungan menjadi lebih rumit dan membutuhkan banyak sumber daya. Normalisasi akan membantu menyederhanakan kueri dengan memecah data menjadi tabel yang lebih kecil, dengan setiap tabel hanya berisi informasi yang relevan, sehingga mengurangi kebutuhan akan penggabungan yang kompleks.
Masalah utama dengan data yang redundan adalah data tersebut menempati ruang penyimpanan yang tidak diperlukan. Misalnya, jika kita menyimpan detail produk yang sama di setiap catatan pesanan, hal itu menyebabkan duplikasi. Dengan normalisasi, Anda dapat menghilangkan redundansi dengan membagi data ke dalam tabel terpisah.
Normalisasi memegang peranan penting dalam desain basis data. Berikut ini beberapa alasan mengapa hal ini penting:
Jika suatu tabel tidak dinormalisasi dengan benar dan memiliki redundansi data, hal itu tidak hanya akan menghabiskan ruang penyimpanan data ekstra tetapi juga akan mempersulit penanganan dan pembaruan basis data.
Ada beberapa faktor yang mendorong perlunya normalisasi, mulai dari redundansi data (seperti yang dibahas di atas) hingga kesulitan mengelola hubungan. Mari kita bahas secara langsung:
Sejauh ini, kita telah melihat apa itu normalisasi dalam SQL , mengapa normalisasi dalam SQL penting, dan apa yang menyebabkan perlunya normalisasi. Normalisasi basis data hadir dalam berbagai bentuk , masing-masing dengan tingkat organisasi data yang semakin meningkat.
Di bagian ini, kita akan membahas secara singkat berbagai tingkat normalisasi dan kemudian menjelajahinya lebih dalam di bagian berikutnya.

Bentuk Normal Pertama (1NF)
Tingkat normalisasi ini memastikan bahwa setiap kolom dalam data Anda hanya berisi nilai atomik. Nilai atomik dalam konteks ini berarti bahwa setiap entri dalam kolom tidak dapat dibagi. Ini seperti mengatakan bahwa setiap sel dalam spreadsheet hanya boleh memuat satu informasi. 1NF memastikan sifat atomik data, dengan setiap sel kolom hanya berisi satu nilai dan setiap kolom memiliki nama yang unik.
Menghilangkan ketergantungan parsial dengan memastikan bahwa atribut non-kunci hanya bergantung pada kunci utama. Artinya, pada dasarnya, harus ada hubungan langsung antara setiap kolom dan kunci utama, dan bukan antara kolom lainnya.
Menghilangkan ketergantungan transitif dengan memastikan bahwa atribut non-kunci hanya bergantung pada kunci utama. Tingkat normalisasi ini dibangun di atas 2NF.
Ini adalah versi 3NF yang lebih ketat yang membahas anomali tambahan. Pada tingkat normalisasi ini, setiap determinan adalah kunci kandidat.
Ini adalah tingkat normalisasi yang dibangun pada BCNF dengan menangani dependensi multi-nilai.
5NF adalah level normalisasi tertinggi yang menangani ketergantungan gabungan. Level ini digunakan dalam skenario tertentu untuk lebih meminimalkan redundansi dengan memecah tabel menjadi tabel-tabel yang lebih kecil.
Kami telah menyoroti semua level normalisasi data. Mari kita bahas masing-masing secara lebih mendalam dengan contoh dan penjelasan.
1NF memastikan bahwa setiap sel kolom hanya berisi nilai atomik. Bayangkan sebuah basis data perpustakaan dengan tabel yang menyimpan informasi buku (judul, penulis, genre, dan borrowed_by). Jika tabel tidak dinormalisasi, borrowed_by dapat berisi daftar nama peminjam yang dipisahkan dengan koma. Ini melanggar 1NF, karena satu sel berisi beberapa nilai. Tabel di bawah ini merupakan representasi yang baik dari tabel yang melanggar 1NF, seperti yang dijelaskan sebelumnya.
judul | pengarang | genre | dipinjam_oleh |
Mockingbird | Harper Lee | Fiksi | John Doe, Jane Doe, James Brown |
Penguasa Cincin | JRR Tolkien | Fantasi | Emily Garcia dan David Lee |
Harry Potter dan Batu Bertuah | J.K. Rowling | Fantasi | Michael Chen |
Dalam 1NF, kami membuat tabel terpisah untuk peminjam dan menautkannya ke tabel buku. Tabel-tabel ini dapat ditautkan menggunakan kunci asing di tabel peminjam atau tabel penghubung terpisah. Pendekatan kunci asing dalam tabel peminjam melibatkan penambahan kolom kunci asing ke tabel peminjam yang merujuk ke kunci utama tabel buku. Ini akan menegakkan hubungan antara tabel, memastikan konsistensi data.
Anda dapat menemukan representasinya di bawah ini:
Meja buku
id_buku (PK) | judul | pengarang | genre |
1 | Mockingbird | Harper Lee | Fiksi |
2 | Penguasa Cincin | JRR Tolkien | Fantasi |
3 | Harry Potter dan Batu Bertuah | J.K. Rowling | Fantasi |
Tabel peminjam
id_peminjam (PK) | nama | id_buku (FK) |
1 | John Doe | 1 |
2 | Jane Doe | 1 |
3 | James Coklat | 1 |
4 | Emily Garcia | 2 |
5 | David Lee | 2 |
6 | Michael Chen | 3 |
Tingkat normalisasi ini, sebagaimana telah dijelaskan, dibangun di atas 1NF dengan memastikan tidak ada ketergantungan parsial pada kunci utama. Dalam istilah yang lebih sederhana, semua atribut yang bukan kunci harus bergantung pada seluruh kunci utama dan bukan hanya sebagian saja.
Dari 1NF yang diimplementasikan, kita sudah memiliki dua tabel terpisah (Anda dapat memeriksa bagian 1NF).
Sekarang, katakanlah kita ingin menautkan tabel-tabel ini untuk mencatat peminjaman. Pendekatan awal mungkin cukup dengan menambahkan kolom borrower_id ke tabel books , seperti yang ditunjukkan di bawah ini:
id_buku (PK) | judul | pengarang | genre | id_peminjam (FK) |
1 | Mockingbird | Harper Lee | Fiksi | 1 |
2 | Penguasa Cincin | JRR Tolkien | Fantasi | BATAL |
3 | Harry Potter dan Batu Bertuah | J.K. Rowling | Fantasi | 6 |
Ini mungkin tampak seperti solusi, tetapi melanggar 2NF karena id_peminjam hanya bergantung sebagian pada id_buku. Sebuah buku dapat memiliki beberapa peminjam, tetapi satu id_peminjam hanya dapat ditautkan ke satu buku dalam struktur ini. Ini menciptakan ketergantungan sebagian.
Kita perlu mencapai hubungan many-to-many antara buku dan peminjam untuk mencapai 2NF. Hal ini dapat dilakukan dengan memperkenalkan tabel terpisah:
Tabel peminjaman buku
| peminjaman_id (PK) | id_buku (FK) | id_peminjam (FK) | tanggal_pinjaman |
|---|---|---|---|
| 1 | 1 | 1 | Tanggal 04-05-2024 |
| 2 | 2 | 4 | Tanggal 04-05-2024 |
| 3 | 3 | 6 | Tanggal 04-05-2024 |
Tabel ini menetapkan hubungan yang jelas antara buku dan peminjam. book_id dan borrower_id bertindak sebagai kunci asing, yang merujuk ke kunci utama dalam tabel masing-masing. Pendekatan ini memastikan bahwa borrower_id bergantung pada seluruh kunci utama (book_id) dari tabel books, yang mematuhi 2NF.
3NF dibangun di atas 2NF dengan menghilangkan ketergantungan transitif. Ketergantungan transitif terjadi ketika atribut non-kunci bergantung pada atribut non-kunci lainnya, yang pada gilirannya bergantung pada kunci utama. Pada dasarnya, maknanya diambil dari hukum transitif.
Dari 2NF yang sudah kita terapkan, ada tiga tabel di database perpustakaan kita:
Meja buku
id_buku (PK) | judul | pengarang | genre |
1 | Mockingbird | Harper Lee | Fiksi |
2 | Penguasa Cincin | JRR Tolkien | Fantasi |
3 | Harry Potter dan Batu Bertuah | J.K. Rowling | Fantasi |
Tabel peminjam
id_peminjam (PK) | nama | id_buku (FK) |
1 | John Doe | 1 |
2 | Jane Doe | 1 |
3 | James Coklat | 1 |
4 | Emily Garcia | 2 |
5 | David Lee | 2 |
6 | Michael Chen | 3 |
Tabel peminjaman buku
peminjaman_id (PK) | id_buku (FK) | id_peminjam (FK) | tanggal_pinjaman |
1 | 1 | 1 | Tanggal 04-05-2024 |
2 | 2 | 4 | Tanggal 04-05-2024 |
3 | 3 | 6 | Tanggal 04-05-2024 |
Struktur 2NF terlihat efisien, tetapi mungkin ada ketergantungan tersembunyi. Bayangkan kita menambahkan kolom due_date ke tabel buku. Ini mungkin tampak logis pada pandangan pertama, tetapi ini akan menciptakan ketergantungan transitif di mana:
Implikasinya adalah bahwa due_date bergantung pada atribut non-kunci perantara (borrowing_id) dan bukan bergantung langsung pada kunci utama (book_id). Hal ini melanggar 3NF.
Kita dapat memindahkan kolom due_date ke tabel yang paling sesuai dengan memperbarui tabel book_borrowings agar menyertakan kolom due_date dan returning_date.
Berikut adalah tabel yang diperbarui:
peminjaman_id (PK) | id_buku (FK) | id_peminjam (FK) | tanggal_pinjaman | tenggat waktu |
1 | 1 | 1 | Tanggal 04-05-2024 | Tanggal 20 Mei 2024 |
2 | 2 | 4 | Tanggal 04-05-2024 | Tanggal 18-05-2024 |
3 | 3 | 6 | Tanggal 04-05-2024 | Tanggal 10 Mei 2024 |
Dengan menempatkan kolom due_date dalam tabel book_borrowing, kita telah berhasil menghilangkan ketergantungan transitif.
Artinya, due_date sekarang bergantung langsung pada hubungan gabungan antara book_id dan borrower_id. Dalam konteks ini, book_id dan borrower_id bertindak sebagai kunci asing gabungan, yang bersama-sama membentuk kunci utama tabel book_borrowings.
BCNF didasarkan pada dependensi fungsional yang mempertimbangkan semua kunci kandidat dalam suatu hubungan.
Ketergantungan fungsional (FD) mendefinisikan hubungan antara atribut dalam basis data relasional. FD menyatakan bahwa nilai satu kolom menentukan nilai kolom terkait lainnya. FD sangat penting karena memandu proses normalisasi dengan mengidentifikasi ketergantungan dan memastikan data didistribusikan dengan tepat di seluruh tabel.
BCNF adalah versi 3NF yang lebih ketat. BCNF memastikan bahwa setiap determinan (seperangkat atribut yang mengidentifikasi baris secara unik) dalam tabel adalah kunci kandidat (seperangkat atribut minimal yang mengidentifikasi baris secara unik). Inti dari BCNF adalah bahwa semua determinan harus dapat berfungsi sebagai kunci utama.
Ini memastikan bahwa setiap ketergantungan fungsional (FD) memiliki superkey sebagai penentunya. Dengan kata lain, jika X —> Y (X menentukan Y) berlaku, X harus menjadi kunci kandidat (superkey) dari relasi tersebut. Harap perhatikan bahwa X dan Y adalah kolom dalam tabel data.
Sebagai pengembangan dari 3NF, kami memiliki tiga tabel:
Meja buku
id_buku (PK) | judul | pengarang | genre |
1 | Mockingbird | Harper Lee | Fiksi |
2 | Penguasa Cincin | JRR Tolkien | Fantasi |
3 | Harry Potter dan Batu Bertuah | J.K. Rowling | Fantasi |
Tabel peminjam
id_peminjam (PK) | nama | id_buku (FK) |
1 | John Doe | 1 |
2 | Jane Doe | 1 |
3 | James Coklat | 1 |
4 | Emily Garcia | 2 |
5 | David Lee | 2 |
6 | Michael Chen | 3 |
Tabel peminjaman buku
peminjaman_id (PK) | id_buku (FK) | id_peminjam (FK) | tanggal_pinjaman | tenggat waktu |
1 | 1 | 1 | Tanggal 04-05-2024 | Tanggal 20 Mei 2024 |
2 | 2 | 4 | Tanggal 04-05-2024 | Tanggal 18-05-2024 |
3 | 3 | 6 | Tanggal 04-05-2024 | Tanggal 10 Mei 2024 |
Meskipun struktur 3NF sudah bagus, mungkin ada determinan tersembunyi dalam tabel book_borrowings. Dengan asumsi satu peminjam tidak dapat meminjam buku yang sama dua kali secara bersamaan, kombinasi book_id dan borrower_id bersama-sama mengidentifikasi catatan peminjaman secara unik.
Struktur ini melanggar BCNF karena kumpulan gabungan (book_id dan borrower_id) bukan kunci utama tabel (yang hanya borrowing_id).
Untuk mencapai BCNF, kita dapat menguraikan tabel book_borrowings menjadi dua tabel terpisah atau menjadikan set atribut gabungan sebagai kunci utama.
Pada akhirnya, pilihan Anda di antara opsi-opsi ini bergantung pada kebutuhan data spesifik Anda dan bagaimana Anda ingin memodelkan hubungan peminjaman.