RDBMS'de neden birçok tasarım normalleşmeyi yok sayar?


23

Karar verme aşamasında normalleşmenin ilk dikkate alınmadığı birçok tasarım görmüştüm.

Çoğu durumda bu tasarımlar 30'dan fazla sütun içeriyordu ve ana yaklaşım “her şeyi aynı yere koymak” idi.

Hatırladığım şeye göre normalleşme ilk, en önemli şeylerden biri, peki neden bazen bu kadar kolay düşüyor?

Düzenle:

İyi mimarlar ve uzmanların denormalize bir tasarım seçtiği, deneyimli olmayan geliştiriciler ise bunun aksini seçtiği doğru mu? Tasarımınıza normalizasyon göz önünde bulundurularak başlatılmasındaki argümanlar nelerdir?


7
çünkü normalleştirilmiş DB'ler en önemsiz sorgularda bile çok fazla bir araya gelmeye ihtiyaç duyuyor
cırcır

1
bu katılımların hala manzaraya bile gizlenmiş olmaları gerekecek
cırcır ucube

29
Birçok programcı ilişkisel modelin temellerini bilmiyor.
mike30

10
"Acıyana kadar normalleş, çalışana kadar normalleştir". codinghorror.com/blog/2008/07/… bazı iyi cevaplar var.
Matthew Steeples 29:13

3
Bunu görmezden geliyorlar çünkü DBA'lara, BI analistlerine veya güvenlik denetçilerine cevap vermek zorunda değiller.
Aaron

Yanıtlar:


19

Bu soru-Cevap başlığında ilginç olan şey aslında 3 soru olduğudur. Herkes farklı bir cevap vermiş, neredeyse hiç kimse birincisini cevaplamamış:

  1. Neden değil vahşi bazı veritabanları normalize?
  2. Normalize edilmiş bir veritabanı neden / ne zaman denormalize edilmelidir ?
  3. Hangi durumlarda ilk etapta normalleşmek zararlı mı yoksa gereksiz mi?

Uyarı okuyucular, bunların çok farklı sorular olduğunu ve çok fazla ayrıntıdan kaçınırken her birine ayrı ayrı cevap vermeye çalışacağım. "Çok fazla" derken, bunun normalizasyon lehine veya aleyhine çeşitli argümanların esası hakkında geniş kapsamlı bir tartışma yürütmenin uygun bir bağlam olduğunu sanmıyorum; Ben sadece bu argümanların ne olduğunu açıklayacağım, belki bir kaç uyarıyı listeleyeceğim ve ortaya çıkarlarsa felsefeyi daha spesifik sorular için saklayacağım.

Ayrıca, bu cevabın içinde “normalleşmenin” “BCNF, 3NF veya en az 2NF” anlamına geldiğini kabul ediyorum , çünkü tasarımcıların genel olarak elde etmeyi hedeflediği normalleştirme düzeyi. 4NF veya 5NF tasarımlarını görmek daha nadirdir; Kesinlikle imkansız hedefler olmasalar da, kendilerini etki alanı hakkında oldukça fazla bilgi gerektiren sadece temsiliyetlerinden ziyade ilişkilerin anlambilimiyle ilgileniyorlar .

Yani, ileri ve yukarı:

1. Neden vahşi ortamdaki bazı veritabanları normalleştirilmiyor?

Bunun cevabı olabilir "onlar olmamalı çünkü" olabilir, ama yarasa bu varsayım doğru yapmaları oldukça çok kötü ile dedektiflik işi. Her ne olursa olsun, olması gerektiği varsayımına göre hareket etmiş olsaydık, toplum olarak fazla ilerleme kaydedemeyiz.

