Seberapa jauh Anda harus berjalan dengan normalisasi?

30

Saya memiliki jumlah data yang layak dalam database. Saya telah membentuk tabel dan hubungan yang baik di antara mereka dengan beberapa redundansi dalam data saya. Tetapi seberapa jauh saya harus berjalan dengan normalisasi? Apakah ada kekurangan kinerja karena terlalu banyak normalisasi?

Fergus
sumber

Jawaban:

37

Anda harus melangkah sejauh yang seharusnya, dan tidak lebih jauh. Tentu saja. ~ Masalahnya mungkin ini sedikit seni, dan itulah mengapa ini bukan ilmu murni.

Produk utama kami adalah sistem analisis dan pelaporan, dan karenanya, kami memiliki beberapa catatan detail. Awalnya kami mendesainnya dengan banyak gabungan pada ID umum untuk beberapa catatan anak, tetapi kami menemukan bahwa jika kami mendenormalkan beberapa bidang, kami dapat memotong BANYAK gabungan dan kami dapat menghilangkan banyak sakit kepala kinerja.

Tetapi kami hanya tahu bahwa karena kami 1) menciptakan desain "dinormalisasi", 2) mulai menggunakannya, 3) membuat profil kinerja aktual setelah ratusan juta baris di lusinan tabel.

Kisah akhirnya adalah bahwa sampai kami membuat profil, kami tidak tahu pasti apa yang akan berhasil bagi kami. Kami menyukai gagasan normalisasi sehingga kami dapat memperbarui dengan lebih mudah, tetapi pada akhirnya kinerja sebenarnya adalah faktor penentu. Itu saran saya untuk Anda: Profil, profil, profil.

jcolebrand
sumber
4
seni dan bukan sains meminjamkan saya untuk percaya itu voodoo. Ada referensi?
abel
3
@ Bel, bagaimana dengan anekdot saya secara umum? Seorang profiler mungkin dapat menyarankan aturan untuk denormalisasi, tetapi aturan itu berasal dari seorang programmer dari pengalaman. Semua pemrograman adalah seni. Saya akan menemukan seseorang yang lebih terkenal yang mengatakan hal yang sama ketika saya mendapatkan keyboard lengkap nanti.
jcolebrand
1
@ Bel oh yah kalau begitu semuanya in ('forgiven','pardoned');): p
jcolebrand
2
@ Fergus senang Anda menyukainya. Saya selalu menemukan anekdot bekerja paling baik.
jcolebrand
2
@abel - 'Seni adalah ilmu dengan lebih dari 7 derajat kebebasan'. Melampaui tingkat kerumitan tertentu, pendekatan menyeluruh terhadap masalah menjadi tidak mungkin. Pada titik itu pendekatan heuristik berdasarkan pengalaman paling efektif. Sayangnya, di bidang komputasi tingkat kerumitan itu cukup mudah dicapai pada apa pun kecuali sistem perangkat lunak sepele.
ConcernedOfTunbridgeWells
10

Normalisasi adalah tujuan hanya ketika mendukung model data Anda dengan cukup baik untuk menjaminnya. Ini dimaksudkan sebagai panduan untuk memungkinkan pertumbuhan, manajemen, dan pemeliharaan. Ingatlah bahwa buku tentang normalisasi, juga penulisnya tidak akan membangun atau memelihara database atau aplikasinya.

Bacaan yang bagus tentang "terlalu banyak normalisasi" ada di sini.

Dan, ya mungkin ada dampak kinerja terhadap terlalu banyak normalisasi. Ini akan berada di tabel traversal yang lebih dalam untuk mengambil hal-hal seperti tabel indikator status ketika mereka telah ditarik ke meja terpisah. Beberapa orang akan mengatakan ini biasanya dinegasikan dalam kecepatan pembaruan (mengubah teks status dari "Baik" menjadi "BAIK" atau semacamnya) atau dalam pemeliharaan.

REW
sumber
2
Berikut ini adalah bacaan tambahan yang bagus tentang masalah ini dan jauh lebih menghibur qntm.org/gay
jcolebrand
5

Saya sarankan membaca lampiran berikut ini yang ditemukan di beberapa buku terbaru Chris Date :

Dua Ceria Untuk Normalisasi

Normalisasi jauh dari menjadi obat mujarab, seperti yang kita dapat dengan mudah melihat dengan mempertimbangkan apa tujuannya dan seberapa baik tindakan terhadap mereka ...

Saya harus menjelaskan bahwa saya tidak ingin komentar saya di bagian ini dilihat sebagai serangan apa pun. Saya percaya dengan kuat bahwa sesuatu yang kurang dari desain yang sepenuhnya dinormalisasi sangat kontraindikasi ...

suatu hari nanti
sumber
2

Saya pikir sama pentingnya untuk melihat denormalisasi yang ditambahkan secara eksplisit, baik nilai agregat yang ditambahkan atau beberapa bidang dari tabel master yang disalin ke salinan detail.

Argumen sebagian besar menjadi beberapa argumen kinerja.

Jika Anda melakukannya, pastikan bidang-bidang tersebut diperbarui oleh pemicu dan terserah pada database untuk tetap konsisten.

bernd_k
sumber
2

Saya sangat setuju dengan @jcolebrand. Saat Anda merancang model untuk aplikasi Anda, Anda harus menormalkan semua yang Anda bisa. Tetapi kemudian Anda harus membuat profil kueri yang dibangun di atas model Anda, terutama yang sering dieksekusi.

Pengalaman saya sendiri: atribut yang membutuhkan dua gabungan untuk mencapai (itu berarti tiga tabel bergabung) sebagian besar akan menjadi babi kinerja. Dan untuk memperburuk keadaan, digunakan dalam transaksi online. Saya mendenormalkan atribut, jadi hanya perlu satu bergabung dan meminta programmer untuk menyesuaikan aplikasi mereka untuk permintaan dan memperbarui atribut. Sekarang ini bekerja jauh lebih baik ...

Dengan kata lain, Anda harus menyeimbangkan normalisasi dengan kinerja.

Isaac A. Nugroho
sumber