NoSQL'in satış cümlesi çoğumuzun ilk işine yıldız olmuştur: şema yok, özgürlük var; kolon ekleme derdi yok, hız var. Gerçek ise tersine dönüyor: şemayı veritabanından aldınız ama projeden çıkarmadınız. Artık şema, kodunuzun içinde ve isteğe bağlı gibi göründüğü için kimse yazmıyor. Altı ay sonra koleksiyonun içinde birbirine benzemeyen belgeler, her belge için ayrı çalışmak zorunda kalan kod ve hiçbirinin dokümantasyonu olmayan saha kalıyor.
Şema kaybolmaz, yeri değişir
İlişkisel dünyada şema veritabanındadır: kısıt yazılır, ihlali veritabanı reddeder. Belge tabanlı dünyada şema uygulamanın içinde yaşar; veritabanı varsayılan olarak her şeyi kabul eder. Bu, disiplinin kalktığı anlamına gelmez; disiplinin artık sizin sorumluluğunuz olduğu anlamına gelir. Sorumluluğu üstlenen bir proje şöyle görünür:
// Zod ile belge doğrulama: şema kodda ama yazılı ve zorunlu
const kullaniciSemasi = z.object({
adi: z.string().min(2),
eposta: z.string().email(),
rol: z.enum(['yonetici', 'uye']),
kayitTarihi: z.date(),
});
// Doğrulama olmadan yazılmış her belge, gelecekteki hatadır
const girdi = kullaniciSemasi.parse(istek.govdes);
await koleksiyon.insertOne({ ...girdi, kayitTarihi: new Date() });
Bir adım daha ileri gitmek istersek: MongoDB 3.6 sonrası JSON Schema ile belge düzeyinde doğrulama sunuyor. Koleksiyon düzeyinde de şema dayatabiliyorsunuz; bunu kullanmamak, ilişkisel dünyada kısıt koymamak kadar tuhaf bir tercih oluyor.
Gerçekte ne oluyor
Şemasız bir koleksiyonun görünmez maliyeti üç yerde öder. Birincisi: her alanın her belgede olup olmadığını kodunuz sürekli sorar; fark etmeseniz bile her erişim opsiyonel alandır, her kod satırı koşullu dallanır. İkincisi: göç derdi kaybolmaz, şekil değiştirir; alan adı değişikliği, ilişkisel dünyadaki göç yerine binlerce belgenin güncellenmesi demektir. Üçüncüsü: ilişkiler kaybolmaz, uygulama katmanına taşınır; birleşimleri veritabanı yerine siz yazarsınız ve hata payı büyür.
Bu maliyetin karşılığı da vardır ve alınmalıdır: erişim deseniniz belli ve tek tipte ise belge tabanı muhteşem hız verir. Tek tip sorgunun etrafına değil, tam üzerine kurulan şema, ilişkisel dünyada ayrı tablolara yayılmış veriyi tek okumada getirir. Sorun, özgürlüğün kendisi değil, özgürlüğün bedelsiz sanılmasıdır.
Ekipçe izlenecek en pratik yol, şemayı kodda tek dosyada toplamak ve her değişiklikte doğrulamayı zorunlu kılmaktır. Yeni alan eklendiğinde şema dosyası da aynı işlem içinde güncellenir; inceleme sırasında fark, herkesin göründüğü yerde olur. Alan adı değiştirdiğinde ise göç yazılır: eski alan yeni alana kopyalanır, doğrulama çalıştırılır, sonra eski alan bırakılır. İlişkisel dünyadakinden daha konuşmalı olur ama varlığını kabul etmediğiniz sürece sizi yavaşlatan da göçün kendisi değil, plansızlığıdır.
Doğru soru hangisi değil, nasıl
NoSQL mi SQL mi sorusu, yanlış sorunun en pahalısıdır; doğrusu şudur: erişim deseniniz belli mi, tutarlılık ihtiyacınız sert mi, sorgu şekliniz öngörülebilir mi? Erişim deseni tek ve net ise belge tabanlı veritabanı mükemmel uygundur; rapor türünden sorgular çok ise ilişkisel dünya sizi bekler. Kararın sonucu değil, sorumlu olması önemli: şema disiplinini kim üstlenecek, göçler kimin sorumluluğunda, doğrulama hangi katmanda yaşayacak? Bu üç sorunun cevabı yazılıysa, NoSQL ilişkisel dünya kadar güvenlidir. Cevap yoksa, ilişkisel olsun.
Okur Yorumları (0)