Ne zaman denormalize etmelisin?


45

Bence hepimiz veritabanı normalleştirmeye aşinayız .

Sorum şu: Tabloları denormalize etmek istediğinizde kullandığınız bazı kurallar nelerdir?


3
StackExchange siteleri, internetteki diğer sitelere göre benzersiz bir avantaja sahiptir ki, 1) en iyi cevapların en kolay şekilde bulunmasını sağlar ve 2) en iyi cevaplar topluluk tarafından belirlenir. Bu nedenle, ben buna rağmen bu site ve internet, bu soruya yararlanacak inanıyoruz tür aykırı sss .
Richard,


Yanıtlar:


34

OLAP işlemleri olduğunda denormalize et, OLTP olduğunda normalize et (Denormalizasyon bölümü altındaki bağlantılı makaleden)

Çevrimiçi işlem gerçekleştirmeye yönelik veritabanları (OLTP), çevrimiçi analitik işlemeye (OLAP) yönelik veritabanlarından genellikle normalize edilir. OLTP uygulamaları, bir süpermarket kasa sayacında bir satış kaydının güncellenmesi gibi yüksek miktarda küçük işlemle karakterize edilir. Beklenti, her işlemin veritabanını tutarlı bir durumda bırakmasıdır. Buna karşılık, OLAP işlemlerine yönelik veritabanları öncelikle “çoğunlukla okunur” veritabanlarıdır. OLAP uygulamaları, uzun bir süre boyunca biriken geçmiş verileri çıkarma eğilimindedir. Bu tür veritabanları için fazlalık veya "denormalize" veriler iş zekası uygulamalarını kolaylaştırabilir. Spesifik olarak, bir yıldız şemasındaki boyutsal tablolar genellikle denormalize veri içerir. Denormalize veya gereksiz veriler, alma, dönüştürme, yükleme (ETL) işleme sırasında dikkatlice kontrol edilmeli ve kullanıcıların tutarlı bir duruma gelinceye kadar verileri görmelerine izin verilmemelidir. Yıldız şemalarına normalize edilmiş alternatif, kar tanesi şemasıdır. Çoğu durumda, bilgisayarlar ve RDBMS yazılımı daha güçlü hale geldikçe denormalizasyon ihtiyacı azalmıştır, ancak veri hacimleri genellikle donanım ve yazılım performansı ile birlikte arttığından, OLAP veritabanları genellikle denormalize şemalar kullanmaktadır.

Denormalizasyon, bilgisayarlı yazarkasalarda ve mobil cihazlarda olduğu gibi daha küçük bilgisayarlarda da performansı artırmak için kullanılır, çünkü bunlar yalnızca arama için verileri kullanabilir (örn. Fiyat aramaları). Denormalizasyon, bir platform için (Palm gibi) herhangi bir RDBMS olmadığında veya verilerde herhangi bir değişiklik yapılmaması durumunda ve hızlı bir yanıt için çok önemli olduğunda da kullanılabilir.


4
Rapor veya analiz oluştururken denormalize ediyorum ve hızlı sonuç almak istiyorum. Dünyadaki birden fazla birleştirme ile tüm endeksler hiçbir zaman değişmeyecek önbelleklenmiş verileri temsil eden denormalize bir tablo kadar hızlı değildir.
kevinsky

Özlü ve çok faydalı. DBA'nın çevresi üzerinde çalışıyorum ve bu da bir çok şeyi tam daire haline getirmeye yardımcı oluyor.
Jason P Sallinger

Birçok uygulamanın hem OLAP hem de OLTP gereklilikleri vardır, bu nedenle her arka uç geliştirici bunların hem nasıl karıştırılacağını hem de denormalize verilerin güncel tutulmasını öğrenmelidir.
JustAMartin

22

Acıyana kadar normalleştirin, çalışana kadar normalleştirin (yani: performans kabul edilebilir hale gelir) :)


5
Bu muhtemelen en iyi cevap değil, ancak Stack Overflow'da gördüğüm en iyi arkadaşlardan biri :)
Owen

15

Kontrollü denormalizasyon uygulamak için potansiyel olarak mantıklı bir sebep, aksi takdirde mümkün olmayacak olan verilere bazı bütünlük kısıtlamaları uygulamanıza olanak sağlamasıdır. Çoğu SQL DBMS'nin çoklu tablo kısıtlamaları için son derece sınırlı desteği vardır. SQL'de bazen belirli kısıtlamaları uygulamak için tek etkili yol, kısıtlamaya dahil olan özelliklerin aynı tabloda mevcut olmasını sağlamaktır - normalizasyon ayrı ayrı tablolara ait olduklarını belirlese bile.

Kontrollü denormalizasyon, gereksiz verilerden kaynaklanan tutarsızlıkların ortaya çıkmamasını sağlamak için mekanizmaların uygulanması anlamına gelir. Bu ekstra kontrollerin maliyeti ve tutarsız veri riski, denormalizasyonun faydalı olup olmadığına karar verirken göz önünde bulundurulmalıdır.

