PostgreSQL JSONB ve MongoDB BSON: Gerçek Mimari Farklar
BSON ve JSONB formatlarının bayt düzeyindeki farkları; indeksleme, güncelleme maliyeti ve okuma performansı üzerinden karşılaştırılıyor.
PostgreSQL ile MongoDB arasındaki tartışma genellikle SQL mi belge modeli mi, transaction desteği mi, join yeteneği mi ekseninde yürütülür; ancak asıl fark disk üzerindeki bayt formatında gizlidir. MongoDB'nin BSON'u, motorun çalışma zamanı felsefesinin bir yansımasıdır: kendini tanımlayan, tarayıp değiştirilmesi kolay bir tel (wire) formatı. PostgreSQL'in JSONB'si ise donmuş bir ayrıştırma ağacıdır; okuma anında hızlı erişim için optimize edilmiştir ama yazma anındaki değişikliklere kayıtsızdır ve Postgres'in MVCC ile TOAST mekanizmalarına bağımlıdır.
BSON, uzunluk ön ekli, tip etiketli ve sıralı anahtar-değer yapısı sayesinde sunucunun belgeyi doğrusal biçimde tarayabilmesini sağlar; alt belgeler tek bir adımda atlanabilir, aynı boyutta bir alan güncellemesi yerinde birkaç baytlık yamayla yapılabilir. Ayrıca int32/int64, decimal128, ObjectId, UTC tarih, ikili veri ve UUID gibi JSON'un ifade edemediği tipleri taşır. Bunun bedeli, alan adlarının her belgede ham metin olarak tekrar tekrar saklanması, yani şema veya paylaşılan sözlük olmadan disk ve bellek israfıdır.
JSONB ise tam tersine, anahtarları sıralayıp yinelenenleri eleyerek okumaya göre optimize edilmiş bir yapı kurar; anahtar araması ikili arama ile logaritmik sürede yapılabilir. Ancak bu yapı yerinde yama kabul etmez: 4KB'lık bir belgede tek bir booleanı değiştirmek yeni bir heap tuple'ı, WAL kaydı, TOAST hareketliliği ve ilgili indekslerin güncellenmesini tetikler. Ayrıca anahtar sırası ve yinelenen anahtarlar kaybolur, sayısal tipler BSON'daki gibi ayrık int32/int64 etiketleriyle değil Postgres'in keyfi hassasiyetli sayısal tipiyle temsil edilir; ikili veri için native bir tip yoktur, bu da base64 kodlama ya da ayrı bytea sütunlarına bölme gerektirir.
Mühendisler için asıl mesaj şu: format seçimi sadece sorgu dili tercihi değil, okuma gecikmesini, yazma amplifikasyonunu, indeks büyüklüğünü ve depolama verimliliğini belirleyen mimari bir karardır. Yoğun okuma ve nadiren güncellenen geniş belgeler için JSONB avantajlıyken, sık kısmi güncelleme gerektiren iş yükleri BSON'un yerinde yama yeteneğinden fayda görür.