Mümkün olduğu kadar az tablo içeren bir veritabanı oluşturmak gerekli midir?


52

En az sayıda tablo içeren bir veritabanı yapısı oluşturmalı mıyız?

Her şeyin tek bir yerde kalacağı şekilde mi tasarlanmalı yoksa daha fazla masa olması uygun mu?

Yine de herhangi bir şeyi etkileyecek mi?

Bu soruyu soruyorum çünkü bir arkadaşım mediaWiki'de bazı veritabanı yapısını değiştirdi. Sonunda, 20 masa yerine sadece 8 kullanıyordu ve bunu yapmak 8 ayını aldı (üniversite ödeviydi).

DÜZENLE

Cevabı şu şekilde sonuçlandırıyorum: durumların istisnai hale gelinceye kadar tabloların boyutu önemli değil; bu durumda denormalizasyon yardımcı olabilir.

Cevaplar için herkese teşekkürler.


15
Minimum tablo sayısı kolaydır, sadece hepsini master_table (table_name, col_name, col_type, row_id, value) ile seri hale getirin.
Inca

ne? ben bunu almıyorum
Şahir

12
Veritabanındaki her alan, tablo adı, sütun adı, birincil anahtar ve değerin birleşimi ile tanımlandığından, her zaman depolayan tek bir tablo halinde denormalize ederek tablo sayısını her zaman azaltabilirsiniz. Çok kullanışlı değil, ama tamamen mümkün.
Inca

iyi, bilme uğruna soruyordum ve mevcut olandan daha az kullanışlı bir şey varsa, neden onu değiştirmeyi rahatsız ettin? Yani, herhangi bir konuda herhangi bir gelişme sağlayacak mı? örneğin performans?
Shaheer

1
@Hamza: Bu olabilir geliştirilmiş performans temin etmektedir. Bu gerçekten özel koşullara bağlı. Bile yok neredeyse bize somut bir cevap vermek için burada yeterli bilgi yok.
SinirliFormsDesigner'la

Yanıtlar:


155

IGNORE tablo sayısını. Tasarımın doğru olması konusunda daha fazla endişe edin . En büyük endişeniz tablo miktarı ise, muhtemelen veritabanı sistemleri tasarlamamalısınız.

Arkadaşınızın sadece 8 masaya ihtiyacı varsa ve sistem bununla iyi çalışırsa, 8 doğru sayıdır ve geri kalan 12 kişi ne yaptıysa gerekli olmayabilir.

Muhtemel istisnalar, masa numaralarında katı sınırları olan özel ortamlar olabilir, ancak kafamın üstünde böyle bir sistemin somut bir örneğini düşünemiyorum.


107
+1:If your major concern is quantity of tables, you should probably not be designing database systems.
Joel Etherton

9
Sonuç: Bir veritabanı tablosu [fazla] fazladan yer kaplamaz. Yer kaplayan veri. Normalleştirme = daha fazla tablo = daha az tekrar = daha az alan kullanılmış. Yalnızca tasarımdan ödün vermekle kalmayacağınız tablo sayısını en aza indirmeye çalışırken, aslında alan israf ediyorsunuz . Bu "masa golfü", masaların bazıları tam anlamıyla gereksiz olmadıkça, tümüyle kötüdür.
Aaron,

1
+1, şemasını karşılaştıramayacağımızdan, bu durumda doğru sayının 8 olduğunu söyleyecek kadar bilmediğimizi düşünmeme rağmen (orijinali şu anda uygulamanın sahip olduğundan daha yüksek işlem hacmi için daha iyi olabilir) örnek)
Adam Robinson,

2
@Hamza: Tamam, iyi PHP becerileri ve iyi veritabanı becerileri olabilir ve bu proje her ikisini de gerektirebilir - ancak birinin otomatik olarak diğerinin de ima ettiği varsayımında bulunmayın . Birçok geliştirici bir yeteneğe sahip olabilir, diğeri olmayabilir.
SinirliFormsDesigner'la

4
@ Tom Anderson - O zaman hala veritabanı sistemleri tasarlamamalısınız.
Joel Etherton

71

Bir veritabanı tam olarak ihtiyaç duyduğu kadar tabloya sahip olmalıdır. Daha az, daha fazla değil.


