IHS Strategic
Tüm Blog Yazıları
HowTo19 Eylül 2026•4 dk okuma

MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi Rehberi: Adım Adım Kurulum

Modern web uygulamalarında MongoDB ve Mongoose kullanarak yüksek performanslı, esnek ve ölçeklenebilir veritabanı mimarisi kurma rehberi.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

Giriş: Modern Uygulamalarda Veritabanı Ölçeklenebilirliği

Hızla büyüyen veri hacmi ve anlık kullanıcı talepleri, modern yazılım projelerinde sağlam bir altyapı kurulumunu zorunlu kılmaktadır. Günümüz yazılım geliştirme trendleri, monolitik yapılardan mikroservislere ve esnek veri modellerine doğru evrilirken, veritabanı katmanının ölçeklenebilirliği bir uygulamanın başarısındaki en kritik faktör haline gelmiştir. Başarılı bir dijital strateji, yalnızca kullanıcı arayüzünü değil, arka plandaki veri mimarisinin performansını ve sürdürülebilirliğini de kapsar. Bu rehber, Node.js ekosisteminin en popüler ikilisi olan MongoDB ve Mongoose ile kurumsal düzeyde ölçeklenebilir bir mimariyi adım adım nasıl inşa edeceğinizi ele almaktadır.

Adım 1: Veri Modelleme Stratejisi (Embedding vs. Referencing)

MongoDB'de ölçeklenebilirliğin temeli, verilerin nasıl modellendiğinde yatar. İlişkisel veritabanlarının aksine NoSQL dünyasında iki temel yaklaşım bulunur:

  • Embedding (Gömülü Dokümanlar): Verilerin birbiriyle sıkı sıkıya bağlı olduğu ve birlikte okunduğu durumlarda (1:1 veya sınırlı 1:N ilişkiler) tercih edilir. Tek bir sorgu ile tüm veriye erişim sağlar ve okuma performansını maksimize eder.
  • Referencing (Referans Verme / Normalize Yapı): Veri setinin sınırsız büyüyebileceği (örneğin bir gönderiye ait binlerce yorum) veya verinin birden fazla yerde güncellenmesi gerektiği durumlarda ObjectId ile referanslama kullanılır.
İpucu: MongoDB doküman boyutu sınırı 16MB'tır. Sınırsız büyüme potansiyeline sahip dizileri (unbounded arrays) asla tek bir doküman içine gömmeyin; mutlaka referanslama yöntemini seçin.

Adım 2: Mongoose Şema Tasarımı ve Veri Bütünlüğü

Mongoose, şemasız MongoDB dünyasına tip güvenliği, doğrulama (validation) ve iş mantığı katmanları ekler. Ölçeklenebilir bir şema tasarlarken şu adımları izleyin:

1. Katı Tipler ve Doğrulama Kuralları

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  email: {
    type: String,
    required: [true, 'E-posta adresi zorunludur.'],
    unique: true,
    lowercase: true,
    trim: true,
    index: true
  },
  status: {
    type: String,
    enum: ['active', 'pending', 'suspended'],
    default: 'pending'
  },
  metadata: {
    lastLogin: Date,
    loginCount: { type: Number, default: 0 }
  }
}, {
  timestamps: true,
  versionKey: false
});

2. Virtuals ve Middleware (Hooks) Kullanımı

Veritabanına yazılmadan önce şifreleme, slug oluşturma veya ilişkili dokümanları temizleme gibi işlemleri Mongoose middleware'leri (pre/post hooks) ile merkezi hale getirin.

Adım 3: İndeksleme (Indexing) ile Sorgu Performansını Optimize Etme

Ölçeklenebilirlik darboğazlarının %90'ı eksik veya hatalı indekslerden kaynaklanır. Mongoose tarafında indekslerin doğru tanımlanması sorgu sürelerini milisaniyeler seviyesine çeker.

  • Single Field Index: Sık filtrelenen tekil alanlar (ör. slug, email).
  • Compound Index (Bileşik İndeks): Birden fazla alanın birlikte filtrelendiği ve sıralandığı durumlar (ör. { tenantId: 1, createdAt: -1 }). ESR (Equality, Sort, Range) kuralını mutlaka uygulayın.
  • Partial Index: Sadece belirli koşulları sağlayan dokümanları indeksleyerek bellek kullanımından tasarruf edin.
