Geleneksel SQL veritabanları onlarca yıldır başarıyla kullanılıyor. Ancak modern web uygulamaları, devasa veri setleri ve çevik geliştirme süreçleri yeni ihtiyaçlar doğurdu. NoSQL veritabanları bu ihtiyaçlara cevap vermek için ortaya çıktı ve MongoDB bu alandaki en popüler çözümlerden biri haline geldi.
NoSQL Nedir?
NoSQL (Not Only SQL), geleneksel ilişkisel veritabanlarının katı şema yapısından uzaklaşan veritabanı kategorisini ifade eder. Terabaytlardan petabaytlara uzanan veri hacimlerini yönetmek, hızlı değişen veri yapılarına uyum sağlamak ve dağıtık sistemlerde yüksek kullanılabilirlik sunmak için tasarlanmışlardır.
"Not Only SQL" ifadesi, bu veritabanlarının SQL'in yerine geçmediğini, aksine onu tamamladığını vurgular. Her iki yaklaşımın da güçlü ve zayıf yanları vardır.
NoSQL Veritabanı Türleri
NoSQL sistemleri dört ana kategoride incelenir:
Doküman Tabanlı
Verileri JSON veya BSON formatında dokümanlar olarak saklar. Her doküman farklı yapıya sahip olabilir, şema esnektir. MongoDB bu kategorinin en ünlü temsilcisi.
Kullanım alanları: İçerik yönetim sistemleri, katalog uygulamaları, kullanıcı profilleri.
Anahtar-Değer (Key-Value)
En basit NoSQL modeli. Her veri bir anahtar ile ilişkilendirilir ve bu anahtarla erişilir. Redis en popüler örneği.
Kullanım alanları: Önbellekleme, oturum yönetimi, alışveriş sepeti verileri.
Sütun Ailesi (Column Family)
Verileri satırlar yerine sütunlar halinde saklar. Büyük veri analitiği için optimize edilmiştir. Apache Cassandra ve HBase bu kategoride.
Kullanım alanları: Zaman serisi verileri, log analizi, büyük veri işleme.
Graf Tabanlı
Düğümler ve kenarlarla ilişkileri modelleyen yapı. Neo4j en bilinen örneği.
Kullanım alanları: Sosyal ağlar, öneri sistemleri, dolandırıcılık tespiti.
SQL vs NoSQL: Karşılaştırma
Şema Yapısı
SQL veritabanları katı şema gerektirir. Tablo yapısı önceden tanımlanır ve her satır aynı sütunları içerir. Şema değişikliği karmaşık migration süreçleri gerektirir.
NoSQL veritabanları esnek şema sunar. Her doküman farklı alanlara sahip olabilir. Yeni alan eklemek mevcut verileri etkilemez. Bu esneklik çevik geliştirme için idealdir.
Ölçeklenebilirlik
SQL veritabanları genellikle dikey ölçeklenir (daha güçlü sunucu). Yatay ölçekleme (birden fazla sunucu) karmaşık ve maliyetlidir.
NoSQL veritabanları yatay ölçekleme için tasarlanmıştır. Dağıtık mimaride veri otomatik olarak sunucular arasında bölüştürülür. Bulut ortamlarında ölçekleme kolaylıkla yapılabilir.
Tutarlılık vs Kullanılabilirlik
SQL veritabanları ACID (Atomicity, Consistency, Isolation, Durability) kurallarına sıkı bağlıdır. Veri tutarlılığı her zaman garanti edilir.
NoSQL veritabanları genellikle BASE (Basically Available, Soft State, Eventually Consistent) modelini benimser. Anlık tutarlılık yerine nihai tutarlılık sunar. Bu trade-off, yüksek kullanılabilirlik ve performans sağlar.
Sorgulama
SQL standart ve güçlü bir sorgulama dili sunar. JOIN işlemleri ile tablolar arası ilişkiler kolayca sorgulanır.
NoSQL'de sorgulama dili veritabanına göre değişir. JOIN işlemleri genellikle desteklenmez veya farklı şekilde uygulanır. Karmaşık ilişkisel sorgular için uygun değildir.
NoSQL Ne Zaman Tercih Edilmeli?
NoSQL veritabanları şu durumlarda öne çıkar:
Büyük ve hızlı büyüyen veri hacmi varsa. Veri yapısı sık değişiyorsa veya önceden bilinemiyorsa. Yüksek okuma/yazma performansı gerekiyorsa. Yatay ölçekleme ihtiyacı varsa. Çevik geliştirme süreçleri uygulanıyorsa.
SQL veritabanları şu durumlarda tercih edilmeli:
Karmaşık ilişkisel veriler varsa. ACID uyumluluğu kritikse (finansal işlemler). Karmaşık JOIN sorguları gerekiyorsa. Veri yapısı sabit ve önceden biliniyorsa.
MongoDB Nedir?
MongoDB, 2009'da yayınlanan açık kaynaklı doküman tabanlı NoSQL veritabanı. BSON (Binary JSON) formatında veri saklar. Tüm ilişkisel olmayan veritabanları arasında en popüler olanlardan biri.
Temel Kavramlar
Veritabanı (Database): Koleksiyonları barındıran üst düzey kapsayıcı.
Koleksiyon (Collection): SQL'deki tabloya karşılık gelir. Dokümanları içerir.
Doküman (Document): SQL'deki satıra karşılık gelir. JSON benzeri yapıda veri tutar.
Alan (Field): SQL'deki sütuna karşılık gelir. Doküman içindeki anahtar-değer çiftleri.
CRUD İşlemleri
MongoDB'de temel veri işlemleri:
Oluşturma (Create)
insertOne() tek doküman ekler:
db.kullanicilar.insertOne({ ad: "Ahmet", email: "[email protected]", yas: 28 })
insertMany() birden fazla doküman ekler:
db.kullanicilar.insertMany([ { ad: "Mehmet", email: "[email protected]" }, { ad: "Ayşe", email: "[email protected]" } ])
Okuma (Read)
find() dokümanları sorgular:
db.kullanicilar.find({ yas: { $gt: 25 } })
findOne() tek doküman döndürür:
db.kullanicilar.findOne({ email: "[email protected]" })
Güncelleme (Update)
updateOne() tek doküman günceller:
db.kullanicilar.updateOne( { email: "[email protected]" }, { $set: { yas: 29 } } )
$set belirtilen alanları günceller, $inc sayısal değeri artırır, $unset alanı kaldırır.
Silme (Delete)
deleteOne() tek doküman siler:
db.kullanicilar.deleteOne({ email: "[email protected]" })
deleteMany() koşula uyan tüm dokümanları siler.
Şema Tasarım Kalıpları
MongoDB'de şema tasarımı SQL'den farklı bir yaklaşım gerektirir. İki temel strateji var:
Gömülü Dokümanlar (Embedding)
İlişkili verileri tek doküman içinde saklamak:
{ ad: "Ahmet", adres: { sokak: "Örnek Sokak 123", sehir: "İstanbul", postaKodu: "34000" } }
Avantajları: Tek sorgu ile tüm veriye erişim. JOIN gerekmez. Okuma performansı yüksek.
Dezavantajları: Doküman boyutu sınırı (16 MB). Gömülü veri büyürse performans düşer. Veri tekrarı olabilir.
Ne zaman kullanmalı: Bire-az (one-to-few) ilişkilerde. Veriler her zaman birlikte okunuyorsa. Gömülü veri sık güncellenmiyor ve sınırsız büyümüyorsa.
Referans Dokümanlar (Referencing)
İlişkili verileri ayrı koleksiyonlarda saklayıp referansla bağlamak:
// Kullanıcı dokümanı { _id: ObjectId("..."), ad: "Ahmet", siparis_idleri: [ObjectId("..."), ObjectId("...")] }
// Sipariş dokümanı { _id: ObjectId("..."), urun: "Laptop", fiyat: 15000 }
Avantajları: Doküman boyutu kontrol altında. Veri tekrarı yok. Bağımsız güncelleme mümkün.
Dezavantajları: Birden fazla sorgu gerekir. JOIN benzeri işlemler uygulama katmanında yapılır.
Ne zaman kullanmalı: Bire-çok veya çoka-çok ilişkilerde. İlişkili veri bağımsız olarak sorgulanıyorsa. Veri sık güncelleniyorsa veya paylaşılıyorsa.
Hibrit Yaklaşım
En sık erişilen verileri göm, detayları referans tut. "Subset pattern" olarak bilinen bu yaklaşım her iki stratejinin avantajlarını birleştirir.
Örneğin bir blog yazısında son 5 yorumu göm, tüm yorumları ayrı koleksiyonda tut. Yazı okunurken son yorumlar hemen görünür, daha fazlası için ek sorgu yapılır.
İndeksleme
İndeksler sorgu performansını dramatik şekilde artırır. MongoDB'nin resmi dokümantasyonuna göre, doğru indeksler bazı durumlarda 100 kat üzerinde performans artışı sağlayabilir.
Tek Alan İndeksi
db.kullanicilar.createIndex({ email: 1 })
1 artan sıra, -1 azalan sıra için.
Bileşik İndeks
Birden fazla alanı kapsayan indeks:
db.siparisler.createIndex({ kullanici_id: 1, tarih: -1 })
Sorgularınızın sıklıkla kullandığı alan kombinasyonlarını indeksleyin.
Unique İndeks
Tekrar edilemez değerler için:
db.kullanicilar.createIndex({ email: 1 }, { unique: true })
E-posta veya kullanıcı adı gibi benzersiz olması gereken alanlar için kullanın.
TTL İndeks
Belirli süre sonra otomatik silme için:
db.oturumlar.createIndex({ olusturulma: 1 }, { expireAfterSeconds: 3600 })
Oturum bilgileri veya geçici veriler için idealdir.
İndeks Analizi
explain() ile sorgu performansını analiz edin:
db.kullanicilar.find({ yas: { $gt: 25 } }).explain("executionStats")
Bu komut indekslerin nasıl kullanıldığını gösterir.
Aggregation Framework
MongoDB'nin güçlü veri işleme aracı. Birden fazla aşamayı pipeline olarak birleştirir.
Temel Aşamalar
$match: Filtreleme (WHERE gibi) $group: Gruplama (GROUP BY gibi) $sort: Sıralama $project: Alan seçimi veya dönüştürme $limit ve $skip: Sayfalama
Örnek Pipeline
Kullanıcıları şehre göre grupla ve say:
db.kullanicilar.aggregate([ { $match: { aktif: true } }, { $group: { _id: "$sehir", toplam: { $sum: 1 } } }, { $sort: { toplam: -1 } }, { $limit: 10 } ])
Aggregation pipeline gerçek zamanlı analitik ve raporlama için güçlü bir araçtır.
En İyi Uygulamalar
Şema Tasarımı
Veriye nasıl erişeceğinize göre şema tasarlayın, zihninizdeki yapıya göre değil. Sınırsız büyüyebilecek dizilerden kaçının, performans sorunlarına yol açar. Okuma/yazma oranını göz önünde bulundurun; sık okunan, nadir güncellenen veriler denormalizasyon için uygundur.
Performans
Sık sorgulanan alanlara indeks ekleyin. Sayfalama için limit ve skip kullanın. Büyük veri setlerinde her seferinde 10-20 kayıt çekmek yeterlidir. Sorgu performansını explain() ile düzenli olarak analiz edin.
Güvenlik
Kimlik doğrulama ve yetkilendirme aktif olsun. Ağ erişimini kısıtlayın. Hassas verileri şifreleyin. Düzenli yedekleme yapın.
MongoDB Atlas
MongoDB'nin yönetilen bulut veritabanı hizmeti. AWS, Google Cloud ve Azure üzerinde çalışır. Otomatik yedekleme, ölçekleme ve izleme özellikleri sunar.
Ücretsiz tier ile başlayıp geliştirme ve öğrenme için kullanabilirsiniz. Production ortamları için ücretli planlar mevcut.
2026 Trendleri
Statista verilerine göre, küresel bulut veritabanı pazarının 2026'da 100 milyar doları aşması bekleniyor ve NoSQL çözümleri bu pazarın önemli bir bölümünü oluşturuyor.
Gartner öngörülerine göre, kurumsal uygulamalarda veri çeşitliliğinin artmasıyla hibrit (SQL ve NoSQL) veritabanı yaklaşımlarının benimsenmesi hızlanacak.
Mobil trafik artışı, hızlı yanıt süreleri ve esnek veri yapıları sunan NoSQL veritabanlarının önemini artırıyor.
Sonuç
NoSQL ve MongoDB, modern uygulama geliştirmenin vazgeçilmez araçları haline geldi. Esnek şema, yatay ölçekleme ve yüksek performans gerektiren projelerde güçlü bir seçenek.
Ancak her proje için doğru seçim değil. Karmaşık ilişkisel veriler, ACID gereksinimleri veya karmaşık JOIN sorguları varsa SQL veritabanları hâlâ daha uygun olabilir.
En iyi yaklaşım, projenin ihtiyaçlarına göre doğru aracı seçmektir. Bazen hibrit çözümler, her iki dünyanın en iyisini birleştirir. Veri türü, hacmi, erişim kalıpları ve tutarlılık gereksinimlerini değerlendirerek karar verin.
0 Yorum
Yorum Yaz