Db Hakkında Sorum
-
Selam arkadaşlar
Dbde mikrox paraşüt gibi sistemlerde kullanılan mantık nedir?
Sormak istediğim şu bu platformlarda bir üyelik oluşturduğumuzda aynı özellikleri sadece bizim girdiğimiz verilere ulaşabiliyoruz, ikinci üyelik açıyoruz yine o ikinci üyeliği ait verileri girip hangi üyelik login olduysan ona göre ona ait verileri gösteriyor
1 - Şimdi burada her üyeliğe özel bir veri tabanını oluşturulup tablolar kopyalanıp ona göre bağlantı mı yapılıyor?
2 -Yoksa ortak veritabanı kullanıyor üye kimliğine göre tüm tablolarda o kimliği kaydedip filtreleme mi yapıyor?
Aynı şekilde bir sistem yapmaya çalışıyorum ancak hangi yöntem daha mantıklı olur? ikinci yöntemde ilerde performans sıkıntısı yaşar mıyız yoksa her üye özel yeni bir veritabanı oluşturup bağlantıyı ona göre özelleştirmek mi mantıklı?
Ya da bunun daha başka bir yolu var mı?
-
Cevabın genelde 2.
örnek veriyorum users tablonda kullanıcının id kolonu oluyor
product tablonda user_id kolonu oluyor diyorsunki user_id'si giriş yapan user'ın id sine eşit olanı getir
Örnek olsun diye verdim çeşit bol
Bazı durumlarda sistemi firma firma ayırmak için 1. durum yapılabiliyor örnek veriyorum x firmasi olsun x.site.com ve y firması için y.site.com diye sub domainler açılıp veya ayrı yerlerde tutulup 1. nin kullandığı durumlar olabiliyor sistemleri tamamen birbirinden ayırmak istendiği zaman ama maliyeti yüksek oluyor ihtiyacına göre ama 2. olan daha genel
-
1. bu bana biraz yönetmesi zor geliyor. tablo yapısı değiştiğinde her müşteri için bir db de değiştireceksin. raporlama tarzı işlerin çok zor olacak vs. bunu sql de yapmazdım.
2. şu ana kadar hep bunu kullandım. web frameworklerin genelde bu tarz şeyler için işi kolaylaştıracak özellikleri oluyor. hiç desktop geliştirmedim orda nasıl bilmiyorum. mesela laravelde "scope" olayı var.
sql değil mongodb kullanıyorsun dersek: 3-4 yıldır canlıda çalışan uygulamamda her kullanıcıya bir database açarak ilerliyorum. ama mongodb de şema yok ve database/tablo yaratmanın teknik bir maliyeti yok. mongoda tuttuğum veri üstünden de herhangi bir raporlama yapmadığım için bunu yapabildim. her kullanıcı kendi database in de çalıştığı için "x müşterinin bana maliyeti ne" tarzı şeyleri çok kolay çıkarıyorum
-
bahsettiğin modelin tam adı Multitenancy yapı diye geçer. bu şekilde aratabilirsin.
Multitenancy için birden fazla yöntem vardır.
-hem kod, hem db aynı olabilir.
-kod aynı, db müşteriye özel olabilir
-kod ve db müşteriye özel olabilir (aynı kod farklı server'a yüklenir intranet için vb.)
aşağıdaki resimde genel bir önizleme var bu konuyla ilgili.
Multitenancy keyworduyle daha detaylı mimarilere ulaşabilirsin.
bana sorarsan ben completemultitenant mimarisini kullanıyorum hem kod hem db aynı. benim işimi karşılaya model bu çünkü.
EDİT: https://www.tahribat.com/forum/aspnet-core-multi-tenant-konusu-hakkinda-250641
Şu konuda baya detaylı konuşmuştuk sonradan aklıma geldi.
manglerman tarafından 04/Haz/23 18:50 tarihinde düzenlenmiştir -
Hocam saf php den sonra hiçbi mantık yok ya lüzümsuz şeyler bu teenage mutant ninja turtles falan.
Burası özgür bir platform olduğu için fikir beyan ettim
-
Örneklemek gerekirse;
veritabani.dbo.Users
dbo/schema // müşteri bazı yönetebilirsin.
ama bu seferde indexlerin artacaktır her müşterinin tablosuna ayrı ayrı index atman gerekecek.
En mantıklı olan Users tablosunda bir adet CompanyId tutman ve burayı ve bütün tabloları müşteri bazlı yönetmen.
Örnek sorgu "SELECT * FROM Users WHERE CompanyId=1 İsDeleted=0 AND IsActive=1"
-
-
Ağırlıklı olarak kullanılan yöntemler 2 tane.
Kullanıcıları gruplarına özel yetki tanımlama
Kullanıcılara özel yetki tanımlama
2 şekilde de aktif session'daki kullanıcının grubu veya yetki seviyesi alınır.
Erişmek istediği sayfa açılmadan veya gösterilmeden önce yetkisi var mı diye kontrol edilir. Yetkisi var ise kullanıcının veya grubun erişimine izin verilir.
Tabi bu yalnızca sayfaların gösterilmesi için değil, arkaplanda POST, GET vb. işlemlerin de engellenmesi gerekir. Örn: AJAX ile bir kayıt ekleniyordur. Bu kaydın gönderildiği ekranı göstermesen de, isteğin alındığı URL'de de gerekli kontrolleri yapmalısın.