Bilgi Bankası
GenelGüvenlik ve yetki 16 dk 14.06.2026

Multi-tenant veri modelleme: ayrı database, ayrı schema, tenant_id kolonu

Multi-tenant mimaride tek doğru yoktur. Ayrı database güçlü izolasyon verir ama operasyon yükü artar. Tenant_id kolonu ekonomiktir ama disiplin ister. Ayrı schema ortada durur; ama o da bedelsiz değildir.

Bu yazı sana şu durumda yardımcı olur
  • SaaS ürününde tenant verisi nasıl ayrılacak bilinmiyor
  • bazı müşteriler özel izolasyon istiyor
  • tek tabloda tenant_id unutma riski var
  • yedek ve müşteri çıkışı planı net değil
  • maliyet ile güvenlik beklentisi çatışıyor
Yazıyı bitirince

Ayrı database, ayrı schema ve ortak tablo/tenant_id yaklaşımlarını güvenlik, maliyet, operasyon ve büyüme açısından karşılaştırabilecek; hangi müşteri tipi için hangi modelin uygun olduğunu daha net düşüneceksiniz.

TürkDB açısından ürünleşme notu

Bu bölüm, TürkDB’nin ilgili problemi hangi ürün ilkeleri ve kontrol noktalarıyla ele alacağını anlatır. Kapsam, gerçek iş yükü ve ihtiyaçla birlikte netleşir.

TürkDB tenant açılışı, erişim, yedek ve maliyet bağlamını görünür kılmayı hedefler. Tenant izolasyon modeli ise ürünün güvenlik beklentisi, müşteri segmenti ve operasyon kapasitesiyle birlikte seçilmelidir.

Ayrı database: güçlü izolasyon, yüksek operasyon yükü

Her tenant için ayrı database açmak izolasyon açısından anlaşılır bir modeldir. Bir müşterinin verisini taşımak, yedeklemek, silmek veya kaynaklarını ayırmak daha kolaydır. Büyük kurumsal müşteriler için bu model güven verir.

Bedeli ise operasyon sayısıdır. Yüzlerce tenant varsa yüzlerce connection string, migration, yedek, izleme ve kapasite kararı doğar. Otomasyon yoksa ekip hızla yorulur.

  • Kurumsal veya regülasyon hassas müşteriler için güçlü adaydır.
  • Müşteri çıkışı ve özel yedek daha kolay yönetilir.
  • Migration ve sürüm yönetimi otomasyon ister.
  • Küçük tenant sayısı çok fazlaysa maliyet artabilir.

Ayrı schema: orta yol gibi görünür

Ayrı schema yaklaşımı aynı database içinde tenantları mantıksal olarak ayırır. Migration yönetimi ayrı database kadar ağır olmayabilir; ama yine de schema sayısı arttıkça operasyon karmaşası büyür.

Bu model, orta ölçekli SaaS ürünlerinde mantıklı olabilir. Ancak connection, yetki ve search_path gibi detaylar dikkatle yönetilmelidir.

tenant_id kolonu: ekonomik ama disiplin ister

Tek schema içinde her tabloda tenant_id kullanmak maliyet ve operasyon açısından verimlidir. Ancak güvenlik riski uygulama koduna daha çok yüklenir. Bir sorguda tenant filtresi unutulursa veri sızıntısı riski oluşur.

Bu modelde row-level security, testler, kod inceleme ve standart query helperları çok önemlidir. Sadece “geliştiriciler dikkat eder” demek yeterli güvenlik modeli değildir.

PostgreSQL RLS fikri

tenant-rls.sql
alter table orders enable row level security;

create policy tenant_isolation_orders on orders
using (tenant_id = current_setting('app.tenant_id')::bigint);

RLS güçlü bir araçtır; uygulama bağlantı ve session ayarları doğru kurulmadan tek başına yeterli değildir.

Kararı müşteri segmentiyle birlikte verin

Aynı üründe tek model kullanmak zorunda değilsiniz. Küçük müşteriler ortak tablo modelinde, büyük müşteriler ayrı database modelinde tutulabilir. Hibrit yaklaşım karmaşıktır ama ticari gerçekliği daha iyi karşılayabilir.

Kararı verirken yedek, geri yükleme, müşteri çıkışı, veri silme, maliyet, performans ve destek erişimi birlikte düşünülmelidir.

Tenant model karar matrisi

tenant-model-matrix.md
Müşteri segmenti:
Veri hassasiyeti:
Beklenen veri boyutu:
Özel yedek/restore ihtiyacı:
Müşteri çıkışı beklentisi:
Maliyet hassasiyeti:
Önerilen model: ayrı database / ayrı schema / tenant_id / hibrit
Devam etmek istersen

Sorunu motor bazında derinleştirin

Benzer belirtiler farklı motorlarda farklı nedenlere dayanır; yayınlanan tüm rehberleri ana sayfadan takip edebilirsiniz.

Tüm makaleler