Veritabanlarının ilk etapta normalleşmemesinin gerçek nedenleri daha karmaşıktır. İşte karşılaştığım ilk 5:

  • Bunu tasarlayan geliştiriciler nasıl normalleşeceğini bilmiyor ya da anlamadı . Bunun güçlü kanıtı, her şey için varchar sütunlarının kullanılması ya da anlamsız tablo ve sütun isimlerinin spagetti karmaşasına sahip olması gibi eşlik eden diğer kötü tasarım seçenekleri şeklinde gelir . Ve sizi temin ederim ki, TDWTF makalelerindeki her şey kadar kötü olan "gerçek" veritabanlarını gördüm.

  • Bunu tasarlayan geliştiriciler ilke olarak umursamadı veya normalleşmeye karşı aktifti . Not, burada bağlamsal analize dayalı normalleşmek için kasıtlı olmayan bir kararın verildiği durumlardan bahsetmiyorum, daha ziyade normalleşmenin az çok anlaşıldığı ancak ihmal edildiği veya alışkanlıktan çıkarıldığı ekipler veya şirketler hakkında konuşmuyorum. Yine, şaşırtıcı derecede yaygın.

  • Yazılım bir Brownfield projesi olarak yapıldı / yapıldı . Pek çok uzman, normalleşmemek için teknik nedenlerden ziyade bu meşru meşru işi görmezden geliyor . Bazen aslında sıfırdan yeni bir veritabanı tasarlayamazsınız, mevcut bir eski şemaya cıvata takmanız gerekir ve bu noktada normalleşmeye çalışmak çok fazla acı içerecektir. 3NF, 1971 yılına kadar icat edilmedi ve bazı sistemler - özellikle de finansal / muhasebe sistemleri - kökleri bundan daha da uzaklaştı!

  • Veri tabanı başlangıçta normalize edildi , ancak uzun bir süre boyunca küçük değişikliklerin birikmesi ve / veya geniş çapta dağınık bir ekip, aslen herhangi bir normal formun ne olduğuna dair ustaca çoğaltma formları ve diğer ihlaller getirdi. Başka bir deyişle, normalizasyonun kaybı tesadüfi idi ve yeniden yapılanmaya çok az zaman harcandı.

  • İş analizi veya veri tabanı tasarımı üzerinde hiçbir zaman harcamamak ve sadece “halletmek” için bilinçli bir iş kararı verildi. Bu genellikle yanlış bir ekonomidir ve nihayetinde teknik borcun montaj şekli haline gelir , ancak bazen en azından o zaman bilinen bilgilere dayanan rasyonel bir karardır - örneğin, veri tabanı bir prototip olarak tasarlanıp sonuçlandırılmış olabilir iş ortamındaki zaman kısıtlamaları veya değişiklikler nedeniyle üretim kullanımına teşvik ediliyor.

2. Normalize edilmiş bir veri tabanı neden / ne zaman denormalize edilmelidir?

Bir veritabanı, bu tartışma sık sık gündeme gelmektedir olduğu başlamak normalize. Ya performans zayıf ya da sorgularda çok sayıda tekrarlama var (katılım) ve takım, doğru ya da yanlış olarak, mevcut tasarıma mümkün olduğunca ileri gittiklerini hissediyor. Normalleştirmenin çoğu zaman performansı arttırdığını not etmek önemlidir ve normalizasyonun size karşı çalıştığı görülüyorsa, çoğu denormalize edilmiş bir modele geçmek yerine, daha az invaziv ve riskli olan fazla birleşmeleri ortadan kaldırmak için birkaç seçenek vardır :

  • En yaygın sorunlu alanları içine alan dizinlenmiş görünümler oluşturun. Modern DBMS'ler onları eklenebilir veya güncellenebilir hale getirebilir (örneğin, SQL Server INSTEAD OFtetikleyicileri). Bu, alttaki tablolarda / dizinlerde DML ifadelerine çok düşük bir maliyetle gelir, ancak genellikle denemeniz gereken ilk seçenektir, çünkü berbat etmek neredeyse imkansızdır ve bakımının neredeyse hiçbir maliyeti yoktur. Tabii ki, her sorgu dizine alınmış bir görünüme dönüştürülemez - toplu sorgular en zahmetlidir. Bu bizi bir sonraki maddeye yönlendirir ...

  • Tetikleyiciler tarafından otomatik olarak güncellenen denormalize toplam tablolar oluşturun. Bu tablolar normalize edilmiş tablolara ek olarak bulunur ve bir tür CQRS modeli oluşturur. Bugünlerde daha popüler olan bir diğer CQRS modeli, verilerin eskimiş olamayacağı çok nadir durumlarda uygun olmasa da, zaman uyumsuzluğunun faydasını sağlayan sorgu modellerini güncellemek için pub / sub kullanmaktır.

  • Bazen, dizinlenmiş görünümler mümkün olmayabilir, işlem oranları ve veri hacimleri kabul edilebilir performansla tetikleyicileri kabul etmek için çok yüksektir ve sorgular her zaman gerçek zamanlı veriyi geri vermelidir. Bu durumlar nadirdir - Yüksek Frekanslı Ticaret veya kolluk kuvvetleri / istihbarat veritabanları gibi şeylere uygulanabileceklerini tahmin ediyorum - ama olabilirler . Bu gibi durumlarda, orijinal tabloları normalleştirmek dışında bir seçeneğiniz yok.

