Dbo olmayan bir şemanın ne zaman yeni bir Veritabanı kullanılacağına ilişkin karar kriterleri


22

Çoğunlukla bir uygulama geliştiricisiyim ancak şu anki projem için tüm ön veritabanı çalışmalarını yapmak zorunda olduğumu biliyorum ( btw ... MS SQL Server 2008 ). İlk karar olarak, durumumu ayrı Veritabanları kullanarak mı yoksa ayrı Şema'ları kullanarak aynı veritabanında mı böleceğimi anlamaya çalışıyorum. SQL Server Şeması hakkında biraz okuma yaptım ve nesne alanlarını ( sevdiğim ) ayırmanın doğal bir yolu gibi görünüyor , ancak bu kalıba ilişkin gizli maliyetler olup olmadığından emin değilim.

Bu iki yaklaşım arasında seçim yaparken göz önünde bulundurmam gereken en pratik şeyler nelerdir? Ben kaçınırsanız dbo.mytablelehine myschema.mytablediğer zorlukları (oluşturacağınız veya sorunları benim mimarisi için)?

Yan not olarak ... Bir noktada bu, gerçek bir DBA’ya verilecek / destek verilecek ve bu yüzden hayatlarını zorlaştırmayacağımdan emin olmaya çalışıyorum.


dbo dışında bir şema kullanmanın yan etkisi, onu yazmayı unutmamanızdır. Bu, yeniden uygulama planının yürütülmesine yönelik bir adımdır.
Henrik Staun Poulsen

Yanıtlar:


15

Şemaları OO anlamında ad alanları veya nesne alanları olarak düşünmeyin diyerek başlayacağım. Şemalar, esas olarak, bazı katma değeri olan izin kaplarıdır (aşağıya bakınız)

Ayrıca, "ayrı şemalar" veya "ayrı veritabanları" 2 farklı kavramdır. İşlemsel ve referans olarak tutarlı olması gereken verilerin aynı veritabanında olması gerekir. Bkz Bir veritabanı veya Ten? Daha fazlası için blog yazısı.

Bu veritabanında, nesnelerinizi düzenlemek için şemalar kullanabilir veya kullanmayabilirsiniz.

Şahsen ben şemaların hayranıyım ve her zaman onları ancak izinler ve mantıksal gruplama gibi şeyler için kullanıyorum. Bunun için, genel görüşün kendi lehine olduğunu görebileceğiniz önceki sorulara atıfta bulunacağım:

Ayrı veritabanları için, Aaron'un cevabına bakınız , ancak hepsi "işlemsel ve referans olarak tutarlı" şartına bağlıdır.


9

@Gbn ile aynı fikirde. Ayrıştırma için şemaları ve ayırma için veritabanlarını kullanarak çözümler tasarladım ve veritabanlarını kullanmanın çok daha pratik olduğunu düşünüyorum. Birkaç sebep:

  1. Uygulamanızın içeriğe özgü bir veritabanına bağlanmasını ve ardından aynı sorguları çalıştırmasını sağlamak, sorgularınızın <schema>tüm nesne referanslarının önüne enjekte edilmesinden çok daha kolaydır . Bu, kendisini çok fazla dinamik SQL'e, varsayılan şemalara sahip birçok farklı uygulama girişine borç verir (kodunuz şema öneki kullanmaz, uygulama kullanıcısı varsayılan şemasına dayanır - büyük plan önbellek şişmesine ve zor hata ayıklamaya neden olabilir), ya da yönetilmesi gereken çok sayıda saklı yordam (şema başına birine ihtiyacınız varsa, sadece basit bir raporun resmini çizin, sonra kod değişir, şimdi her şema için bir kez aynı kodu birden çok kez değiştirmeniz gerekir).
  2. Veritabanına göre ayırmak, meşgul büyük veritabanlarını, nesneleri kapsayan büyük bir veritabanından çıkarmak zorunda kalmadan, daha hızlı veya farklı depolama / örneklere taşıma esnekliğini sağlar. Çoğu kimse bu kadar önceden düşünmez, ancak kesinlikle potansiyel bir ölçek sorunudur. Özellikle, “devralacak” bir şemaya sahipseniz ve sunucudaki kaynakların çoğunu gerektiren bir şeye sahipseniz, bunları ayırmak, şema ile ayrılmış olsalar bile, son derece zahmetli bir iş olabilir.
  3. Ayrı veritabanları, her bölüm için farklı bakım ve yedekleme zamanlamaları olmasını da sağlayabilir. "Devlete göre böl" ile ne demek istediğinizi bilmiyorum ama müşterileri izole etmek istediğinizi varsayarsak, farklı gereksinimlere ve veri kaybı, dizin bakımı vb. İçin farklı toleranslara sahip müşterileriniz olabilir.
  4. Kanunen veya şirket politikası gereği, verilerini herkesten ayrı tutmanız gereken müşterilerle bitebilirsiniz. Bu genellikle veritabanı düzeyinde kabul edilebilir, ancak şema düzeyi genellikle yetersiz olacaktır. Şimdi bu müşterilere sahip olmayabilirsiniz, ancak daha sonra yaparsanız bu gerçek bir problem haline gelebilir.

3
Şimdi altın soru "tüm veriler işlemsel ve referans olarak tutarlı mı" mı? Şimdi farz ediyorum ve cevabınız bunun için doğru
gbn

@gbn Bu gerçekten iyi bir soru ve yola çıkmadan önce biraz düşünmem gereken bir şey.
JoeGeeky

@AaronBertrand Bu ilginç ... Biraz kapasite planlaması yapmam ve ölçekleme sorunlarının nerede ortaya çıkabileceğini görmem gerekiyor gibi. Yatay ölçekleme uygunsa, ayrı veritabanları iyi bir seçim olabilir mi? Aksi takdirde, başka kalıpları da düşünmem gerekecek.
JoeGeeky

2
@JoeGeeky: "işlemsel ve referans olarak tutarlı" duruma tabi olarak, tek bir veritabanı da dosya gruplarıyla ölçeklenebilir. Her neyse, kullanım durumunuza göre 2 geçerli yanıtınız var. İkisi de yanlış değil.
gbn
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.