Apa itu Normalisasi (atau Normalisasi)?

Jawaban:

171

Normalisasi pada dasarnya adalah untuk mendesain skema database sedemikian rupa sehingga data duplikat dan berlebihan dapat dihindari. Jika beberapa bagian data diduplikasi di beberapa tempat di database, ada risiko data diperbarui di satu tempat tetapi tidak di tempat lain, yang menyebabkan kerusakan data.

Ada sejumlah tingkat normalisasi dari 1. bentuk normal sampai 5. bentuk normal. Setiap bentuk normal menjelaskan cara menghilangkan beberapa masalah tertentu, biasanya terkait dengan redundansi.

Beberapa kesalahan normalisasi umum:

(1) Memiliki lebih dari satu nilai dalam sel. Contoh:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

Di sini kolom "Mobil" (yang merupakan string) memiliki beberapa nilai. Itu menyinggung bentuk normal pertama, yang mengatakan bahwa setiap sel seharusnya hanya memiliki satu nilai. Kami dapat menormalkan masalah ini dengan memiliki baris terpisah per mobil:

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

Masalah dengan memiliki beberapa nilai dalam satu sel adalah rumit untuk diperbarui, rumit untuk membuat kueri, dan Anda tidak dapat menerapkan indeks, batasan, dan sebagainya.

(2) Memiliki data non-kunci yang redundan (mis. Data diulang secara tidak perlu dalam beberapa baris). Contoh:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

Desain ini menjadi masalah karena nama diulang setiap kolom, meskipun nama selalu ditentukan oleh UserId. Ini secara teoritis memungkinkan untuk mengubah nama Sue di satu baris dan bukan yang lain, yang merupakan korupsi data. Masalahnya diselesaikan dengan membagi tabel menjadi dua, dan membuat hubungan kunci utama / kunci asing:

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Sekarang sepertinya kita masih memiliki data yang berlebihan karena UserId berulang; Namun kendala PK / FK memastikan bahwa nilai tidak dapat diperbarui secara independen, sehingga integritas aman.

Apakah itu penting? Ya itu sangat penting. Dengan memiliki database dengan kesalahan normalisasi, Anda membuka risiko mendapatkan data yang tidak valid atau rusak ke dalam database. Karena data "hidup selamanya", sangat sulit untuk menyingkirkan data yang rusak saat pertama kali masuk ke database.

Jangan takut dengan normalisasi . Definisi teknis resmi dari tingkat normalisasi cukup tumpul. Itu membuatnya terdengar seperti normalisasi adalah proses matematika yang rumit. Namun, normalisasi pada dasarnya hanyalah akal sehat, dan Anda akan menemukan bahwa jika Anda mendesain skema database menggunakan akal sehat biasanya akan dinormalisasi sepenuhnya.

Ada sejumlah kesalahpahaman seputar normalisasi:

  • beberapa percaya bahwa database yang dinormalisasi lebih lambat, dan denormalisasi meningkatkan kinerja. Ini hanya berlaku dalam kasus yang sangat khusus. Biasanya database yang dinormalisasi juga yang tercepat.

  • terkadang normalisasi digambarkan sebagai proses desain bertahap dan Anda harus memutuskan "kapan harus berhenti". Tetapi sebenarnya tingkat normalisasi hanya menggambarkan masalah spesifik yang berbeda. Masalah yang diselesaikan dengan formulir normal di atas NF ke-3 adalah masalah yang cukup langka di tempat pertama, jadi kemungkinan besar skema Anda sudah dalam 5NF.

Apakah itu berlaku untuk apa pun di luar database? Tidak secara langsung, tidak. Prinsip normalisasi cukup spesifik untuk database relasional. Namun tema umum yang mendasari - bahwa Anda tidak boleh memiliki data duplikat jika contoh yang berbeda bisa tidak sinkron - dapat diterapkan secara luas. Ini pada dasarnya adalah prinsip KERING .