3. Hangi durumlarda ilk etapta normalleşmek zararlı ya da gereksiz mi?

Aslında burada birkaç iyi örnek var:

  • Veri tabanı sadece raporlama / analiz için kullanılıyorsa . Tipik olarak bu, bir olduğu anlamına gelir ek periyodik ETL veya mesaj yoluyla analiz veritabanına eşitlenir OLTP için kullanılan, normalize veritabanı olmak üzere.

  • Normalleştirilmiş bir modeli uygularken gelen verilerin gereksiz yere karmaşık bir analizini gerektirir. Buna bir örnek, birkaç harici sistemden veya veritabanından toplanan telefon numaralarını kaydetmesi gereken bir sistem olabilir. Sen olabilir farklı yerel bahsetmiyorum, çağrı kodu ve alan kodu denormalize, ancak farklı olası biçimleri geçersiz telefon numaraları, özel numaralar (1-800-GET-STUFF) tümü için hesaba gerek. Genellikle değerinden daha fazla sorun olur ve alan kodu için belirli bir işletme gereksiniminiz yoksa, telefon numaraları genellikle yalnızca tek bir alana taşınır .

  • İlişkisel veritabanı öncelikli olarak, ilişkisel olmayan ek bir veritabanı için işlem desteği sağlamak üzere olduğunda. Örneğin, ilişkisel veritabanını bir mesaj kuyruğu olarak kullanıyor olabilirsiniz ya da birincil veriler Redis veya MongoDB'de saklanırken veya bir işlemin durumunun izini sürmek ya da her neyse. Başka bir deyişle, veriler "kontrol verileri" dir. Normalde aslında işletme verileri olmayan verileri normalleştirmenin bir anlamı yoktur .

  • Fiziksel bir veritabanını paylaşan Servis Odaklı Mimari. Bu biraz garip bir durum, ancak gerçek bir SOA'da, hizmetlerin birbirlerinin verilerini doğrudan sorgulamasına izin verilmediğinden , bazen verilerin fiziksel olarak çoğaltılması gerekir. Onlar ise gerçekleşmesi aynı fiziksel veritabanını paylaşan edilecek veriler olacaktır görünür normalize olmamak - ama genel olarak her servis tarafından sahip olunan verilerin olduğu diğer hafifletici faktörlerden biri yerde olmadığı sürece hala normalize. Örneğin, bir Faturalandırma hizmeti Fatura varlığına sahip olabilir, ancak Muhasebe hizmetinin o yılın gelirine dahil edilmesi için Fatura Tarihi ve Tutarını alması ve saklaması gerekir.

Listelemediğimden daha fazla neden olduğundan eminim; Benim elde ettiğim şey, özünde, oldukça spesifik olmaları ve pratik olarak ortaya çıktığında oldukça açık olmaları. OLAP veritabanlarının yıldız şemaları kullanması gerekiyor , SOA'ların bazı kopyaları olması gerekiyordu , vb. Olması gerekiyordu . Eğer normalleştirme ile çalışmayan iyi bilinen bir mimari modelle çalışıyorsanız normalleşmiyorsunuz; Genel olarak konuşursak, mimari model veri modeline göre önceliklidir.

Ve son soruyu cevaplamak için:

