Kapan sebaiknya Anda mendenormalisasi?


45

Saya pikir kita semua akrab dengan normalisasi basis data .

Pertanyaan saya adalah: Apa saja panduan yang Anda gunakan saat Anda ingin mendenormalisasi tabel?


3
Situs StackExchange memiliki keunggulan unik dibandingkan situs lain di internet yaitu 1) mereka memungkinkan jawaban terbaik untuk menjadi yang paling mudah ditemukan dan 2) jawaban terbaik ditentukan oleh komunitas. Karena itu, saya percaya bahwa situs ini dan internet akan mendapat manfaat dari pertanyaan ini, meskipun itu semacam bertentangan dengan faq .
Richard


1
Kemungkinan duplikat / informasi terkait Kapan Mendenormalkan Desain Basis Data
John Sansom

Jawaban:


34

Denormalkan ketika itu operasi OLAP, normalkan saat OLTP (dari artikel yang ditautkan di bawah bagian Denormalization)

Database yang dimaksudkan untuk pemrosesan transaksi online (OLTP) biasanya lebih dinormalisasi daripada database yang dimaksudkan untuk pemrosesan analitik online (OLAP). Aplikasi OLTP dicirikan oleh volume tinggi transaksi kecil seperti memperbarui catatan penjualan di kasir supermarket. Harapannya adalah bahwa setiap transaksi akan meninggalkan database dalam keadaan yang konsisten. Sebaliknya, basis data yang dimaksudkan untuk operasi OLAP terutama adalah basis data "baca kebanyakan". Aplikasi OLAP cenderung mengekstraksi data historis yang telah terakumulasi dalam periode waktu yang lama. Untuk database seperti itu, data yang redundan atau "didenormalkan" dapat memfasilitasi aplikasi intelijen bisnis. Secara khusus, tabel dimensi dalam skema bintang sering berisi data yang dinormalisasi. Data yang didenormalkan atau redundan harus dikontrol dengan hati-hati selama proses ekstraksi, transformasi, pemuatan (ETL), dan pengguna tidak boleh diizinkan untuk melihat data sampai dalam kondisi yang konsisten. Alternatif yang dinormalisasi untuk skema bintang adalah skema kepingan salju. Dalam banyak kasus, kebutuhan untuk denormalisasi telah berkurang ketika komputer dan perangkat lunak RDBMS telah menjadi lebih kuat, tetapi karena volume data secara umum meningkat seiring dengan kinerja perangkat keras dan perangkat lunak, basis data OLAP sering masih menggunakan skema denormalized.

Denormalisasi juga digunakan untuk meningkatkan kinerja pada komputer yang lebih kecil seperti pada mesin kasir dan perangkat seluler yang terkomputerisasi, karena ini dapat menggunakan data hanya untuk pencarian saja (mis. Pencarian harga). Denormalisasi juga dapat digunakan ketika tidak ada RDBMS untuk platform (seperti Palm), atau tidak ada perubahan yang harus dilakukan pada data dan respons cepat sangat penting.


4
Saya mendenormalisasi ketika saya membuat laporan atau analisis dan saya ingin hasil yang cepat. Semua indeks di dunia dengan banyak gabungan tidak pernah secepat tabel denormalized yang mewakili data cache yang tidak akan berubah.
kevinsky

Singkat dan sangat membantu. Saya telah bekerja di pinggiran DBA dan ini membantu membawa banyak hal dalam lingkaran penuh.
Jason P Sallinger

Banyak aplikasi memiliki bit persyaratan OLAP dan OLTP, sehingga setiap pengembang backend harus belajar bagaimana mencampur keduanya dan bagaimana menjaga data yang didenormalkan tetap up-to-date.
JustAMartin

22

Normalisasi sampai sakit, denormalkan sampai berfungsi (mis .: kinerja menjadi dapat diterima) :)


5
Ini mungkin bukan jawaban terbaik, tetapi ini adalah salah satu kalimat terbaik yang pernah saya lihat di Stack Overflow :)
Owen

15

Salah satu alasan yang berpotensi masuk akal untuk menerapkan denasionalisasi yang terkendali adalah jika hal itu memungkinkan Anda untuk menerapkan beberapa batasan integritas pada data yang tidak mungkin dilakukan. Sebagian besar DBMS SQL memiliki dukungan yang sangat terbatas untuk kendala multi-tabel. Dalam SQL kadang-kadang satu-satunya cara efektif untuk mengimplementasikan batasan tertentu adalah untuk memastikan bahwa atribut yang terlibat dalam kendala semuanya ada dalam tabel yang sama - bahkan ketika normalisasi akan menentukan bahwa mereka termasuk dalam tabel yang terpisah.

Denormalisasi yang terkendali berarti mekanisme diterapkan untuk memastikan bahwa ketidakkonsistenan tidak dapat muncul karena data yang berlebihan. Biaya dari kontrol tambahan ini dan risiko data yang tidak konsisten perlu dipertimbangkan ketika memutuskan apakah denormalisasi bermanfaat.

