IHS Strategic
Tüm Blog Yazıları
HowTo10 Eylül 2026•2 dk okuma

MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi Rehberi

Modern web uygulamaları ve dijital ajans projeleri için MongoDB-Mongoose ölçekleme adımları. Şema tasarımı, indeksleme, bağlantı havuzu yönetimi teknik rehberi.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

1. Bağlantı Havuzu (Connection Pool) Yapılandırması

Modern web trafiği anlık yükselir. Varsayılan havuz boyutu yetersiz kalır. Dijital ajans ölçeğindeki projelerde bağlantı tüketimini önlemek için bağlantı ayarları optimize edilmelidir.

const mongoose = require('mongoose');

const connectDB = async () => {
  await mongoose.connect(process.env.MONGO_URI, {
    maxPoolSize: 50,
    minPoolSize: 10,
    serverSelectionTimeoutMS: 5000,
    socketTimeoutMS: 45000,
  });
};
module.exports = connectDB;

Kritik Parametreler:

  • maxPoolSize: Eşzamanlı maksimum soket sayısı. Trafik artışında darboğazı engeller.
  • minPoolSize: Boşta bekleyen hazır bağlantı adedi. Soğuk başlatma (cold-start) gecikmesini keser.
  • socketTimeoutMS: Yanıt vermeyen sorguları düşürür. Kaynak kilitlenmesini önler.

2. Şema Tasarım Trendleri: Embedding vs Referencing

İlişkisel modelleme alışkanlıkları NoSQL mimarisinde performans kaybına yol açar. Güncel trendler veri erişim sıklığına göre şemalandırma yapılmasını gerektirir.

Gömülü Doküman (Embedded Document)

Birlikte okunan, sınırlı sayıda alt veriler tek dokümanda tutulur. Tek I/O işlemiyle veri çekilir.

const OrderSchema = new mongoose.Schema({
  userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  items: [{
    productId: { type: mongoose.Schema.Types.ObjectId, ref: 'Product' },
    name: String,
    price: Number,
    qty: Number
  }],
  createdAt: { type: Date, default: Date.now }
});

Referans Verme (Referencing)

16MB BSON doküman limiti aşılma riski varsa veya veri bağımsız güncelleniyorsa referans kullanılır.

1-N ilişkilerde N > 1000 ise embedding terk edilir, referencing uygulanır. Doküman büyümesi engellenir.

3. İndeksleme Stratejileri

İndekssiz sorgu tam koleksiyon taraması (COLLSCAN) yapar. CPU ve disk tüketir.

Bileşik İndeks (Compound Index) ve ESR Kuralı

İndeks tanımlarken ESR sırası takip edilir: Equality (Eşitlik) > Sort (Sıralama) > Range (Aralık).

// Sorgu: status === 'active', sort: createdAt, range: age > 18
UserSchema.index({ status: 1, createdAt: -1, age: 1 });

Sorgu analizi için executionStats çıktısı izlenir:

const stats = await User.find({ status: 'active' })
  .sort({ createdAt: -1 })
  .explain('executionStats');
// totalDocsExamined / nReturned oranı 1'e yakın olmalı.

4. Sorgu Optimizasyonu: .lean() Kullanımı

Mongoose dokümanları change tracking, getter/setter ve prototype metodları içerir. Bellek ayak izi büyüktür. Sadece okuma yapılan uç noktalarda .lean() saf JavaScript objesi döndürür, bellek kullanımını %70 azaltır.

// Ağır yük altında çalışan modern web endpoint'i
const getProducts = async (req, res) => {
  const products = await Product.find({ inStock: true })
    .select('name price slug')
    .lean();
  res.json(products);
};

5. Yazma Performansı ve Sharding Hazırlığı

Toplu yazma operasyonlarında döngü içi create() terk edilir. bulkWrite() kullanılır.

await Product.bulkWrite([
  { updateOne: { filter: { _id: id1 }, update: { $inc: { stock: -1 } } } },
  { updateOne: { filter: { _id: id2 }, update: { $inc: { stock: -2 } } } }
]);

Ölçeklenebilir mimari için sharding aşamasında dengeli dağılan (yüksek kardinaliteye sahip) shard key seçilir. Monotonik artan ID'ler yerine hash tabanlı anahtarlar tercih edilir.