İyi mimarlar ve uzmanların denormalize bir tasarım seçtiği, deneyimli olmayan geliştiriciler ise bunun aksini seçtiği doğru mu? Tasarımınıza normalizasyon göz önünde bulundurularak başlatılmasındaki argümanlar nelerdir?

Hayır, bu tam ve eksiksiz BS Aynı zamanda uzmanların da her zaman normalize edilmiş bir tasarım seçtiği BS . Uzmanlar sadece bir mantrayı takip etmiyorlar. Araştırma yapar, analiz eder, tartışır, açıklığa kavuşturur ve tekrar ederler ve sonra kendi durumları için en anlamlı olan yaklaşımı seçerler.

3NF veya BCNF veritabanı genellikle analiz için iyi bir başlangıç ​​noktasıdır , çünkü dünyanın dört bir yanındaki on binlerce projede denenmiş ve kanıtlanmıştır, ancak yine de, C de vardır. yeni proje. Gerçek dünyadaki durumlar, modelde bazı değişiklikler veya tamamen farklı bir modelin kullanılmasını gerektirebilir. Eğer oluncaya kadar bilmiyorum içinde bu durum.


1
Bunu bir blog makalesine kopyalayıp yapıştırmanız gerekir ... bu ALTIN.
Marcel Popescu

15

Sorunun içine ve bazı cevaplarda yerleşik olan varsayım, normalleşmenin eşanlamlı iyi veritabanı tasarımı olduğu şeklindedir. Bu aslında durum böyle değil. Normalleştirme, veri elemanları arasındaki ilişkiler konusunda "iş kurallarını" zorlamak için çok fazla veritabanına güveniyorsanız, belirli bir tasarım hedefleri kümesine ve bir zorunluluğa ulaşmanın bir yoludur.

Normalleştirme size birkaç önemli avantaj sağlar:

  1. Yedekli veri miktarını en aza indirir.
  2. Veri bütünlüğünü sağlamak için veritabanının yerleşik bütünlük mekanizmalarında (yabancı anahtar kısıtlamalar, benzersiz kısıtlamalar) ne ölçüde yararlanılabileceğini en üst düzeye çıkarır.
  3. Bazı durumlarda G / Ç verimliliğini artıran satır başına sütun sayısını azaltır. Geniş satırların alınması daha uzun sürer.

Bununla birlikte, denormalize etmek için pek çok geçerli neden vardır:

  1. Performans, özellikle analitik için normalleştirme ile sakat kalıyor. İlişkisel veritabanlarına karşı analiz için denormalize boyutlu modeller standart yaklaşımdır.
  2. Veritabanında veri bütünlüğünün uygulanmasının faydası azalmaya başlıyor. Gittikçe daha fazla gelişme, genellikle iş kurallarını zorlayan nesne yönelimli orta seviyeye odaklandığından, veritabanındaki ilişkisel kısıtlamalara güvenmek daha az önemlidir.
  3. Diğerlerinin de belirttiği gibi, normalleştirme, ilgili verileri almak için gereken sorguları karmaşıklaştıracaktır.

Normalleşmenin iyi bir tasarımın işareti olduğu açık değildir. Bazı durumlarda, normalleştirme, depolama alanının en üst düzeyde olduğu ve iş kurallarının veritabanında yer alan kodlama sorumluluğunun büyük ölçüde olduğu zamanların bir ürünüdür (çoğu iş mantığında olmasa bile, 2 katmanlı istemci-sunucu uygulamaları hakkında düşünün) saklı prosedürler). Pek çok projenin, veritabanı tasarım ilkelerinin zayıf bir şekilde ele alınmasından ziyade, iyi mimari kararlara dayanarak normalleşmeden uzaklaştığı söylenebilir.

Jeff Atwood'un yukarıdaki yorumlarda değinilen makalesi, bazı iyi ayrıntılı tartışmalar sunar - "Belki Normalleştirme Normal Değildir" .