Alasan umum lain untuk denormalisasi adalah untuk mengizinkan beberapa perubahan dalam struktur penyimpanan atau mengizinkan beberapa optimasi fisik lain yang tidak diizinkan oleh DBMS. Menurut prinsip Kemandirian Data Fisik, DBMS harus memiliki sarana untuk mengonfigurasi struktur penyimpanan internal tanpa perlu mengubah representasi logis data dalam database. Sayangnya banyak DBMS sangat membatasi pilihan implementasi fisik yang tersedia untuk setiap skema database yang diberikan. Mereka cenderung kompromi independensi database fisik dengan hanya mendukung implementasi sub-optimal dari model logis yang diinginkan.

Seharusnya jelas tetapi masih perlu dikatakan: dalam semua kasus hanya perubahan dalam fitur implementasi fisik yang dapat menentukan kinerja - fitur seperti struktur data internal, file, pengindeksan, perangkat keras dan sebagainya. Normalisasi dan denormalisasi tidak ada hubungannya dengan optimalisasi kinerja atau penyimpanan.


4

Denormalize jika Anda sering mengakses data dihitung, seperti yang disarankan dalam jawaban atas pertanyaan ini . Biaya penyimpanan dan pemeliharaan data yang dikomputasi akan sering lebih kecil dari biaya komputasi ulang berulang-ulang jika profil beban Anda baca-berat.


Perhatikan bahwa ini sangat membantu jika denasionalisasi hanya untuk nilai cache . Sehingga masih ada koleksi tabel / bidang yang dinormalisasi yang mendasarinya . Artinya, untuk setiap nilai, harus ada sel "master" tunggal yang memegang nilai itu - nilai lain diketahui hanya salinan atau perhitungan dari master itu - dan kecuali ada manfaat kuat untuk melakukan sebaliknya, simpan semua sel master dalam hubungan yang dinormalisasi.
ToolmakerSteve

3

Saya secara rutin mendenormalisasi sehingga saya dapat menegakkan integritas data dengan kendala. Salah satu contoh adalah pertanyaan terbaru di situs ini - saya mereplikasi kolom di tabel lain, sehingga saya bisa menggunakan PERIKSA kendala untuk membandingkannya dengan kolom lain. Contoh lain dari teknik ini adalah posting blog saya .

Anda tidak dapat menggunakan kendala PERIKSA untuk membandingkan kolom dalam baris yang berbeda atau dalam tabel yang berbeda, kecuali jika Anda membungkus fungsi tersebut dalam skalar UDF yang dipanggil dari kendala CHECK. Bagaimana jika Anda benar-benar perlu membandingkan kolom di baris yang berbeda atau di tabel yang berbeda untuk menegakkan aturan bisnis? Misalnya, anggap Anda tahu jam kerja dokter, dan Anda ingin memastikan bahwa semua janji temu sesuai jam kerja? Tentu saja, Anda dapat menggunakan pemicu atau prosedur tersimpan untuk menerapkan aturan bisnis ini, tetapi pemicu atau prosedur tersimpan tidak dapat memberi Anda 100% jaminan bahwa semua data Anda bersih - seseorang dapat menonaktifkan atau menjatuhkan pemicu Anda, memasukkan beberapa data kotor, dan aktifkan kembali atau buat kembali pemicu Anda. Juga seseorang dapat langsung memodifikasi tabel Anda dengan melewati prosedur yang tersimpan.

Izinkan saya menunjukkan cara menerapkan aturan bisnis ini hanya dengan menggunakan batasan FK dan PERIKSA - yang akan menjamin bahwa semua data memenuhi aturan bisnis selama semua kendala dipercaya.

Namun contoh lain adalah cara untuk menegakkan bahwa periode waktu tidak memiliki celah dan tidak ada tumpang tindih .


1
"Saya secara rutin mendenormalisasi sehingga saya dapat menegakkan integritas data dengan kendala." Sama disini. Ini adalah kompromi yang baik: Anda sedikit melakukan denormalkan tetapi mendapatkan DRI .
Nick Chammas

@NickChammas - ini sangat menarik. Bisakah Anda membagikan skenario ketika Anda melakukan hal-hal seperti itu?
AK

1
Pasti. Kami memiliki sistem Pemenuhan yang mencakup antrian item yang harus dipenuhi. Ada Fulfillabletabel dengan semua detail pada setiap item yang dapat dipenuhi, dan kemudian ada FulfillableQueuetabel yang mengimplementasikan antrian di SQL Server . Hanya Pemenuhan dengan tertentu yang StateIDmungkin ada dalam antrian. StateIDada di Fulfillabletabel, tapi saya meniru FulfillableQueuedan kemudian menegakkan batasan FOREIGN KEYdan CHECKkendala ini.
Nick Chammas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.