Yinelenen veritabanı sütunlarına karşı ikna edici bir şekilde nasıl savunabilirim?


47

Yeni bir organizasyonda çalışmaya başladım ve veritabanında gördüğüm modellerden biri, işletme analistleri için sorgu yazmayı kolaylaştırmak için alanları çoğaltıyor. Django ve ORM kullanıyoruz.

Bir durumda, bir hastayı belirli bir bağlamda tanımlayan benzersiz bir dize ile MedicalRecordNumber nesnesini tutarız . Biz Tescil hastaları izlemek ve ilgili olan nesneleri MedicalRecordNumbers ziyade bir yabancı anahtar ilişkisi kullanmaktan daha onlar katılmak yazılmasını önlemek, böylece onlar dize çoğaltmak ( değil performans nedenleriyle). Bu kalıp veri tabanı genelinde yaygındır.

Benim için temiz bir veri modelinin önemi sadece iyi düşünebilmem için. Gereksiz karmaşıklık, sınırlı bilişsel işlem süremin boşa harcanmasıdır. Bu sistematik bir problem. Yazarken rahat olmamak, birleştirilebilir bir beceri sorunudur. Mutlaka geri dönüp şemayı değiştirmeyi savunmak istemem ama bu tür bir çoğaltma ile ilgili sorunları ikna edici bir şekilde ifade etmeyi çok isterim.


2
"Yazarken rahat olmamanın" ne demek? Bunu nasıl açıklarlar?
scriptin

9
Bu millet senin için çalışıyor mu? Sen onların amiri misin? Gerekçelerinizin çoğu burada bulunabilir: en.wikipedia.org/wiki/Database_normalization . Evet, birleşme kullanarak daha iyi olmaları gerekir.
Robert Harvey

1
Neden normalleşmenin istendiğine dair literatüre baktınız mı?
Nathan Tuggy

17
İçeride bir araya gelen görünümler eklemek yazma sorgularını bu kadar kolay hale getirmez mi? Onları bir alternatif olarak önerebilirsin.
CodesInChaos

1
Bunu (kibarca) arkadaşlarınızla ve yaşlılarınızla muhabere ettiniz mi? Gerekçeleri neler, nelere dikkat ediyorlar? Bunun iyi bir fikir olmasının birçok nedeni olabilir (“performans neden değildir” olsa bile, bunu desteklemeniz için hangi kanıtlar?). Onları çok tembel ve / veya katı olmakla suçlamadan önce, tasarıma olduğu gibi sahip olma nedenlerini göz önünde bulundurdunuz (ve istediniz)? Belki de yazdığından çok daha fazla okuma vardır (analytics heavy DB)? İzlemeyi değiştir? Tarihsel veri? Herkese sorun - birisi gerçek nedeni biliyor olabilir .
Luaan

Yanıtlar:


128

Operasyonel veritabanınız anomalileri azaltmak için oldukça normalize edilmelidir .

Analitik veritabanınız (depo) analizi kolaylaştırmak için yüksek oranda denormalize edilmelidir.

Ayrı bir analitik veritabanınız yoksa, bazı oldukça denormalize edilmiş [materyalize] görüşler sunmalısınız.

Üst düzey iş analistinize / yöneticilerinize basit bir analiz için çok sayıda katılım yapmalarını söylerseniz, işten kovulabilirsiniz.

Çevik Veri Ambarı Tasarımı iyi bir kitaptır

Hızlı n 'kirli veri ambarı ipuçlarım için buraya göz atın


9
Bu gitmek için doğru yoldur.
Nit

6
+1 Bu, tam olarak Görünüm'ün amaçlandığı şeydir: normalleştirilmiş bir veritabanında denormalize bir görünüme izin vermek.
Nzall

4
Kesinlikle doğru, ancak sorunun ana cevabı bu olduğundan "anomalileri azaltma" nın daha fazla vurgulanması gerektiğini düşünüyorum. En sık (sadece?) Anomali veri çoğaltma ile göreceksiniz / denormalization sütunları nasılsa gerçek veri ne bilmenin bir yolu size bırakarak aynı anda çelişkili verilerle doldurulan alacak olmasıdır sözde hayır olması ve neyin yanlış gittiğini belirleme yöntemi. İkincisi, büyük çaplı değişikliklerin izlenmesiyle hafifletilebilir, ancak bu, sorunu çözmek için kolay ve ucuz olmayacaktır. Sorunu tamamen önlemek için daha uygun maliyetli.
jpmc26