7
Selam Yosi, amacını anlıyorum. Normalleşme, ilişkisel veritabanları teorisini gerçekten anlamada temeldir ve pratikte gerçek bir uygulamaya sahiptir, bu nedenle derslerde büyük bir konu olması şaşırtıcı değildir. İyi mühendisler onu anlamalı ve ne zaman uygulanması gerektiğini anlamalıdır. Ders çalışmasında kapsanmayan gibi görünen şey, selektif olarak denormalize etmenin çok fazla fayda sağlayabileceği ve bazı problemlerin kendilerini normalleştirilmiş modellere borç vermediğidir.
DemetriKots

1
Veri tutarlılığı ne durumda? Örneğin, her satış detayında dükkan isminiz varsa, farklı çelişkili açıklamalara sahip olabilirsiniz, oysa veriler normalize edilmişse, dükkan adı sadece bir tane görünür (dükkan tablosunda) ve tutarsızlığa yer yoktur.
Tulains Córdova

1
Katılıyorum. Bence normalleşme, bunun en iyi tasarım olduğu öğretilen DBA'lar tarafından zaman zaman kullanılmaya başlandı. DBA'ların ETL'deki tabloları istedikleri kadar normalleştirmelerini önerdim, ancak UI referansları tablolarına gelince, aşırı birleşme olmadan sorgulanması kolay olan tablolara ihtiyacım var. Çok fazla normalleştirilmiş tablolara rastladım, bu nedenle HOUR'lerin sorunlarını gidermeye gerek kalmadan kullanıcı sorunlarını zorlukla giderebiliyordum.
L_7337

1
Tam tersine, analitik olduğunu delicesine zor sen alamazsak başlamak normalleştirilmiş modelden. Sadece bu alıştırmadan geçmek zorunda kaldım ve cehennem gibiydi. Uygulama geliştiricileri, denormalize edilmiş bir şemanın analitik ihtiyaçları için uygun olacağını asla varsaymamalıdır. Ve normalizasyona karşı 3. maddeye gelince, bu, neredeyse maddeleşmiş / endekslenmiş görüşlerle neredeyse tamamen çözülen bir problemdir.
Aarona

1
Ve # 2 mantıklı geliyor ama pratikte gerginliği zorluyor - uygulamaların kısıtlamalarının gerçekten tamamen uygulandığı 10 + yıllarımda tek bir örnek gördüğümü hatırlamıyorum. Daha sık, veri bütünlüğü için geliştiriciler ya yanlış equate iş kuralları veya ORMs teorik gerçeğini kullanabilirsiniz olabilir hiç yerde yapmamaya mazeret olarak ilişkisel kısıtlamaları uygulamak. Belki sadece alaycı oluyorum, ama kariyer deneyimimin tümü bana "uygulamanın veri bütünlüğünü uygulayacak" gibi ifadelerin çok büyük kırmızı bayraklar olduğunu öğretti.
Aarona

11
  1. Pek çok geliştirici normalleştirme veya veri modelleme veya veritabanı hakkında hiçbir şey bilmiyor veya umursamıyor.
  2. Bazı işler için bu gerçekten önemli değil.
  3. Bazen normalleşmenin giderilmesi için gerçekten iyi bir neden olabilir, örneğin belirli bir zor iş yükünün iyi performans göstermesini sağlamak için.
  4. İlişkisel Veri Tabanı kavramları son zamanlarda, 1990'larda ve 2000'lerde olduğundan daha az modadır. Geliştiriciler, çok rasyonel olduklarını iddia etseler bile, modadan etkilenme eğilimindedirler. Tat hakkında tartışmanın bir anlamı yok.

Normalleşme, tarihsel olarak, neredeyse dini argüman için bir bölgedir, bu yüzden çok daha fazla söylemekten çekinirim.


Buna ek olarak bazen ilişkisel bir veritabanı için doğru tasarım olmadığını; örneğin, bir LDAP dizini hiyerarşiktir, bazı diğer tipler düz bir tasarımla daha iyi hizmet verebilir.
Maximus Minimus

1
4. noktaya gelince, ilişkisel veritabanlarının daha az moda olduğunu ve nosql çeşitleri için değiştirilmeye başladığını söyleyebilirim ve bu aslında çoğu zaman harika bir şey. Ancak bir RDBMS kullanarak ilişkisel olmayan veri modellerini bir araya getiren pek çok taşıyıcı ve çalkalayıcı göremiyorum. Bu sadece aptalca.
Aaron

