Bentuk Normal Ketiga

Bentuk Normal Ketiga



Ini adalah bagian ketiga dari seri, Lima Bentuk Normal. Judul dari dua bagian pertama (tutorial) adalah First Normal Form, diikuti oleh Second Normal Form. Di bagian seri ini, Bentuk Normal Ketiga dijelaskan.

Penjelasannya mengikuti alur cerita: Seorang ayah telah meninggal dan meninggalkan sejumlah uang untuk anaknya. Putranya memutuskan untuk menginvestasikan uangnya di toko serba ada. Toko serba ada, juga dikenal sebagai toko serba ada, adalah bisnis ritel kecil yang menerima barang sehari-hari dari pemasok dan menjualnya ke pelanggan individu di lingkungan sekitar.







Saat ini, toko sudah memiliki stok, dan beberapa penjualan telah dilakukan. Anak laki-laki pemilik usaha tersebut memiliki beberapa pegawai yang disebut panitera dalam tutorial ini. Pemilik dan setiap karyawan dapat menerima persediaan dan melakukan penjualan setelah mencatat produk.



Namun, sebelum toko dimulai, baik pemilik maupun karyawannya tidak tahu apa-apa tentang bentuk normal. Jadi, mereka mencatat semuanya sebagai transaksi dalam satu meja dan satu buku latihan. Mereka tidak memiliki komputer.



Anda, para pembaca, telah menyelesaikan lima bagian dari rangkaian tutorial ini; Anda sekarang adalah pengembang basis data. Pemilik toko serba ada adalah teman Anda. Anda mengunjungi toko itu dua hari yang lalu dan melatih pemilik dan juru tulis untuk membuat meja dalam bentuk normal pertamanya. Anda juga mengunjungi toko kemarin dan melatih mereka tentang cara membuat tabel dalam bentuk normal kedua dari bentuk normal pertama.





Hari ini, Anda baru saja tiba di toko untuk berkunjung untuk melatih mereka tentang cara memproduksi meja dalam bentuk normal ketiga dari bentuk normal kedua. Semua tabel yang mereka miliki saat ini berada dalam bentuk normal kedua. Tabel (berdasarkan nama dan judul kolom) adalah:

Produk (IDproduk, IDkategori, produk)
Kategori(IDkategori, kategori)



Penjualan(saleID, pelanggan, karyawan, tanggal)
DetailPenjualan(IDpenjualan, IDproduk, nomorTerjual, Hargapenjualan)

Pesanan(orderID, pemasok, karyawan, tanggal)
Detail Pesanan(IDPesanan,IDProduk,JumlahDibeli,HargaBiaya)

Kunci tunggal atau gabungan digarisbawahi.

Setelah meringkas apa yang diajarkan dalam dua hari sebelumnya dan sebelum Anda dapat melakukan apapun, pemilik bertanya:

“Bagaimana dengan nomor telepon, alamat, dll., untuk pelanggan dan karyawan?

Bagaimana dengan jumlah stok, tingkat pemesanan ulang, dll., untuk produk?
Apakah mereka membutuhkan meja mereka sendiri yang terpisah, atau haruskah mereka dipasang ke meja yang sekarang?”

Anda, pengembang database, menjawab:

“Selamat, Pemilik! Anda secara tidak langsung telah memperkenalkan masalah Bentuk Normal Ketiga.”

Anda melanjutkan.

Kolom Lain yang Diperlukan

Kolom lain yang diperlukan ditambahkan terlebih dahulu ke tabel sebelumnya, yaitu di 1NF dan 2NF. Beberapa nama kolom sebelumnya dimodifikasi.

Minimal, tabel Kategori harus memiliki kolom berikut:

Kategori(IDkategori, namakategori, deskripsi)

Deskripsi adalah paragraf pendek yang menjelaskan kategori. Tabel kategori ini sudah dalam 1NF, 2NF, dan 3NF. 3NF dijelaskan di bawah ini:

Minimal, tabel Produk harus memiliki kolom berikut:

