Çoklu kiracılık - tek veritabanı vs çoklu veritabanı


20

Sistemleri bazı işlevleri paylaşan, ancak oldukça fazla çeşitliliğe sahip bir dizi müşterimiz var. Müşteri sayısı artıyor - her zaman sağlıklı bir şey! - ve işletmeleri arasındaki çeşitlilik de artıyor.

Şu anda, her kiracının alt klasörleri olan ve kiracının standart olmayan sayfaları olan tek bir ASP.Net (Web Formları) Web Sitesi (web projesinin aksine) vardır. Veritabanı erişimi ve iş mantığı ile ilgilenen ayrı bir model projesi var.

Hangi - ve en önemlisi, neden - tercih edilen (a) sadece bir istemci ile ilişkili özellikleri ile, istemci başına 1 veritabanı olması; veya (b) herhangi bir istemci tarafından yalnızca bir tablo alt kümesinin kullanıldığı tüm istemciler tarafından paylaşılan tek bir veritabanı.

İşletmedeki ana endişeler sona erdi:

  • çoklu varlıkların bakımı - yedeklemeler, sürüm kontrolü ve benzerleri
  • mümkün olduğunca yeniden kullanımı teşvik etmek

Bu endişelerin ele alınmasını nasıl sağlayacaksınız, hangi çözüm tercih edilebilir ve neden? (Ben de benzer sorulara cevap derliyorum)


Bunun Azure gibi bir PaaS bulut ortamına geçme şansı var mı? Öyleyse, çevre için de en iyi uygulamaları düşünmek isteyeceksiniz. Son baktığımda MS, Azure'da çok kullanıcılı yazılımlar için birden çok veritabanı önerdi.
Harper Shelby

Sorduğunuz için teşekkürler. Ben de benzer şeyler merak ettim, ama soru biçimini sizin kadar etkili bir şekilde ortaya koyamadım.
MathAttack

Ayende'nin çok kiracılı blog dizisini okumalısınız. Çoklu ve tek veri tabanları hakkında çok iyi noktalar ortaya koyuyor.
Sebazzz

Yanıtlar:


12

10

SQL Server kullanıyorsanız, bir veritabanı kullanın ancak şemalar kullanın. Tüm istemciler için genel olan şeyler için dbo kullanın ve her istemci için bir şema oluşturun ve bu istemciden kullanıcılar için varsayılan şemayı yapın. Artık dbo şemasında genel bir nesneye (diyelim getBudget proc) ve aynı adı taşıyan şemalarında istemci için özelleştirilmiş bir nesneye sahip olabilirsiniz.


+1 Bu aynı zamanda MSDTC'yi yapılandırmaktan ve ilişkili ek yükü (iki fazlı işlem) almanıza gerek kalmamasını sağlar
brian

Ve umarım CustomField30 aracılığıyla CustomField1 gibi sütunları olan ve / veya vb Bütçe, BudgetEx, BudgetCustom, BudgetCustomerName, BudgetAnotherCustomerName gibi tablolar olmasına tuzak kaçının
jfrankcarr

Orta vadeli hedef Entity Framework'ü tanıtmak iken, 190 tablo, tablo başına 5 kod tarafından oluşturulan yordam ve bazı özel olanlar olmak üzere çok sayıda saklı yordam kullanan mevcut bir veri erişim katmanı vardır. her şema için prosedürler?
RichardW1001

@ RichardW1001: bağlıdır. sp'yi genel SQL yapmak için dinamik SQL yapabilirsiniz, ancak elbette bunların en azından biraz benzer bir yapıya sahip olmasına bağlıdır. Dinamik sql için olası bir alternatif olacağını eşanlamlılar ben onları anlamak, onlar, farklı değerlerle eşzamanlı kullanım için çok uygun değildir genişliğinde ve bir işlem içinde bulunan bir sistemdir maalesef.
jmoreno

Birden fazla şema kullanırsak, önce EF Kodunu kullanmak sistem yayınlandıktan sonra tüm şemaları en son sürüme geçirmek mümkün olacak mı?
Yashvit

4

İstemciler veritabanları ve işlevsellik birbirinden ayrıldığı için, bir noktada farklı sistemler haline geleceği anlamına gelir, bu nedenle her bir müşteri için özelleştirmeleri koruma maliyetleri tek bir avantajdan daha ağır basacağı için bu durumda ayrı sistemler öneririm. veritabanı sistemi.

Tek veritabanı sistemleri, farklı müşteriler arasındaki değişikliklerin yalnızca yapılandırmalar olduğu, ancak her istemci için ek özellikler olmadığı durumlarda en iyisidir.


Ortak işlevselliği en az acıyla nasıl yöneteceğiniz konusunda öneriniz ne olurdu?
RichardW1001

1
Sürüm kontrol sisteminizde, temel uygulama için bir kafa bulundurun ve her müşteri için, bakımları gereken yeni özellikler için alt kollarla bir ana şube oluşturun. Gövde vb. Güncelleme seçenekleri ile şubelerde müşteriye özgü özellikler geliştirin. Daha sonra ihtiyacınız olduğunda müşteriye özel ortamları kolaylıkla
toplayabilirsiniz

3

Bazı endişeleriniz eksik. Sorunlar büyüme ile gelecek. Bir gün bir DB sunucusundan daha büyük büyüyeceğinizi varsayabilirseniz - karmaşık bir veritabanı kesinlikle baş ağrısına neden olur. Önceden mimariye yatırım yapmadığınız sürece. Ama aynı zamanda pahalı bir adımdır)

Bu nedenle, unutmayın ki, birkaç farklı veritabanını ölçeklendirmek, büyük veritabanlarından hem çok daha ucuz hem de birçok kez daha kolaydır.


Ölçeklendirmenin kolaylığını doğrulayan herhangi bir veriniz var mı? Eğer öyleyse, çok zorlayıcı bir durum olurdu. Kaybolan diğer kaygıları açıklayabilir misiniz? Her iki tarafta da olabildiğince eksiksiz bir argüman oluşturmaya çalışıyorum.
RichardW1001

1

Yanıtlarda ele alınmadığını gördüğüm bir alan, çok kiracılı bir DB uygulamasını doğru şekilde güvenli hale getirmeyle ilgili sorunlardır. Güvenlikle ilgili sorunları önlemek için çok kiracılı uygulamaların çok dikkatli bir şekilde tasarlanması gerekir. Çoğu Veritabanları ve uygulamalar bir miktar yalıtım sağlar, ancak tam bir yalıtım sağlamaz - genellikle DB şemalarında doğrudan veya dolaylı olarak veri çıkarmanın yolları vardır. Ve en azından diğer kiracılara kolay Servis Reddi saldırılarına ve genellikle çok daha fazlasına yol açabilen birkaç paylaşılan kaynak (günlükler ve diğer dosyalar, DBA tabloları, imleçler ...).

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.