@joshp - Teşekkürler, güzel özeti. Madde 3, kişisel olarak daha çok ilgilendiğim nokta. Neden diğer faktörler normalleşmenin gerekliliğini "alt ediyor".
Yosi Dahari

@JimmyShelter Katılıyorum. Moda bir yana, ilişkisel her zaman en iyi seçenek değildir.
joshp

4
@Yosi - Bazı faktörlerin normalizasyona dayanabilmesi nedeni, normalizasyonun, veriler eklenirken, güncellenirken ve silinirken yaygın veri tutarlılığı sorunlarını önlemek için bir teknik olmasıdır. Veriler bir kez yazılırsa ve sadece bundan sonra okunursa, CRUD'un C, U ve D değerleri artık önemli değil. Böyle bir durumda normalleştirmenin faydaları temel olarak anlamsızdır, bu nedenle okuma performansı veya sorgu basitliği gibi diğer rekabet baskıları öncelikli olabilir.
Joel Brown

9

Büyük projelerde ve özellikle ana makinelerde bulunanlarda, durum böyle değil. Aslında şantiyelerde arama yaparsanız, veri modelleyicileri için çeşitli pozisyonlar göreceksiniz. Ayrıca, tek bir masada çok sayıda sütuna sahip olmak normalleşmeye karşı gelmez. Bununla birlikte, gözleminiz bazı projeler için geçerlidir.

Veri tabanı tasarımı, kaliteli sistemler oluşturmak için gereken becerilerden biridir. Bunu söyledikten sonra, bazı geliştiriciler veritabanı tasarımı hakkında yeterince bilgilemezler ve yine de veri modelleme ve veritabanı tasarımı görevine atanırlar. Bazı projeler bile veri modellemeyi atlar. Birçok projeye odaklanma esas olarak kodlama ve ön uç tasarımıdır.

Zayıf veri tabanı tasarımı için bir başka faktör, Normalizasyon'un 4. NF, 5. NF vb. İçin özel olarak önemsiz bir konu olmadığı gerçeğidir. Genellikle kötü örnekler ve çok fazla teori vardır. Bu, konuyu olması gerekenden daha az popüler yapar.

Veritabanı tasarımında hatalar, arama yapmadıkça veya sınama sırasında onlarla karşılaşmazsanız ortaya çıkması zordur. Veri tabanı tasarımı kalitesi için standartlara sahip olmamak, hataların daha muhtemel olmasını sağlar.

Buna ek olarak, bazı projelerin titiz bir geliştirme metodolojisine (veritabanı tasarımını teşvik eden) uymadığı gerçeğinin bir sonucu olarak, sonuçların iş analisti, geliştiriciler ve DBA'lar arasında sorumlulukların karışması ve görevlerin kaybolması söz konusu. Geliştiriciler OO ve UML'de konuşur, burada DBA'lar DD'de ve bazıları ERD'lerde konuşur ve muhtemelen çoğu UML veya OO almaz. Kısacası, bilgi eksikliği, net kaynakların iyi olmaması, verileri tanımlamak için birleşik bir dil eksikliği ve metodoloji eksikliği suçlanıyor.


Belge / makalelerin veri tabanı tasarım kalitesini (sadece şema değil, prosedürleri de) önerebilir misiniz?
Tilak

"tek bir masada birçok sütuna sahip olmak normalleşmeye karşı gelmez" -Sure.Mour #entailments idi. Sadece basitlik için # sütunlardan bahsettiğim soruya göre, benim okuyucumun korelasyonu anlayacağı ve bununla ne demek istediğimi
anladığıma inanıyorum

@Tilak, en iyi yönergeleri almak için belirli bir referans olup olmadığından emin değilim, ancak listenizi veri modelleme ve veritabanı tasarımı literatüründen alabilirsiniz. Sorunuzu cevaplamıyorsa üzgünüm. Bunun bir kitap için iyi bir konu olabileceğini düşünüyorum.
NoChance
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.