Produk(productID, categoryID, supplierID, productName, unitPrice, quantityInStock, reorderLevel)

Karena setiap produk dijual, tingkat (jumlah) produk yang rendah akan tercapai ketika produk harus dipesan ulang, sehingga pelanggan tidak boleh datang ke toko dan tidak memiliki produk tersebut. Ketidakhadiran seperti itu tidak baik untuk bisnis. quantityInStock adalah jumlah produk tertentu yang tersedia. Ini termasuk apa yang ada di toko dan apa yang ada di rak.

categoryID dan supplierID adalah kunci asing. Itu sebabnya mereka memiliki garis bawah garis putus-putus, bukan garis bawah tunggal. Kunci asing dijelaskan di bawah ini. Di bagian seri sebelumnya (Bentuk Normal Kedua), categoryID adalah bagian dari kunci utama dengan satu garis bawah karena cara mendapatkannya. Namun, dari penjelasan di bawah, akan terlihat jelas bahwa categoryID harus berupa kunci asing (dengan garis bawah).

Tabel produk ini sudah dalam 1NF, 2NF, dan 3NF. Lihat mengapa ada di 3NF di bawah ini:

Minimal, tabel SaleDetails harus memiliki kolom berikut:

DetailPenjualan(IDpenjualan,IDproduk,Hargajualunit,jumlah,diskon)

Nilai diskon diharapkan menjadi nol sebagian besar waktu. Diskon adalah diskon yang diberikan toko kepada pelanggan.

Minimal, tabel OrderDetails harus memiliki kolom berikut:

DetailPesanan(IDPesanan,IDProduk,HargaBiayaSatuan, Kuantitas, Diskon)

Nilai diskon diharapkan menjadi nol sebagian besar waktu. Diskon di sini adalah diskon yang diberikan pemasok kepada toko.

Seperti yang terlihat di bawah, tabel Produk dapat dipertimbangkan dalam 2NF atau 3NF. Tabel Penjualan dan Pemesanan memiliki masalah 3NF. Hanya Tabel Penjualan yang akan digunakan untuk menjelaskan masalah dan solusinya. 3NF untuk Tabel Pesanan dan Tabel Produk mengikuti alasan serupa dan hanya akan dikutip.

Saat menambahkan kolom, tabel Penjualan akan menjadi:

Penjualan(SaleID, dateSold customerName, phone, address, city, region, postalCode, Country, employee)

Tujuh kolom telah menggantikan kolom pelanggan di tabel asli. Karena pelanggan adalah orang-orang di lingkungan sekitar, sel untuk kolom kota, wilayah(negara bagian), kode pos, dan negara, dapat dikosongkan, meskipun tidak boleh dikosongkan dalam artikel ini.

Tabel Penjualan ini masih dalam 2NF karena aturan 1NF dan 2NF tidak dilanggar. Namun, harus disadari bahwa dalam baris tabel Penjualan, pelanggan (nama) telah diganti dengan tujuh sel baris pelanggan.

Catatan: sel alamat memiliki nomor rumah, nama jalan atau jalan raya, dan nama kota, semuanya dipisahkan dengan koma. Sebuah kota dapat dianggap terdiri dari beberapa kota. Meskipun koma memisahkan komponen string khusus ini, mereka membentuk satu nilai sel dan bukan tiga nilai sel.

Kolom karyawan juga harus diganti dengan tujuh kolom tersebut. Namun, itu tidak dilakukan dalam tutorial ini untuk menghemat ruang dan waktu pengajaran. Jadi, tabel Penjualan dengan data dapat berupa:

Tabel Penjualan – 2NF – Tanpa ID pelanggan

Kolom tipe data SaleID adalah bilangan bulat atau, lebih baik, penambahan otomatis. Tipe data kolom dateSold adalah tanggal dan bukan angka karena memiliki karakter “/”, yang bukan angka. Tipe data untuk kolom lainnya, termasuk kolom telepon, adalah string (atau teks). Nilai telepon memiliki karakter '-', yang bukan angka.