3
turkish.stackexchange.com/questions/495/less-vs-fewer Bunu bir tartışmaya dönüştürmemek, ancak işte İngilizce Dil SE'den kökenleri de dahil olmak üzere "daha az" ve "daha az" tartışması hakkında ilginç bir tartışma var. , sizi heyecanlandırıyor gibi gözüktüğü için;)
Corey

17

Veritabanı tabloları, sınıfların yapması gerektiği gibi, Tek Sorumluluk İlkesine bağlı kalmalıdır. Her tablo, başlamak için birden fazla ilgili veri grubuyla ilgilenmemelidir. Performans bir yana, bu durum tüm hayvanların yönetilmesini kolaylaştırıyor, çünkü masaların kendisi daha küçük olacak. Bu, aynı zamanda daha iyi performans verir, çünkü daha küçük tabloların aranması ve birleştirilmesi daha hızlıdır.

Masa sayısı konusunda, ders sayısı konusunda endişelendiğinizden daha fazla endişe etmeyin - endişelenmeyin. Ne kadar yer kapladığına değil, iyi, temiz ve okunaklı kod yapmaya odaklanın. Refactor daha iyi hale getirmek için çalışan bir ürününüz olduğunda agresif bir şekilde - ve veritabanını da kastediyorum! Başka sorgularda olması gereken veya gerekmeyen vb. Sütunları göreceksiniz. Hangi sorguların en uzun sürdüğünü ve neden aldığını görmek için bir profil göreceksiniz ve gerçekten bir sorunsa bu konuları ele alıyorsunuz.


4
Normalleştirilmiş bir veri modelinde evet, bu en iyi yaklaşımdır, ancak veritabanı raporlama veya öncelikle okuma erişimi olması gerekiyorsa, normalleştirilmiş "düzleştirilmiş" tablolar büyük veri setlerinde daha iyi performans gösterecektir. Bu durumda daha az sayıda masa, daha az birleşme ve daha iyi performans ile sonuçlanacaktır.
maple_shaft

2
@maple Kesinlikle katılıyorum. Hangi veri gruplarının gruplandırılması gerektiğini belirlemek için profil oluşturmalısınız, bu yüzden IMO normalleşmeye başlamanız gerekir. YMMV, uzmanlar muhtemelen başlarının üstünden başarabilirler :) Jeff, ilginç bulabileceğiniz denormalizing hakkında bir yazı da vardır.
Michael K,

1
İyi ve özlü yayın, bunu daha önce de okudum! Bazen iki dünyanın da en iyisini kaldırabilirsin. Raporlamanın% 100 gerçek zamanlı olması gerekmiyorsa, iki şemayı sürdürün; bunlardan biri ana şema, uygulama kullanımı için işlemsel normalize şema, diğeri ise düzenli aralıklarla akışa geçirilen ve veri erişimini rapor etmek için uyarlanmış bir denormalize şemadır.
maple_shaft

1
: Yıldız Şema'yı açıklama ile konuya ilişkin daha fazla bilgi publib.boulder.ibm.com/infocenter/rbhelp/v6r3/...
maple_shaft

1
@maple_shaft, raporlama veritabanının performans için sık sık dengelendiğine katılıyorum, ancak bir öğrenci veya küçük programcının üstlenmesine izin vereceğimi beklediğim bir şey değiller. Biliyorum ki, veri ambarlarımın kanıtlanmış uzmanlığı olmayan hiç kimse tarafından kullanılmasına kesinlikle izin vermeyeceğim.
HLGEM

7

Bir iş başvurusu için bir üretim veritabanı yüzlerce hatta binlerce tablo içerebilir. İş gereksinimleri için ihtiyaç duyduğunuz tablo sayısına ihtiyacınız var. Yalnızca daha az sayıda tabloya sahip olmak adına tablo sayısını azaltmaya çalışmak genellikle sorgulanması daha zor, veri bütünlüğü sorunları olan ve normalize edilmiş bir veritabanından çok daha zor olan bir veritabanı ile sonuçlanacaktır.

Denormalizasyonun gerekli olduğu zamanlar vardır. Bu sadece ne yaptığını ve nedenini tam olarak bilen biri tarafından yapılmalıdır. Denomalize etmek çok kolaydır, bu nedenle sadece yıllarca veritabanı deneyimine sahip bir veritabanı uzmanı veya üst düzey uygulama geliştiricisi tarafından yapılmalıdır. Deneyimsiz bir kişi, en azından, tasarladığı herhangi bir veri tabanında deneyimsiz bir kişiyi işe almayı düşünmeyeceğim bir alan olan veri ambarını yapmadığınız sürece, üçüncü normal forma ulaşmaya çalışmalıdır.