// Bileşik İndeks Tanımı
userSchema.index({ status: 1, createdAt: -1 });

// Kısmi (Partial) İndeks: Sadece aktif kullanıcıları indeksle
userSchema.index(
  { email: 1 },
  { partialFilterExpression: { status: 'active' } }
);

Adım 4: Production Düzeyinde Bağlantı Havuzu (Connection Pooling)

Yüksek trafik altında her istek için yeni bir bağlantı açmak veritabanı sunucusunu kilitler. Mongoose, arka planda bir bağlantı havuzu (connection pool) yönetir. Kurumsal bir dijital strateji doğrultusunda bu havuz parametreleri optimize edilmelidir.

const connectDB = async () => {
  try {
    const options = {
      maxPoolSize: 50, // Eşzamanlı maksimum bağlantı sayısı
      minPoolSize: 10, // Hazırda bekletilen minimum bağlantı sayısı
      socketTimeoutMS: 45000,
      serverSelectionTimeoutMS: 5000,
      family: 4 // IPv4 tercih et
    };

    await mongoose.connect(process.env.MONGO_URI, options);
    console.log('MongoDB bağlantısı başarıyla kuruldu.');
  } catch (error) {
    console.error('Veritabanı bağlantı hatası:', error.message);
    process.exit(1);
  }
};

Adım 5: Sorgu Optimizasyonu ve .lean() Kullanımı

Mongoose dokümanları; change tracking, getters/setters ve sanal alanlar gibi zengin özelliklerle döner. Ancak yalnızca okuma amaçlı sorgularda bu ek yük büyük bir bellek israfıdır.

  • .lean() Metodu: Mongoose dokümanı yerine doğrudan yalın JavaScript nesnesi (POJO) döndürür. Okuma performansını 3 ila 5 kat artırır.
  • Projection: Sadece ihtiyacınız olan alanları seçin (.select('name email')). Gereksiz büyük metin veya array alanlarını getirmekten kaçının.
  • Pagination (İmleç Tabanlı Sayfalama): skip() ve limit() yüksek veri setlerinde yavaşlar. Bunun yerine _id veya zaman damgası tabanlı (Keyset Pagination) sayfalama tercih edin.
// Yüksek Performanslı Okuma Sorgusu
const users = await UserModel.find({ status: 'active' })
  .select('email metadata.lastLogin')
  .where('_id').gt(lastSeenId)
  .limit(20)
  .lean();

Adım 6: Yatay Ölçekleme (Sharding) ve Yüksek Erişilebilirlik (Replica Sets)

Veri boyutunuz terabaytlara ulaştığında tek bir sunucunun dikey ölçeklenmesi (RAM/CPU artırımı) maliyetli ve yetersiz hale gelir. Modern veritabanı trendleri, yatay dağıtık sistemleri zorunlu kılmaktadır:

  • Replica Sets (Kopya Kümeleri): Bir Primary ve birden çok Secondary düğüm ile kesintisiz çalışma (High Availability) sağlanır. Okuma yükünü hafifletmek için analitik sorgular Secondary düğümlere yönlendirilebilir (readPreference: 'secondaryPreferred').
  • Sharding (Parçalama): Verilerin birden fazla sunucuya bölünerek dağıtılmasıdır. Başarılı bir Sharding süreci için doğru bir Shard Key seçimi hayati önem taşır.

Özet ve En İyi Uygulamalar Kontrol Listesi

Ölçeklenebilir bir MongoDB ve Mongoose mimarisinde şu temel prensipleri asla göz ardı etmeyin:

  • İlişki kurarken veri erişim modellerinize göre embedding ve referencing dengesini doğru kurun.
  • Her sorgunun bir indeksten faydalandığından explain('executionStats') çıktısıyla emin olun.
  • Sadece okuma yapacağınız işlemlerde istisnasız .lean() kullanın.
  • Bağlantı havuzunu (Pool Size) uygulamanızın eşzamanlı istek kapasitesine göre yapılandırın.
  • Gereksiz indeks maliyetinden kaçının; her indeks yazma (write) işlemlerini yavaşlatır.