JacquesB
sumber
4
Contoh yang Anda berikan untuk normal pertama tidak sepenuhnya benar. Saya selalu ingat tiga bentuk normal pertama dengan istilah berulang, berlebihan, tidak bergantung. Data berulang mengacu pada saat pengembang database pemula menulis definisi tabel yang menyertakan kolom seperti DogName1, DogName2, DogName3, dll.
Bill
2
@Bill: Menurut Anda, mengapa contoh yang saya berikan tidak benar? Apakah Anda mengetahui definisi 1NF yang contohnya OK?
JacquesB
Kenapa normalisasi tidak diperlukan dalam pemrograman berorientasi objek - tetapi hanya ketika datang ke database? Saya pikir sudah ada proses normalisasi yang dibangun dengan inti dari pemrograman orientasi objek apa yang habis - bukan?
Lealo
@Lealo Tidak, tidak sama sekali. Anda selalu dapat memetakan status desain OO secara sepele ke database / desain "relasional" dengan tabel - itulah ORM - tetapi database / desain yang Anda dapatkan adalah representasi relasional dari desain OO, bukan representasi relasional dari yang bisnis , dan tidak hanya merupakan representasi relasional dari desain OO jelas tunduk pembaruan anomali & redundansi yang normalisasi mengelola tetapi metode OO harus menegakkan sesuai (tidak berdokumen) (kompleks) kendala ( "representasi invarian") dengan tangan.
philipxy
@Lealo: Prinsipnya berlaku untuk OOP sejauh Anda tidak boleh memiliki informasi yang sama (dalam bentuk yang bisa berubah) di dua objek yang berbeda, karena mereka mungkin menjadi tidak sinkron.
JacquesB
45

Aturan normalisasi (sumber: tidak diketahui)

  • Kunci ( 1NF )
  • Seluruh kunci ( 2NF )
  • dan hanya kuncinya ( 3NF )

... Jadi bantu aku Codd.

ConcernedOfTunbridgeWells
sumber
12
Saya pikir ini agak kabur tanpa konteks yang tepat, bukan?
Rik
3
Ini mungkin agak kabur, tetapi ini adalah pengingat yang bagus bagi mereka yang memiliki konteks. Saya tahu apa itu normalisasi dan bagaimana cara melakukannya, tetapi saya tidak pernah dapat mengingat masing-masing bentuknya.
Benjamin Autin
1
wikipedia menjelaskan ini di sini - "Mewajibkan keberadaan" kunci "memastikan bahwa tabel dalam 1NF; mengharuskan atribut non-kunci bergantung pada" seluruh kunci "memastikan 2NF; selanjutnya mengharuskan atribut non-kunci bergantung pada" tidak ada tapi kuncinya "memastikan 3NF."
Kcats Wolfrevo
Menurut wikipedia , sumbernya adalah Bill Kent: "[Setiap] [atribut] non-kunci harus memberikan fakta tentang kunci, keseluruhan kunci, dan tidak lain adalah kunci."
apteryx
19

Yang terpenting, ini berfungsi untuk menghapus duplikasi dari catatan database. Misalnya jika Anda memiliki lebih dari satu tempat (tabel) di mana nama seseorang bisa muncul, Anda memindahkan nama ke tabel terpisah dan mereferensikannya di tempat lain. Dengan cara ini jika nanti Anda perlu mengganti nama orang, Anda hanya perlu menggantinya di satu tempat.

Ini penting untuk desain database yang tepat dan dalam teori Anda harus menggunakannya sebanyak mungkin untuk menjaga integritas data Anda. Namun ketika mengambil informasi dari banyak tabel Anda kehilangan beberapa kinerja dan itulah mengapa terkadang Anda bisa melihat tabel database yang dinormalisasi (juga disebut diratakan) digunakan dalam aplikasi kinerja kritis.

Saran saya adalah mulai dengan tingkat normalisasi yang baik dan lakukan de-normalisasi hanya jika benar-benar diperlukan