İnsanlar birleştirme pahalı olduğu için masaları düşürdüğünü söylediğinde, genellikle cahildirler ya da kritik indeksleri eksik olan ya da büyük sütunlarda doğal anahtarlar kullanan kötü tasarlanmış veritabanları vardır. İlişkisel veritabanları birleştirme kullanmak üzere tasarlanmıştır ve FK'lar uygun bir şekilde dizine eklenmişse ve birleştirmek için küçük alanlar kullanıyorsa (tamsayılar en verimlidir) birleşme işlemleri oldukça verimli olabilir. Terrabyte büyüklüğünde veritabanlarına sahip büyük işletmelerin bir şekilde mükemmel performans elde etmeyi ve birleşimleri kullanabildiklerini unutmayın.

Hiçbir ciddi veritabanı tasarımcısı, daha az sayıda tablo istedikleri için tablo sayısını azaltmaya çalışmaz. Verilerin artık gerekmediğinden veya başka bir şekilde çözemediğiniz bir performans sorununa sahip olduğunuz için tablo sayısını azaltırsınız (ve bir tabloyu denormalize etme verileriniz için kapsamlı bir risk almadan önce denemeniz gereken birçok yol vardır ) .


Google, BigTable’ı tasarladı ve paralelleştirilemediğinden kasten dışladı.
Yalan Ryan

2
@Lie Ryan, BigTable, veri bütünlüğü çok büyük bir endişe olmadığı için çoğu iş uygulaması için uygun olmayan özel bir durumdur. Google’ın arama yapmak için çok fazla karmaşık işletme kurallarına ihtiyacı yoktur. Bahse girerim kurumsal finansal uygulamaları BigTable'ı kullanmaz. Bununla birlikte, büyük veritabanlarına sahip iş uygulamalarının çoğu, tasarımcı bilgiliyse katılabilir ve iyi performans gösterebilir. Kurumsal veritabanlarının performansı (bölümleme dahil) iyileştirmenin birçok yolu vardır ve bu nedenle ilişkisel bir veritabanının veri bütünlüğü özelliklerini kaybetmesine gerek yoktur.
HLGEM

Sizin için +1, @HLGEM, hem cevap hem de yorum için; Belge veri tabanı veritabanı aracına atlayan birçok geliştiriciyi görmek çok utanç verici çünkü "birleşiyor = yavaş" diyorlar, sadece 20 yıl önce ilişkisel veritabanları tarafından çözülen ilişkisel problemleri çözmeye çalışıyorlar.
Adam Robinson,

5

Veritabanındaki her alan, tablo adı, sütun adı, birincil anahtar ve değerin birleşimi ile tanımlandığından, her zaman depolayan tek bir tablo halinde denormalize ederek tablo sayısını her zaman azaltabilirsiniz. Çok kullanışlı değil, ama tamamen mümkün.

Tablolar, verilerle ilgilenme konularına yardımcı olan soyut bir katmandır. Bu yüzden yaratıldılar. Bir şaka yaptım ama her veri kümesini bir ana tabloya indirebileceğinizi anlamak derhal neden yapmamanız gerektiğine işaret ediyor: çünkü tablolar size bir şey getiriyor. Kavramsal düzeyde, insanlar için seri hale getirilmiş verilerden daha kolay anlaşılır bir yapı getiriyorlar. Bunlar arasında, normalleştirme kavramını getiriyorlar: gereksiz verileri kaydetmekten kaçınmak ve çeşitli yerlerde bir şeyleri değiştirmek yerine, değişiklikler için tek bir puan vermek. Teknik düzeyde, veritabanları verilerle yapmak istediğiniz şeylerin çoğunu getirir, sayısız araç ve bunları uygular ve muhtemelen kendinizden daha fazlasını test eder. Veri türlerini, varsayılan değerleri, kullanıcı haklarını, endeksleri, yabancı anahtar kısıtlamalarını vb. Düşünün. Çok sayıda optimize edilmiş, hata ayıklanmış, kullanılmış, test edilmiştir. (Mükemmelliğe değil ama yine de.)