2
Dikkate alınması gereken bir başka husus, geliştiricilerin verileri doğru tutabildiğini (şüpheli) kabul etmekle birlikte, tutarlılık sağlamak için gerektiğinde her yinelenen alanın güncellenmesini sağlamak için kaynakları üzerinde büyük bir boşalma haline geldiğidir.
Nate CK,

1
@Panzercrisis Bir işlem "örtük" tek yolu, sorgunuzun sonunda çalışan bir otomatik işlem varsa. Bu genellikle bir üretim veritabanı için geçerli olmamalıdır. Bir uygulamada, işlemler otomatik olarak başlatılmalı ve sorgudan ayrı bir taahhütte bulunulmalıdır. Bu, uygulamaya yapılan küçük bir ön yatırımdır, ancak veritabanı çağrıları eklemeyi içeren ve geliştiricinin ne kadar düşünmesi gerektiğini azaltan kod değişikliklerini basitleştirir (geliştirme hızını artırır, geliştirme hatalarını azaltır). Bu tür bir tasarım, bağlantı havuzu oluşturma gibi şeylerle de uyumludur.
jpmc26

57

Anladım, neden birileri her seçim için bir katılmak istemekten kaçınmak istiyor .

Ancak bir kez birleştirme ile bir görünüm oluşturabilir ve normal olmayan tablonuzun yerine kullanabilirsiniz.

Böylece normalizasyonun avantajını kolay seçimin rahatlığı ile birleştirirsiniz.


12
Görünümler senin arkadaşların. Onları liberal olarak kullan. Ayrıca, performans için RDBMS'niz destekliyorsa Materyalleştirilmiş görünümleri bile kullanabilirsiniz .
VH-NZZ

13

Zaten fazla oy alan cevaplar “çoğaltmanın nasıl önleneceğini” (görünümleri kullanarak) kapsar ancak sebebini değil. Temel olarak, sütunların çoğaltılmasının, sorgu yazmayı kolaylaştırma sorununa yanlış bir çözüm olduğunu göstermektedir. Ancak, "neden sadece bunun için rastgele bir sütunu çoğaltmıyorsunuz?" hala duruyor.

Cevap "Murphy Kanunu'ndan dolayı" dır. Murphy kanunu şöyle belirtir:

Bir şey yanlış gidebilirse, olur.

Bu durumda, çoğaltılmış bir sütunun her bir satır alanının içeriğinin, orijinal sütunun karşılık gelen her bir satır alanının içeriğiyle aynı olması gerekir. Yanlış gidebilen şey, bazı satır alanlarının içeriğinin orijinallerden farklı olması, hasara yol açması. Sen onlar farklılık emin olmak için tüm akla önlemleri almış olduğunu düşünebilirsiniz, ama Murphy kanunu beri belirtiyor onlar yapabilirsiniz farklılık onlar olacaktır farklıdır. Ve tahribat gerçekleşecek .

Bunun nasıl olabileceğinin bir örneği olarak, çoğaltılmış sütunların sihirle dolmadığı gerçeğini düşünün; Birisi aslında orijinal tabloda satırlar oluşturulduğunda kendi içinde değerleri saklayan bir kod yazmalı ve bir tanesi de orijinaller ne zaman değiştirilse, güncellenmeye devam eden bir kod yazmalıdır. Bunun, veri tabanına veri giren koda (ve tanım gereği sadece veri tabanını sorgulayan herhangi bir koda göre çok daha önemli olan) çok fazla yük getirdiği gerçeğini bir kenara bırakmak, bazı durumlarda, bazı durumlarda unutabilir. bu kopyalamayı yapmak için. Ardından, değerler farklı olacaktır. Veya çoğaltmayı gerçekleştirmeyi hatırlayabilirler, ancak bir işlem içinde değil, bu nedenle bazı nadir hata koşulları altında ihmal edilebilir. Fakat bu örnekleri yazarak zamanımı boşa harcamama gerek yoktu,Yanlış gidebilirse, olacak.


12

Bunu iyi / kötü değil, haksızlık açısından düşünmek daha verimli olacaktır. Sorgu kullanılabilirliğindeki avantajlar için normalleştirme avantajları (özellikle de tutarlılık) ile işlem yapıyorlar.

Bir uçta, eğer veriler ciddi tutarsızlaşırsa veritabanı işe yaramaz hale gelirdi. Diğer uçta, güvenebilecekleri sonuçları elde etmek için her gün sorgulaması gereken insanlar için çok zorsa, veritabanı kullanışsız olacaktır.

