Bire bir ilişki normalleştirilmiş mi?


12

Bir kayıt için geniş bir istatistiksel veri setimiz olduğunu düşünün; örneğin 20-30 INTsütun. Hepsi bir kayda ait olduğundan VEYA bire bir ilişkiyle bağlantılı başka bir tablo oluşturarak tüm seti bir tabloda tutmak daha iyidir.

Birincisinin avantajı JOIN, ilgili kayıt için tüm istatistiksel verilere engel olmak ve bunlara hızlı bir şekilde erişmektir.

İkincisinin avantajı sütunu düzenli tutmaktır. İlk sütun okuma yoğun, ikincisi yazma yoğun. Tabii ki, InnoDB'yi satır düzeyinde engelleme ile kullandığım için performans üzerinde önemli bir etkisi olmadığını düşünüyorum.

Genel olarak, tek bir kayıt için farklı veri kümelerini ayırmanın faydalı olup olmadığını bilmek istiyorum.


2
'Normalleştirilmiş' ilk normal form (1NF) anlamına gelir ve ilişkisel modelin temel gereksinimidir. 'Tamamen normalleştirilmiş' 5NF veya üstü anlamına gelir. Önerilen 'bire bir ilişki' tablonuzun şu anki olandan daha yüksek bir normal formda (muhtemelen 6NF'de bile) olma şansı daha yüksektir, çünkü ayrıştırılmıştır! Mevcut tablonuz hangi normal formları tatmin ediyor?
gün

Diğerleri gibi, normalleştirmeyi adım adım takip etmiyorum, çünkü bazen normalleştirme de yardımcı oluyor. Genel olarak, tüm veritabanının 3NF - 5NF arasında normalleştirme düzeyi olmalıdır (her zaman 4NF ile sorunum var!)
Googlebot

Yanıtlar:


19

Normalleştirme kurallarına uyuyorsa, 1: 1 ilişkiler normalleştirilebilir (tanım gereği!) - Başka bir deyişle, 1: 1 ilişkiler hakkında normal formlara uymalarını imkansız kılan hiçbir şey yoktur.

1: 1 ilişkilerinin pratikliği hakkındaki sorunuzu yanıtlamak için, bunun farklı tahminlere (sütunlara) sahip alt türleriniz olduğu gibi, son derece yararlı bir yapı olduğu zamanlar vardır.

1: 1 ilişkilerini kullanmanızın nedenleri bakış açınıza bağlıdır. DBA'lar her şeyi performans kararı olarak görme eğilimindedir. Veri modelleyicileri ve programcıları bu kararları tasarım veya model odaklı olarak görme eğilimindedir. Aslında, bu bakış açıları arasında çok fazla çakışma var. Bu, bakış açılarınızın ve önceliklerinizin ne olduğuna bağlıdır. İşte 1: 1 ilişkiler için bazı motivasyon örnekleri:

  • Çok geniş bazı sütun alt kümeniz var ve performans nedenleriyle bunları depolama alanınızda fiziksel olarak ayırmak istiyorsunuz.

  • Sık okunmayan veya güncellenmeyen bazı sütun alt kümeleriniz var ve bunları performans nedenleriyle sık kullanılan sütunlardan ayrı tutmak istiyorsunuz.

  • Genel olarak isteğe bağlı bazı sütunlarınız var, ancak kaydın belirli bir türde olduğunu bildiğinizde bunlar zorunludur.

  • Mantıksal olarak bir alt tür için ait olan bazı sütunlarınız var ve bunları kodunuzun nesne modeline uyacak şekilde modellemek istiyorsunuz.

  • Süper varlık türünün yalnızca bazı alt türlerine uygulanabilecek bazı sütunlarınız vardır ve şemanızın bu alt türler için bu verilerin yokluğunu zorunlu kılmasını istersiniz.

  • Bir varlığa ait bazı sütunlarınız var, ancak bu kısıtlayıcı sütunları daha kısıtlayıcı erişim kuralları (örn. Çalışan tablosunda maaş) kullanarak korumanız gerekiyor.

Gördüğünüz gibi, bazen sürücü performans, bazen model saflığı veya sadece bildirim şeması kurallarından tam olarak yararlanma arzusu.


You have some subset of columns that are very wide and you want to segregate them physically in your storage for performance reasons.Bunları ayırmak performansı nasıl artırır (ana tablo her görüntülendiğinde sütunlara her zaman erişildiği varsayılarak)?
Gili

@Gili - Varsayımınız doğru olsaydı bu durum geçerli olmazdı. Büyük ve nadiren ihtiyaç duyulan sütunları ayırmak, bir sayfaya daha fazla satır sığmasını ve böylece yaygın olarak kullanılan sütunların daha hızlı alınmasını sağlar. Ayrık sütunların yaygın olarak kullanılan sütunlarla birlikte okunması, birleştirme gerektiğinden daha yavaş olacaktır .
Joel Brown

Tasarım nedenleriyle (endişelerin ayrılması, artan kod yeniden kullanımı) yaygın olarak kullanılan sütunlar boyunca ayırmak istiyorum. Bu tür birleşimlerin maliyeti hakkında bir tahmin yapan var mı? Onlar ihmal edilebilir mi yoksa uzun vadede endişelenmem gereken bir şey mi?
Gili

@Gili - re: katılımların maliyeti: "Bu duruma bağlı" dışında bu soruya doğru bir cevap yoktur. Birleştirme maliyeti birçok faktörden etkilenir. İhmal edilebilir olup olmadıklarını cevaplamak daha zordur, çünkü bu sonuçta özneldir. Sorunuzu cevaplamanın en iyi yolu, bazı test verilerini almak ve hacim testi yapmaktır. Her iki şekilde de deneyin ve gerçek dünya veri hacimlerini (uygulamanız için ne anlama geliyorsa) kullanarak farkı söyleyip söyleyemeyeceğinizi görün.
Joel Brown

Yaptım ve şaşırtıcı sonuçlar aldım: dba.stackexchange.com/q/74693/4719 Bunun normalizasyonun tipik bir örneği olmadığını itiraf ediyorum, ancak JOIN'lerin (hala) çok pahalı olduğunu vurgulamıyor.
Gili

4

Büyük bir tabloyu ikiye bölmek için bire bir eşleme kullanmanızın başlıca nedenleri performans nedenlerinden kaynaklanmaktadır:

a) Tablo, sık erişilen bir tabloda ikili / clob / blob verilerine sahiptir, bu nedenle büyük sütunlar farklı şekilde işlendiği için performansı düşürür.

b) Tablonun farklı sorgular tarafından erişilen birçok sütunu vardır, bu nedenle performans düşer, dolayısıyla erişim performansını artırmak için ilgili sütunları ayrı bir tabloya taşırsınız

Bununla birlikte, birçok tamsayı sütuna sahip olmak, tabloyu ayrı tablolara bölmek ve bunları sorgulamak zorunda kalmanın ek çabalarını haklı çıkarmaz.


konunun açıklığa kavuşturulması için çok iyi bir nokta!
Googlebot
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.