Bir web uygulamasının her istemcisi için yeni bir tablo oluşturmak iyi bir fikir olabilir mi?


10

Bu yarı varsayımsal ve büyük veritabanı tabloları ile ilgili hiçbir deneyimim yok, bu bir nedenle korkunç olup olmadığı hakkında hiçbir fikrim yok. Durumla ilgili:

Web tabanlı bir uygulama düşünün - diyelim ki muhasebe yazılımı - 20.000 istemcisi vardır ve her müşterinin bir tabloda 1000'den fazla girişi vardır. Bu, karmaşık sorguları kesinlikle yavaşlatabileceğini bildiğim 20 milyon satır.

Böyle bir durumda, her istemci için veritabanında yeni bir tablo oluşturmak daha anlamlı olur mu? Veritabanları 20k (veya daha fazla!) Tabloya nasıl tepki veriyor?

Yanıtlar:


15

Genel olarak konuşursak, hayır, müşteri başına bir tabloya sahip olmanın hiçbir anlamı yoktur (aslında burada veritabanı demek istediğinizi düşünüyorum). Bir veritabanı tablosu için 20 milyon satır nispeten küçüktür. Buna göre sorgu hızı, veritabanı düzgün bir şekilde ayarlandığı (dizine eklendiği) ve sorgular doğru bir şekilde oluşturulduğu sürece sorun olmamalıdır. Bunları ayırmaktan alacağınız herhangi bir fayda ne olursa olsun, 20.000 ayrı veritabanını yönetmenin ek karmaşıklığı ile dengelenir. Örneğin, tablo yapısını değiştirmek istediğinizde ne olur? Şimdi bunu 20.000 kez yapmak zorundasın!

Daha da kötüsü, sonunda veritabanı boyutunun bir sorun haline geldiğini fark ederseniz, bunları daha sonra ayrı veritabanlarına ayırabilirsiniz.


Hayır, kelimenin tam anlamıyla veritabanındaki tabloları kastediyordum. İstemci başına bir veritabanı oluşturmak için bir neden düşünemiyorum. Ve 20 milyon sıra küçükse, ne kadar büyük? Ve bu noktada ne yaparsın?
Will

1
@ChrisF, tam olarak - teknoloji veya iş modelinin müşteri başına ayrı DB'ler gerektirdiği birçok durum var. Ama aynı DB içinde ayrı tablolar için bir neden düşünemiyorum .
GrandmasterB

1
@GrandmasterB - Sanırım @Will yanlış soruyu soruyor.
ChrisF

1
@Will: Mümkünse, bir Oracle Kullanıcı Grubu toplantısına veya başka bir üst uç veritabanı eşdeğerine gidin. "Küçük" ve "büyük" fikirlerinizin çok fazla yeniden düzenlemeye ihtiyacı olduğunu göreceksiniz. Bana oldu. İpucu: bir diske sığarsa, DBA standartlarına göre büyük değildir.
David Thornley

1
@Gorton, InnoDB genellikle güvenilirlik ve uyum için daha iyi, hız için MyISAM olarak kabul edilir. Dolayısıyla, farklı depolama motorlarını, uygulamanızın beklenen veritabanı kullanımına göre değerlendirmeniz gerekir.
GrandmasterB

5

Kötü bir fikir gibi geliyor.

Veritabanını böyle egzotik yapılarla alt etmeye çalışmayın. Veritabanı motorları, büyük veri kümelerini işlemek için birçok optimizasyonla tasarlanmıştır. Örneğin, tanımladığınız şey, dizinleri manuel olarak uygulama girişimine çok yakın geliyor. Sadece DB Engine tarafından sağlanan dizinleri kullanın, bunlar kendi başınıza yapabileceğinizden çok daha iyi uygulanır ve çok fazla bakım gerektirmez.

Ayrıca, genel bir kural olarak. Bir veritabanını uygulamanın normal kullanımı sırasında manipülasyon veya veritabanı yapılarının (tablolar, alanlar) oluşturulmasını gerektiren bir şekilde tasarlamamayı öneririm. Performansı optimize etmeyi bir ayı haline getirir ve genellikle kullanıcılara potansiyel olarak güvenlik açıkları oluşturan rutin görevler yapmak için çok fazla izin vermeye zorlar.


İzin verilirse, iki paragrafınızın her biri için bir kez vekalet ediyorum.
David Thornley

3

İşte bu soruyu sorduklarında insanları her zaman okumaya çağırıyorum:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html


Ben bir DB tablo = x başına gerçek bir dosya oluşturur hiçbir fikrim yoktu
olacak

1
Bu, kullanılan gerçek RDBMS'ye bağlı olabilir. MySQL bunu yapar (MyISAM kullanıyorsanız tablo başına en fazla üç dosya). Diğerleri olmayabilir.
Aralık'ta Mchl

SQL Server'ın kurumsal sürümü, bu şekilde tasarlarsanız otomatik olarak yapmaz.
JeffO

Oracle kesinlikle bunu yapmaz.
user281377

Oracle , SQL Server'ın yaptığı gibi yapabilir, ancak şemanızı neden tablo başına bir dosya olacak şekilde tasarlayacağınızı hayal edemiyorum. Bir veritabanını birden çok dosyaya bölmek anlamlıdır, ancak tablo başına bir dosya değildir.
Dean Harding

1

IMHO tek bir tablo sorun olmamalı, bu yüzden henüz var olmayan bir sorun yaratmayın. Performansa yardımcı olmak için yapabileceğiniz çok şey var. ES'ye yardımcı olması için tek bir tabloyu istemci tanıtıcısına veya bir tarih alanına göre birden çok dosyaya ayırabilirsiniz. Db'nizin sitenizde ihtiyaç duyacağınız her sorgu için 20.000 farklı sql deyimini takip etmesi, optimize etmesi ve önbelleğe alması gerekmez. Clientid ile indeksleyebilirsiniz. 20K müşterileri çok fazla donanım için ödeme yapabilir.

Bu tür bir tablo için NoSQL tipinde bir db kullanılabilir.

20K istemcilerle, veritabanı en zayıf bağlantınız olmayabilir, bu yüzden neden bu kadar karmaşıklığı sunalım?


`IO'ya yardımcı olması için tek bir tabloyu istemci tanıtıcısına veya bir tarih alanına göre birden çok dosyaya ayırabilirsiniz.` - bununla ne demek istediğinizden emin değilim. Herhangi bir açıklama var mı?
Will

İşletim sistemindeki birden çok dosya. Bir sunucu tek bir dosya yerine birçok dosyaya daha fazla okuma / yazma işlemi yapabilir.
JeffO

Sanırım demek istediğim: Daha önce hiç böyle bir şey duymadım, bu konuda daha fazla bilgiyi nerede bulabilirim? :-) Ama ben google vurmak ~
Will

msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx Dizinler, indeksledikleri tablolardan (veya belki sürücüler?) ayrı dosyalardaysa yedekleme performansı sorunlarıyla karşılaşabilirsiniz.
JeffO

0

Bu gerçekten kötü bir yaklaşım.

Tabloyu dikey olarak bölümlere ayırın, biri tek kullanıcı kimlikleri için diğeri çift olmak üzere 2 veritabanı sunucusu iyi çalışmalıdır (veriler kullanıcılar arasında ilişkili değildir).

Verileri user_id öğesine göre sıralayın ve bu mümkün değilse çok miktarda RAM veya SSD disk alın.

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.