Bir veritabanı bir araç olduğundan, esas olan aracın nasıl kullanılacağına karar vermektir. Tablo sayısı önemli değil. Küçültme her zaman mümkündür ancak faydaları ortaya koyma pahasına. (Normalleştirme hakkında daha fazla şey okursanız, denormalize etmek için birkaç vakayla karşılaşırsınız - ancak o zaman bile sadece tablo sayısını göz ardı edip azaltmak yerine doğru kararlarla ilgilidir.)


teşekkürler, açıkça çok şimdi !, ve ben var btw normalleşme hakkında okumak, ben bile başka ve biraz farklı bir yaklaşım teşvik cakePHP veritabanları yapmak.
Shaheer

3

Sen kullanmalısınız sağ tablo sayısını. Teorik olarak, bütün veritabanını denormalize ederek tek bir tablo tablosu ile yapabilirdiniz, ancak veritabanı kullanılamaz. Arkadaşınız ellerinde çok fazla zaman geçirmiş gibi geliyor.


2

Minimum masa sayısına sahip olmak beni çok tuhaf bir amaç olarak vuruyor.

Bir şemayı kesinlikle 20 tablodan 8'e düşürmek iyi bir şey olabilir (iyi yapılırsa birleşmeleri azaltabilir ve performansı artırabilir, kullanılmayan sütunları kaldırabilir vb.), Ancak ilerlemenin anlaşılmasını ve geliştirilmesini eşit olarak zorlaştırabilir.

Başka bir şekilde düşünmek normalleşmenin iyi bir şey olduğunu düşünüyor musunuz? Normalleştirme genellikle daha fazla sayıda tabloya yol açar ancak aynı zamanda daha fazla bakım yapılabilir çözümlere, veri çoğaltılmasını ve veri yönetimini kolaylaştırır.

Elbette daha yavaş performansa da yol açabilir (denormalize veri tabanının iyi tasarlanmış olduğu varsayılarak).

Sonuçta bu alanlarda gereksinimlerinizin ne olduğunu düşünmeniz gerekir, ancak varsayılan bir başlangıç ​​konumu olarak makul bir normalizasyon düzeyi için gidin ve bunun daha az tablonun bir çözüm olabileceği belirli sorunlara neden olup olmadığına bakın derim.


0

Sayı önemli değil. Tasarım Oradaki bazı sistemlere bak. Magento, PHPBB, vb. Sistemlerinde onlarca masa var ve gayet iyi çalışıyorlar.


0

Normalleştirme ve performans konusundaki endişelerin yanı sıra, bir uygulamanın kapsamını yönetmenin bir yolu olarak "başka bir tablo gerektirecek" ifadesini kullanabilirsiniz. Bu özellik yeni bir tablo ve her zaman, yükseltmelerde ve ilgili diğer tüm kodlamaları tasarlama, oluşturma, test etme, yönetme enerjisi ve çabasını gerektirecektir. Mevcut tablolara 5 alan eklemek (uygunsa) 5 sütun tablosundan çok daha kolaydır.


0

Tablo oluşturmayı en aza indirmeye çalışan bir veritabanı tasarlarsanız, kısa zamanda ani zorluk ve hatalarınızı kendi yollarınızda göreceksiniz.

Bir veritabanı tasarımı oluştururken tablo sayısı aklınızda ön planda olmamalıdır. Mantıklı ve ilişkisel olarak gitmeleri gereken şeyleri yerleştirin.


0

Tüm iş amaçları ve amaçları için bir arada durması gereken verileri birden fazla tabloya bölmeyi seçtiyseniz (örneğin, veritabanını normalleştirmek için), tablo sayısının önemli olduğunu ve performans üzerinde büyük bir etkisi olabileceğini düşünüyorum. Genelde bunu yaptığınızda, ihtiyacınız olan tüm verileri elde etmek ve bu şekilde yapılandırılmış yeterince büyük tablolar için performans hızlı bir şekilde azalır, JOIN Operations (veya SQL eşdeğeri) olmaya zorlanırsınız.