PS juga periksa artikel ini: http://en.wikipedia.org/wiki/Database_normalization untuk membaca lebih lanjut tentang subjek dan tentang apa yang disebut bentuk normal

Ilya Kochetov
sumber
Anda juga akan terkejut betapa sedikit denormalisasi yang benar-benar dibutuhkan dalam aplikasi transaksional. Dalam satu aplikasi monster yang saya buat model datanya, skema dengan 560 tabel hanya memiliki 4 item data yang didenormalisasi.
ConcernedOfTunbridgeWells
Ini mencegah "anomali pembaruan". Ini dilakukan dengan menghilangkan jenis duplikasi tertentu.
S. Lotot
“Saran saya adalah mulai dengan derajat normalisasi yang baik dan lakukan de-normalisasi hanya jika benar-benar dibutuhkan”. Nasihat yang satu ini sangat buruk! Saya masih tidak melihat ilustrasi yang tepat dari "teori-semu" ini. Minus 1.
Philippe Grondier
7

Normalisasi prosedur yang digunakan untuk menghilangkan redundansi dan ketergantungan fungsional antar kolom dalam sebuah tabel.

Ada beberapa bentuk normal, umumnya ditunjukkan dengan angka. Jumlah yang lebih tinggi berarti lebih sedikit redundansi dan ketergantungan. Setiap tabel SQL dalam 1NF (bentuk normal pertama, cukup banyak menurut definisi) Normalisasi berarti mengubah skema (sering mempartisi tabel) dengan cara yang dapat dibalik, memberikan model yang secara fungsional identik, kecuali dengan redundansi dan ketergantungan yang lebih sedikit.

Redundansi dan ketergantungan data tidak diinginkan karena dapat menyebabkan ketidakkonsistenan saat memodifikasi data.

Rik
sumber
5

Ini dimaksudkan untuk mengurangi redundansi data.

Untuk diskusi yang lebih formal, lihat Wikipedia http://en.wikipedia.org/wiki/Database_normalization

Saya akan memberikan contoh yang agak sederhana.

Asumsikan database organisasi yang biasanya berisi anggota keluarga

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

bisa dinormalisasi sebagai

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

dan meja keluarga

ID, address
27 123 Main St.

Normalisasi Hampir Lengkap (BCNF) biasanya tidak digunakan dalam produksi, tetapi merupakan langkah perantara. Setelah Anda meletakkan database di BCNF, langkah selanjutnya biasanya adalah De-normalisasi dengan cara yang logis untuk mempercepat kueri dan mengurangi kompleksitas penyisipan umum tertentu. Namun, Anda tidak dapat melakukan ini dengan baik tanpa menormalkannya dengan benar terlebih dahulu.

Idenya adalah bahwa informasi yang berlebihan direduksi menjadi satu entri. Ini sangat berguna di bidang seperti alamat, di mana Tn. Chris mengirimkan alamatnya sebagai Unit-7 123 Main St. dan Ny. Chris mencantumkan Suite-7 123 Main Street, yang akan muncul di tabel asli sebagai dua alamat berbeda.

Biasanya, teknik yang digunakan adalah menemukan elemen berulang, dan mengisolasi bidang tersebut ke dalam tabel lain dengan id unik dan mengganti elemen berulang dengan kunci utama yang mereferensikan tabel baru.

Chris Cudmore
sumber
1
BCNF tidaklah "sempurna". Ada formulir normal yang lebih tinggi, hingga 6NF, di mana semua tabel Anda hanya berupa kunci dan nilai data. Ini jarang digunakan, meskipun
Rik
Saya tidak setuju bahwa BCNF jarang digunakan dan biasanya dinormalisasi. Sebenarnya contoh Anda yang dinormalisasi sudah ada di BCNF, dan jika Anda menormalkannya, Anda akan kembali ke titik awal.
JacquesB
3