Riskleri ve maliyetleri azaltmak için ne yapabilirsiniz?

  • Bir tutarlılık kontrol aracı oluşturun ve düzenli olarak çalıştırın.
  • Çoğaltılmış verileri tutarlı bir şekilde güncelleyen yazılımlar yoluyla yazma erişimini yönlendirin.
  • İş insanları DB içindekiler yerine bilgi açısından düşünebilmeleri için görünümler ekleyin veya otomatik olarak birleştirilen sorgu araçları oluşturun.

6

İş analistleri için veri normalizasyonu için en güçlü argümanın veri bütünlüğünü teşvik ettiği kanısındayım. Anahtar verileriniz yalnızca bir yerde saklanırsa (bir tabloda, bir tabloda bir sütun), verilerin yanlış güncellemelerden zarar görmesi çok daha az olasıdır. Muhtemelen veri bütünlüğünün önemini önemseyeceklerini düşünüyorum, bu yüzden bu onları veritabanı ile etkileşime girme yollarını güncellemeye ikna etmenin iyi bir yolu olabilir.

Potansiyel veri bozulmalarına göre biraz daha zor bir sorgulama yöntemi tercih edilecektir.


6
Adamları, tüm verilerin doğru bir şekilde güncellendiğinden emin olmak için yeterince iyi olduklarını savunacaklar (katılırsa rahatsız olduklarında itiraz ettiğim bir öncül). Belki de daha iyi bir argüman eğer normalleşmeden kaçınırsanız, RDBMS’nin sağladığı ACID’in yararlarının çoğunu kaybedersiniz.
Robert Harvey,

4
Muhtemelen, ama hepsi bir risk meselesi. Sorgulamayı kolaylaştırdığı için veritabanını bozma riskini kabul etmeye istekli mi?
Oleksi,

1
Şeytanın avukatını burada oynamak, bariz bir karşı iddiaya göre, eğer birisi zaten bir güncelleme ve bozuk veriyi bozacaksa, bu normalleşmeyle veya normalleşmeyle ilgili bir sorun - ve en azından veritabanında biraz fazlalık olması daha muhtemel birinin yolsuzluğun farkına varacağını ve daha sonra düzeltebileceğini bile. (Tabii ki, ad hoc denormalization pek en güvenilir hata algılama tekniği, fakat prensip fazlalık yoluyla hata kontrolü sesidir: nasıl olduğunu çift girişli defter tutma çalışır.)
Ilmari Karonen

Veya, başka bir deyişle, veri bütünlüğü sadece ilişkisel bütünlükten daha fazlasıdır. Tamamen normalize edilmiş bir veritabanıyla, birisi bir güncelleme yayınlasa bile mükemmel ilişkisel bütünlüğü koruyabilirsiniz, ancak bu yanlış güncellenen verileri daha az çöp yapmaz.
Ilmari Karonen

0

Yukarıda diğerlerinin önerdiklerine eklemek için. Bu bir veri yönetişimi sorunudur. İlgili paydaşlarla çalışmanız gerekir: veri ilkeleri, politikaları ve adlandırma kuralları geliştirmek için veri mimarları ve veri görevlileri.

Sabırlı olun ve düzenli çalışın. Değişim gece boyunca olmayacak.


0

Bırakmak, vazgeçmek.

Dürüst olmak gerekirse, ayları normalleşme, tutarlılık ve saf tembellikten kaynaklanan çılgın böceklerle savaşarak tartışabilir ve sonra bırakabilirsiniz.

Ya da sadece zamandan tasarruf edersiniz, ve hayal kırıklığı ve şimdi istifa.

İyi programcılar çok tembel insanlardır. Müşteri ve yönetim ihtiyaçlarını anlarlar. Fakat en önemlisi, sorunları iyi çözmenin, iyi tasarlanmış ve iyi uygulanmış çözümler kullanmanın kişisel olarak BÜYÜK miktarlarda iş, çaba ve en önemlisi acı ve stresten kurtardığını anlıyorlar .

Böylece iyi mühendisliği anlayan ve değer veren bir yerde çalışmak daha iyi olacaktır.

İyi şanslar.


Ardından: Belki ihtiyaç duydukları BI / OLAP araçlarıdır ... http://en.wikipedia.org/wiki/Online_analytical_processing

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.