Denormalizasyonun diğer bir yaygın nedeni, depolama yapılarında bazı değişikliklere izin vermek veya DBMS'nin başka şekilde izin vermeyeceği başka fiziksel optimizasyonlara izin vermektir. Fiziksel Veri Bağımsızlığı ilkesine göre bir DBMS, veritabanındaki verilerin mantıksal gösterimini gereksiz yere değiştirmeden iç depolama yapılarını yapılandırma araçlarına sahip olmalıdır. Ne yazık ki, çoğu DBMS belirli bir veritabanı şeması için mevcut fiziksel uygulama seçeneklerinde çok kısıtlayıcıdır. İstenen mantıksal modelin yalnızca optimal alt bir uygulamasını destekleyerek fiziksel veri tabanının bağımsızlığını tehlikeye atma eğilimindedirler.

Açık olması gerekir, ancak yine de söylenmesi gerekir: Her durumda, yalnızca performansı belirleyebilecek fiziksel uygulama özelliklerinde yapılan değişiklikler - iç veri yapıları, dosyalar, indeksleme, donanım vb. Normalleştirme ve denormalizasyonun performans veya depolama optimizasyonu ile ilgisi yoktur.


4

Bu sorunun cevaplarında önerildiği gibi, hesaplanan verilere sıklıkla erişiyorsanız denormalize edin . Hesaplanan verilerin saklanması ve muhafaza edilmesinin maliyeti, yük profiliniz okuma ağır ise, genellikle tekrar tekrar hesaplamanın maliyetinden daha az olacaktır.


Bu, özellikle denormalizasyonun sadece değerleri önbelleğe almak için faydalı olduğunu unutmayın . Böylece, hâlâ normalize edilmiş bir tablo / alan koleksiyonu var. Yani, her bir değer için, bu değeri tutan tek bir "ana" hücre olmalıdır - diğer değerlerin yalnızca bu ana birimden kopyaları ya da hesaplamaları olduğu biliniyor - ve aksi halde yapmanın bazı güçlü yararları yoksa, tüm ana hücreleri saklayın normalleştirilmiş ilişkilerde.
ToolmakerSteve

3

Veri bütünlüğünü kısıtlamalarla zorlayabilmem için rutin olarak normalleştiriyorum. Bir örnek, bu sitedeki son bir soru - Başka bir tablodaki bir sütunu çoğalttım, böylece başka bir sütuna karşılaştırmak için CHECK kısıtlaması kullanabilirim. Bu tekniğin bir başka örneği blog yazım .

Bu gibi işlevselliği skaler UDF'lere çağırdıysanız, bir CHECK kısıtlaması oluşturmadan farklı satırlardaki veya farklı tablolardaki sütunları karşılaştırmak için CHECK kısıtlamalarını kullanamazsınız. Bir iş kuralını uygulamak için gerçekte farklı satırlardaki veya farklı tablolardaki sütunları karşılaştırmanız gerekirse? Örneğin, bir doktorun çalışma saatlerini bildiğinizi ve tüm randevuların çalışma saatlerine uygun olduğundan emin olmak istediğinizi varsayalım. Elbette, bu işletme kuralını uygulamak için bir tetikleyici veya saklı yordam kullanabilirsiniz, ancak ne tetikleyici ne de saklı yordam, tüm verilerinizin temiz olduğu konusunda% 100 garanti veremez - birisi tetikleyicinizi devre dışı bırakabilir veya bırakabilir, kirli verileri kullanın ve tetikleyicinizi yeniden etkinleştirin veya yeniden oluşturun. Ayrıca birisi saklı yordamları atlayarak doğrudan tablonuzu değiştirebilir.

Bu iş kuralının yalnızca FK ve CHECK kısıtlamaları kullanılarak nasıl uygulanacağını göstereyim - bu, tüm kısıtlamalara güvenildiği sürece tüm verilerin iş kuralını yerine getirdiğini garanti eder.

Yine bir başka örnek, zaman aralıklarının boşluk ve örtüşme olmadığını zorlamanın bir yoludur .


1
"Veri bütünlüğünü kısıtlamalarla zorlayabilmem için rutin olarak normalleştiriyorum." Burada aynı. Harika bir takas: Biraz denormalize ediyorsun ama DRI kazanıyorsun .
Nick Chammas

@NickChammas - bu çok ilginç. Böyle şeyler yaparken senaryoları paylaşır mısınız?
AK

1
Kesinlikle. Yerine getirilmesi gereken maddeler sırasını içeren bir Yerine Getirme sistemimiz var. Bir yoktur Fulfillabletablo, her Fulfillable maddedeki tüm ayrıntıları ile ve daha sonra bir orada FulfillableQueuetablo olduğunu uygular , SQL Server kuyruk . Kuyrukta yalnızca belirli olan Doldurulabilirler StateIDbulunabilir. StateIDolduğu Fulfillablemasaya ama bunu çoğaltmak FulfillableQueueve daha sonra bu kısıtlamayı zorlamak FOREIGN KEYve CHECKkısıtlamalar.
Nick Chammas,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.