Mengutip Tanggal CJ: Teori itu praktis.

Penyimpangan dari normalisasi akan mengakibatkan anomali tertentu dalam database Anda.

Penyimpangan dari Bentuk Normal Pertama akan menyebabkan anomali akses, artinya Anda harus mendekomposisi dan memindai nilai individual untuk menemukan apa yang Anda cari. Misalnya, jika salah satu nilainya adalah string "Ford, Cadillac" seperti yang diberikan oleh respons sebelumnya, dan Anda mencari semua kejadian "Ford", Anda harus membongkar string dan melihat substring. Ini, sampai batas tertentu, mengalahkan tujuan penyimpanan data dalam database relasional.

Definisi Bentuk Normal Pertama telah berubah sejak tahun 1970, tetapi perbedaan tersebut tidak perlu menjadi perhatian Anda untuk saat ini. Jika Anda mendesain tabel SQL menggunakan model data relasional, tabel Anda secara otomatis akan berada dalam 1NF.

Penyimpangan dari Bentuk Normal Kedua dan seterusnya akan menyebabkan anomali pembaruan, karena fakta yang sama disimpan di lebih dari satu tempat. Masalah ini membuat beberapa fakta tidak mungkin disimpan tanpa menyimpan fakta lain yang mungkin tidak ada, dan oleh karena itu harus ditemukan. Atau ketika fakta berubah, Anda mungkin harus mencari semua lokasi di mana fakta disimpan dan memperbarui semua tempat itu, jangan sampai Anda berakhir dengan database yang bertentangan dengan dirinya sendiri. Dan, ketika Anda pergi untuk menghapus baris dari database, Anda mungkin menemukan bahwa jika Anda melakukannya, Anda menghapus satu-satunya tempat di mana fakta yang masih diperlukan disimpan.

Ini adalah masalah logis, bukan masalah kinerja atau masalah ruang. Terkadang Anda bisa mengatasi anomali pembaruan ini dengan pemrograman yang cermat. Kadang-kadang (sering) lebih baik mencegah masalah sejak awal dengan mengikuti bentuk normal.

Terlepas dari nilai dalam apa yang telah dikatakan, harus disebutkan bahwa normalisasi adalah pendekatan dari bawah ke atas, bukan pendekatan dari atas ke bawah. Jika Anda mengikuti metodologi tertentu dalam analisis data Anda, dan dalam desain awal Anda, Anda dapat dijamin bahwa desain tersebut paling tidak sesuai dengan 3NF. Dalam banyak kasus, desain akan dinormalisasi sepenuhnya.

Di mana Anda mungkin benar-benar ingin menerapkan konsep yang diajarkan di bawah normalisasi adalah ketika Anda diberikan data warisan, dari database warisan atau dari file yang terdiri dari catatan, dan data dirancang dengan ketidaktahuan sama sekali tentang bentuk normal dan konsekuensi kepergian. dari mereka. Dalam kasus ini, Anda mungkin perlu menemukan penyimpangan dari normalisasi, dan memperbaiki desain.

Peringatan: normalisasi sering diajarkan dengan nuansa religius, seolah-olah setiap penyimpangan dari normalisasi penuh adalah dosa, pelanggaran terhadap Codd. (permainan kata kecil di sana). Jangan beli itu. Saat Anda benar-benar mempelajari desain database, Anda tidak hanya akan tahu cara mengikuti aturan, tetapi juga tahu kapan aman untuk melanggarnya.

Walter Mitty
sumber
2

Normalisasi adalah salah satu konsep dasar. Artinya ada dua hal yang tidak saling mempengaruhi.

Dalam database secara khusus berarti bahwa dua (atau lebih) tabel tidak berisi data yang sama, yaitu tidak memiliki redundansi.

Pada pandangan pertama, itu sangat bagus karena peluang Anda untuk membuat beberapa masalah sinkronisasi mendekati nol, Anda selalu tahu di mana data Anda, dll. Tapi, mungkin, jumlah tabel Anda akan bertambah dan Anda akan mengalami masalah untuk menyilangkan data dan untuk mendapatkan beberapa hasil ringkasan.