Ayrıntılara girmeyeceğim, ancak tablo sayısının performansı etkileyebileceği gerçeğinin, Cassandra, Mongo ve Google BigTable (sic!) Gibi noSQL veritabanlarının icat edilmesinin nedenlerinden biri olduğunu düşünüyorum. ve bu nedenle verilerin normalleştirilmemesini teşvik ediyorlar (ve dolayısıyla çok sayıda tablodan / koleksiyondan, vb. kaçınıyorlar).

Aynı şey, Apache'nin Solr gibi, dokümanlarınızı ortak alanlara sahip bir "bir" tümünü kapsayan "şemaya sahip olmanızı teşvik eden, birden fazla" tabloya "veya" giriş türüne "ayırmayı gerçekten teşvik etmeyen veya kolaylaştıran arama sunucuları için söylenebilir. Dizinlemek istediğiniz tüm belge türlerine (ve dolayısıyla JOIN benzeri işlemler yapmaktan kaçının).

Bir şemada x tablo olmasının basit gerçeğinin onu her zaman x / 2 tablolarla bir şemadan daha yavaş hale getireceğini söylemiyorum, ancak bunun sonucu olarak yavaşlamalara neden olabileceği bazı bağlamlar var. Tüm bu tablolardaki verileri toplamak için gereken ilave işlemler. Buna devam edersek, "herhangi bir sayıdaki tablo ve verilerin aşırı normalleşmesinin bu kadar performans üzerinde hiçbir etkisi olmadığını" söylemenin uygun olmadığını düşünüyorum.


0

Bob Amca, Daha Çok Basit olduğunu iddia ederdi.

Http://c2.com/cgi/wiki?FearOfAddingTables adresine bakın.

"İyi bir tasarım genellikle tablolar ekleyerek basitleştirilir"

Neredeyse bütün varlıkların çoktan çoğa olduğuna inanıyorum, bu da daha fazla masa gerektiriyor.

Kıta kodu ile bir ülke tablosu yapın. Oh, yapamazsınız çünkü aslında 8 kıtalararası ülke var. Para birimleri ile aynı. Panama iki kullanır.


-2

O zaman cevap YES.

Ancak "minimum" tablo sayısının gerçek anlamı ne bağlıdır.

Örneğin (bir anti-örnek).

Bir sonraki nesneye sahipsem

  1. kullanıcılar
  2. müşteriler

ve her ikisi de aynı durumları (alanları) paylaşır ve bir güvenlik kısıtlaması yoktur, o zaman tek bir masa yapmak için daha uygundur.

  1. table_persons

iki farklı masa

  1. table_users
  2. table_customers

eksileri table_persons'da olduğundan daha yeni bir alan eklememiz gerekecek (type_of_person).

Başka bir hata (gerçekten yapmak zorunda değilse hata) bir masayı "bölmek", şöyle okumak: tek bir masayı ikiye ayırmak.

  1. table_persons

iki tabloda

  1. table_info_persons
  2. table_extra_info_persons

çünkü iki tabloyu birleştirmek için bazı sorguları zorluyorsunuz ve bu kötü.


hey, cevabınız çok açıklayıcı ve
yardımsever

2
Bu bana ilk kurumsal uygulamamı ve arkasındaki veritabanını ve DBA’nın kabusun ne kadarını böyle şeyler üzerinde masa nazi yaptığını hatırlattı. Kesinlikle müşterileri ve kullanıcıları kesinlikle birbirlerinden tamamen ayrı olmayan işletmelere sokmam.

-1: Kullanıcılar ve müşterilerin farklı alanları var; Şu anda olmasa, gelecekte bir noktada olacaklar. Bu yüzden ayrı masaları hak ediyorlar.
Sjoerd

1
@Sjoerd, @Chris: Bu genellikle böyle olsa da, mutlaka doğru değil. Bunun gibi şeyler uygulamaya bağlıdır. Olduğu söyleniyor, ben duygu ile katılıyorum. Çoğu zaman veritabanı geliştiricileri "ortak alan adları" görecek, aynı veri anlamına gelir. Bu, özellikle veritabanına ilk önce ORM'den bakıldığında (diğer bir deyişle geriye doğru) yapılması kolaylaşır. OO kavramlar iken olabilir veritabanında modellenebilir, veritabanları satırlar ve ilişkiler değil nesnelerdir .
Adam Robinson,

1
+1 "veritabanları satırlar ve ilişkilerdir, nesneler değil" i favorilerime ekleyeceğim!
Shaheer
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.