Perhatikan bahwa untuk setiap baris, pelanggan (nama), seperti di bagian seri sebelumnya, telah diganti dengan tujuh sel, salah satunya masih berupa nama pelanggan. Ini berarti bahwa data pelanggan adalah suatu entitas. Saat ini, nama pelanggan mengidentifikasi enam data lainnya berturut-turut. Jika tabel ini diprogram, akan lebih mudah untuk mengidentifikasi entitas pelanggan di setiap baris dengan bilangan bulat (bukan peningkatan otomatis). Dalam hal itu, kolom customerID harus mendahului customerName. Tabel sebelumnya menjadi:

Tabel Penjualan – 2NF – Dengan customerID

Ada tiga customerID: 1, 2, dan 3, dengan 1 muncul lima kali untuk John Smith, 2 muncul dua kali untuk James Taylor, dan 3 muncul satu kali untuk Susan Wright.

Perhatikan bahwa beberapa ID pelanggan dan tanggungannya berulang.

Aturan untuk Bentuk Normal Ketiga

Sebuah tabel berada dalam Bentuk Normal Ketiga jika memenuhi aturan berikut:

  1. Seharusnya sudah dalam Bentuk Normal Kedua.
  2. Dan seharusnya tidak memiliki Ketergantungan Transitif.

Kemudian salah satu panitera (pegawai) bertanya, “Apa yang dimaksud dengan ketergantungan transitif?”. Dan Anda, pengembang database, menjawab, 'Itu pertanyaan yang bagus!'

Ketergantungan Transitif

Benar bahwa dalam satu baris, SaleID mengidentifikasi semua nilai dalam baris; namun, customerID mengidentifikasi tujuh nilai datanya tetapi tidak mengidentifikasi nilai lainnya yang diidentifikasi oleh SaleID di baris tersebut. Dengan kata lain, SaleID bergantung pada sepuluh nilai sel di setiap baris. Namun, customerID bergantung pada tujuh nilai sel di baris yang sama, tetapi customerID tidak bergantung pada SaleID dan nilai lain yang bergantung pada SaleID.

Ketergantungan untuk custumerID tersebut adalah ketergantungan transitif. Dan customerID disebut kunci asing dan digarisbawahi dalam seri tutorial ini, Lima Bentuk Normal.

Misalkan atribut non-prima (nilai sel non-primer) bergantung pada atribut non-prima lainnya, dan atribut non-prima yang dimaksud (misalnya, customerID dan dependee-nya) tidak bergantung pada kunci utama dan sel lainnya. nilai-nilai dalam baris. Maka itu adalah ketergantungan transitif.

Tabel Penjualan sebelumnya dengan kunci asing dan ketergantungannya, akan menyebabkan masalah akuntansi (anomali).

Tabel Penjualan Dari 2NF ke 3NF

Untuk mengatasi masalah yang ditimbulkan oleh foreign key dan dependee-nya, hapus foreign key dan dependee-nya, untuk membentuk tabel baru tanpa pengulangan. Namun, meskipun kunci asing tidak bergantung pada kunci primer, kunci primer bergantung pada kunci asing. Jadi, salinan kunci asing harus tetap berada di tabel induk. Tabel penjualan baru, pada titik ini, sesuai dengan 1NF, 2NF, dan 3NF; itu adalah tabel induk. Tabel anak baru dari tabel Penjualan sebelumnya juga sesuai dengan 1NF, 2NF, dan 3NF. Nama tabel anak dengan kunci asing dan tanggungannya adalah Pelanggan. Jika nama yang cocok tidak dapat ditemukan, berarti ada yang salah dengan analisisnya. Tabel Penjualan baru di 3NF adalah:

Tabel Penjualan Akhir di 3NF

Tabel di 3NF ini memiliki jumlah baris yang sama dengan tabel di 2NF tetapi dengan kolom yang lebih sedikit.

Notasi tabel untuk tabel Penjualan akhir ini dalam 3NF adalah:

Penjualan(saleID, dateSold, customerID, employeeID)

saleID adalah kunci utama dengan satu garis bawah. customerID adalah kunci asing, dengan garis bawah garis putus-putus. employeeID juga merupakan kunci asing dengan garis bawah garis putus-putus. Perhatikan bahwa situasi karyawan di tabel Penjualan di 2NF sama dengan situasi pelanggan. EmployeeID dan tanggungannya sendiri harus ditarik untuk membentuk tabel lain; salinan ID karyawan tetap ada.

Catatan: saleID, customerID, dan employeeID tidak membentuk kunci gabungan. saleID tergantung pada customerID dan employeeID.

Hubungan antara saleID dan customerID adalah many-to-one.

Tabel pelanggan di 3NF

Tabel ini memiliki tiga baris, bukan 9 baris dalam tabel Penjualan 2NF. Dalam tabel ini, customerID adalah kunci utama. Ini sama dengan kunci asing di tabel Penjualan, tetapi tanpa pengulangan. Kunci asing di tabel Penjualan dan kunci utama di tabel Pelanggan menautkan kedua tabel.

Baris berulang di tabel Pelanggan telah dihapus agar tidak melanggar 1NF.

Seperti yang dapat dilihat pembaca, meletakkan tabel di 3NF juga akan menyelesaikan masalah baris berulang (redundansi).

Notasi tabel untuk Tabel Pelanggan adalah:

Pelanggan(customerID, namapelanggan, telepon, alamat, kota, wilayah, kode pos, negara)

Tabel Produk Ditinjau Ulang

Tabel produk yang diberikan di atas dalam bentuk notasi adalah:

Produk(productID, categoryID, supplierID, productName, unitPrice, quantityInStock, reorderLevel)

Kunci utama di sini adalah productID. categoryID dan supplierID adalah kunci asing. Mirip dengan tabel Pelanggan, ada tabel Kategori, di mana IDKategori adalah kunci utama, dan ada tabel Pemasok, di mana ID pemasok adalah kunci utama.

Jika nilai sel untuk unitPrice, quantityInStock, dan reorderLevel akan tetap, maka tabel Produk, sebagaimana adanya, benar-benar dalam 3NF. Jika nilai-nilai ini akan berubah, maka tabel Produk, sebagaimana adanya, dalam 2NF. Di bagian seri tutorial ini, diasumsikan bahwa nilai tersebut tetap tetap dari waktu ke waktu.

Semua Tabel

Semua tabel sekarang dalam 3NF. Mereka ditampilkan sebagai:

Karyawan (ID karyawan, nama, telepon, alamat, kota, wilayah, kode pos, negara, tanggal lahir, tanggal perekrutan, tanggal rilis)

Pemasok (ID pemasok, nama, telepon, alamat, kota, wilayah, kode pos, negara)

Produk(productID, categoryID, supplierID, productName, unitPrice, quantityInStock, reorderLevel)
Kategori(IDkategori, namakategori, deskripsi)

Penjualan(saleID, dateSold, customerID, employeeID)
DetailPenjualan(IDpenjualan, IDproduk, nomorTerjual, Hargapenjualan)
Pelanggan(customerID, namapelanggan, telepon, alamat, kota, wilayah, kode pos, negara)

Pesanan(orderID, dateSold, supplierID, employeeID)
Detail Pesanan(IDPesanan,IDProduk,JumlahDibeli,HargaBiaya)

Hingga sembilan tabel profesional telah dihasilkan hanya dari satu tabel yang dihasilkan oleh pemula untuk mencegah masalah redundansi dan akuntansi (anomali dari penyisipan, penghapusan, dan pembaruan). Meja pemula saja akan menyebabkan kerugian finansial.

Menguji Staf

Pada titik ini, semua karyawan, termasuk pemilik, seharusnya sudah memahami 1NF, 2NF, dan 3NF. Namun, mereka harus diuji. Semuanya, termasuk pemiliknya, akan duduk di tempat yang berbeda dan menyelesaikan ujian. Tes yang terdiri dari satu pertanyaan, akan memakan waktu satu jam, dan itu adalah sebagai berikut:

Soal: Dengan menggunakan aturan untuk 1NF, 2NF, dan 3NF, buktikan bahwa kesembilan tabel di atas sudah dalam Bentuk Normal Pertama, Bentuk Normal Kedua, dan Bentuk Normal Ketiga. Pelanggan dan pemasok tidak harus menjadi entitas nyata. Data untuk tabel harus mendukung notasi tabel.

Saat mereka menyelesaikan tes, Anda, sebagai pengembang database, keluar untuk menikmati makanan ringan dan bir, untuk kembali setelah satu jam.

Masa Depan Dekat dan Jauh

Saat Anda, pengembang database, keluar, Anda juga mempertimbangkan saran apa yang harus diberikan kepada mereka jika mereka semua lulus ujian.

Juga, saat Anda melatih mereka, dan sekarang mereka mengikuti tes, pelanggan datang dan pergi tanpa dilayani. Itu tidak baik untuk bisnis, dan Anda, pengembang database, tahu itu. Beberapa pelanggan mungkin pergi ke toko pesaing dan tidak pernah kembali.

Anda, pengembang database, berusia 30 tahun. Pemiliknya, sebagai teman Anda, juga berusia 30 tahun. Panitera (karyawan) berusia antara 18 dan 24 tahun. Semua kualitas yang mereka butuhkan untuk bekerja untuk pemilik adalah: sehat, bisa membaca dan menulis, mampu menambah, mengurangi, mengalikan, dan membagi , dan untuk dapat menggunakan komputer dan Internet.

Saat tabel dalam 3NF, sebagian besar kerentanan telah dihapus dari database. Banyak database komersial tidak melampaui 3NF, dan perusahaan atau perusahaan merasa nyaman.

Jadi, jika semuanya lulus ujian, Anda akan meminta pegawai untuk pergi dan terus bekerja. Anda juga akan menyarankan mereka untuk menyimpan sebagian dari gaji mereka sehingga mereka dapat memiliki toko serba ada. Anda akan melanjutkan besok untuk melatih hanya pemilik di 4NF dan 5NF. Dengan pengetahuan 4NF dan 5NF, semua kerentanan yang diketahui akan dihapus.

Evaluasi

Setelah satu jam, Anda, pengembang database, kembali. Anda menandai skrip mereka. Sepotong berita bagus! Mereka semua, termasuk pemiliknya, masing-masing memiliki 100%. Hore! Itu luar biasa!

Jadi selamat untuk kalian semua: guru dan siswa.

Tidak ada yang tersisa untuk dilakukan dalam tutorial ini selain menyimpulkan.

Kesimpulan

Sebuah tabel dalam Bentuk Normal Pertama, jika tidak melanggar salah satu aturan berikut:

  1. Semua kolom dalam tabel harus memiliki nama header yang unik.
  2. Setiap sel hanya boleh memiliki satu nilai.
  3. Nilai yang disimpan dalam kolom harus dari jenis yang sama.
  4. Baris harus berbeda.
  5. Urutan kolom atau baris tidak masalah.

Sebuah tabel dalam Bentuk Normal Kedua, jika tidak melanggar salah satu aturan berikut:

  1. Tabel harus sudah dalam Bentuk Normal Pertama.
  2. Tidak boleh ada ketergantungan parsial.

Sebuah tabel dalam Bentuk Normal Ketiga, jika tidak melanggar salah satu aturan berikut:

  1. Itu pasti sudah dalam Bentuk Normal Kedua.
  2. Dan itu tidak boleh memiliki Ketergantungan Transitif.

Anda, pengembang database, memberi tahu pegawai bahwa mereka telah cukup belajar. Anda memberikan saran dan meminta mereka untuk kembali bekerja dan tetap di stasiun mereka secara default.

Anda membuat janji temu dengan pemiliknya saja, untuk berlangsung di kantornya besok untuk pelatihan 4NF dan 5NF.