Jadi, pada akhirnya Anda akan menyelesaikan desain database yang tidak dinormalisasi murni, dengan beberapa redundansi (ini akan berada di beberapa tingkat kemungkinan normalisasi).

Nenad Dobrilovic
sumber
2

Apa itu Normalisasi?

Normalisasi adalah langkah proses formal bijak yang memungkinkan kita mendekomposisi tabel database sedemikian rupa sehingga redundansi data dan anomali pembaruan diminimalkan.

Proses Normalisasi
masukkan deskripsi gambar di sini Kesopanan

Bentuk normal pertama jika dan hanya jika domain dari setiap atribut hanya berisi nilai atom (nilai atom adalah nilai yang tidak dapat dibagi), dan nilai setiap atribut hanya berisi satu nilai dari domain itu (contoh: - domain untuk kolom jenis kelamin adalah: "M", "F".).

Bentuk normal pertama menerapkan kriteria ini:

  • Hilangkan kelompok berulang dalam tabel individu.
  • Buat tabel terpisah untuk setiap kumpulan data terkait.
  • Identifikasi setiap kumpulan data terkait dengan kunci utama

Bentuk normal kedua = 1NF + tidak ada ketergantungan parsial yaitu Semua atribut non-kunci berfungsi penuh tergantung pada kunci primer.

Bentuk normal ketiga = 2NF + tidak ada ketergantungan transitif yaitu Semua atribut non-kunci berfungsi penuh tergantung LANGSUNG hanya pada kunci primer.

Bentuk normal Boyce – Codd (atau BCNF atau 3.5NF) adalah versi yang sedikit lebih kuat dari bentuk normal ketiga (3NF).

Catatan: - Bentuk normal Kedua, Ketiga, dan Boyce-Codd berkaitan dengan dependensi fungsional. Contoh

Bentuk normal keempat = 3NF + hapus dependensi multinilai

Bentuk normal kelima = 4NF + menghapus ketergantungan gabungan

Premraj
sumber
0

Seperti yang dikatakan Martin Kleppman dalam bukunya Designing Data Intensive Applications:

Sastra tentang model relasional membedakan beberapa bentuk normal yang berbeda, tetapi perbedaan tersebut tidak begitu menarik perhatian praktisnya. Sebagai aturan praktis, jika Anda menggandakan nilai yang dapat disimpan hanya di satu tempat, skema tidak dinormalisasi.

Arun
sumber
-10

Ini membantu mencegah duplikat (dan lebih buruk lagi, konflik) data.

Bisa berdampak negatif pada kinerja sekalipun.

Brian Knoblauch
sumber
Setelah bekerja dengan data yang dinormalisasi dan tidak dinormalisasi, saya lebih memilih penurunan kecepatan dengan normalisasi daripada kehilangan atau mengalami kesulitan untuk mempertahankan aplikasi atau database.
Schalk Versteeg
1
mesin database modern menggunakan caching, yang seringkali membuat database yang dinormalisasi lebih efisien daripada database yang tidak dinormalisasi. jika ragu, ukur.
Steven A. Lowe
1
Desain yang dinormalisasi bisa lebih cepat untuk kueri tertentu, tetapi desain yang dinormalisasi menawarkan kompromi dengan memberikan kinerja yang wajar untuk berbagai kueri yang jauh lebih luas.
Bill Karwin
@Bill, saya harus agak tidak setuju. Satu-satunya cara database yang sepenuhnya dinormalisasi membantu kinerja adalah dengan mencegah sistem berurusan dengan data yang berlebihan. Selain itu, ini adalah situasi kasus terburuk dari sudut pandang kinerja.
Brian Knoblauch
Jawaban ini tidak menambah nilai atas jawaban yang ada.
cimmanon