Yeni bir dijital uygulama başlatmayı planlıyorsanız, muhtemelen bazı verileri toplamanız ve saklamanız gerekecektir. Bu verileri nerede ve nasıl saklayacağınız, vermeniz gereken en önemli kararlardan biridir; zira yazılımın tamamı çalışmak için bu veriye dayanacaktır.
Geleneksel olarak veriler, belirli ilişkiler (ör. ortak sütunlar) aracılığıyla birbirine bağlanan satır ve sütunlardan oluşan tablolarda saklanır. İlişkisel verileri depolayan veritabanlarına ilişkisel veritabanları veya SQL veritabanları denir; zira çoğu, hatta tamamı tüm işlemler için SQL’e dayanır.
Bununla birlikte, son on yıllarda her saniye üretilen veri hacmi ve çeşitliliğindeki hızlı artışı karşılamak üzere yeni veritabanı yönetim sistemleri gelişti. NoSQL (Not only SQL) olarak adlandırılan veritabanları, belirli kullanım senaryolarına göre veriyi etkili biçimde toplamak için yeni şemalar ve stratejiler önerir; yine de belli ölçüde SQL’den yararlanır.
Bu yazıda iki popüler veritabanı yönetim sistemini analiz edeceğiz: PostgreSQL ve MongoDB. İlki en popüler SQL veritabanlarından biri, ikincisi ise en bilinen NoSQL veritabanıdır.
Her iki veritabanının temel özelliklerini ve güçlü yönlerini, en uygun kullanım alanlarını ve verilerinizi bu veritabanlarından birine taşımayı düşünüyorsanız hatırlamanız gereken önemli noktaları ele alacağız.
Her iki yöntemi de bizzat denemek istiyorsanız, mutlaka şu kurslarımıza göz atın: PostgreSQL Veritabanları Oluşturma ve Python ile MongoDB’ye Giriş.
Özet: PostgreSQL vs MongoDB
Doğru veritabanını seçmek her dijital uygulama için kritik önemdedir. SQL tabanlı güçlü bir ilişkisel veritabanı olan PostgreSQL, tutarlılık, karmaşık join’ler ve ACID işlemleri gerektiren yapılandırılmış veri senaryolarında öne çıkar. BSON kullanan esnek bir NoSQL belge veritabanı olan MongoDB ise dinamik, yapılandırılmamış veriyi yönetmek için idealdir ve yatay sharding ile daha yüksek ölçeklenebilirlik sunar. PostgreSQL ile MongoDB arasında seçim nihayetinde projenizin veri yapısına, ölçeklenebilirlik ihtiyaçlarına ve tutarlılık gereksinimlerine bağlıdır.
PostgreSQL ve MongoDB Veri Modeli Mimarileri
Veri modeli mimarisi açısından PostgreSQL ile MongoDB arasındaki temel farkları inceleyelim.
İlişkisel ve belge tabanlı yapılar
PostgreSQL gibi ilişkisel veritabanı yönetim sistemleri verileri tablolara göre düzenler; her tablo satır ve sütunlardan oluşur. Bu tablolar anahtarlar aracılığıyla birbirine bağlanabilir ve böylece SQL join’leri ve verimli sorgulama ile karmaşık veri ilişkileri kurulabilir.

İlişkisel veritabanı. Kaynak: DataCamp
Basitliği, benzersiz verimliliği ve güçlü tutarlılığı sayesinde ilişkisel veritabanları son on yıllarda son derece başarılı olmuş ve yaygın şekilde benimsenmiştir.
Ancak, tablo biçimine düzgünce uymayan yapılandırılmamış verilerle (ör. sosyal medya gönderileri, sensör verileri) çalışırken veya ölçeklenebilirliğin şart olduğu durumlarda —yani uygulamanızın çok sayıda sunucuya yatay olarak ölçeklenmesi gerektiğinde— en iyi seçenek olmayabilirler.
İşte burada NoSQL veritabanları devreye girer. İlişkisel muadillerinin aksine NoSQL veritabanları, sabit bir şemanın kısıtları olmadan yapılandırılmamış veya yarı yapılandırılmış veriyi işleyebilir.
Özel olarak MongoDB, belge veritabanı olarak adlandırılan bir NoSQL türüdür ve verileri BSON (Binary JSON) adı verilen bir formatı kullanarak JSON benzeri belgeler koleksiyonlarında saklar. Basitçe söylemek gerekirse belgeler, BSON’un sağladığı ek veri depolama ve işleme yetenekleriyle JSON anahtar-değer nesnelerine benzer.

MongoDB veriyi BSON olarak nasıl depolar. Kaynak: DataCamp
BSON’un esnek doğası, yapısı ve verisi anlık olarak değişebilen dinamik belge şemaları oluşturmaya imkân tanır. Bunu bir sonraki alt bölümde daha ayrıntılı göreceğiz.
Şema evrimi kalıpları
PostgreSQL gibi ilişkisel veritabanları, tablolarınızı oluşturduktan sonra değiştirilmesi zor olan sağlam şemalar sunar. Çalıştığınız verinin tablo doğasına sahip olduğu ve uygulamanıza her zaman aynı formatta geldiği durumlar için bu harika bir özelliktir. Ancak, sosyal medya gönderileri veya sensör verileri gibi, içeriği örnekten örneğe değişebilen yarı yapılandırılmış veya yapılandırılmamış verilerle uğraşıyorsanız, verinizi hazmetmek için belli bir esneklik seviyesine ihtiyaç duyabilirsiniz.
PostgreSQL’in aksine MongoDB, olağanüstü esneklik sunan şemasız tasarımlarla gelir. MongoDB’nin şemasız tasarımı verileri belgeler ve koleksiyonlar halinde organize eder:
- Belgeler temel veri birimidir ve BSON anahtar-değer çiftlerinden oluşur. Belgeler, string, sayı, tarih, dizi ve hatta gömülü başka belgeler içerebilir. Bu, tek bir belge içinde karmaşık ilişkileri temsil eden sofistike veri modellerine olanak tanır ve çoğu programlama dilinde nesnelerin yapısıyla uyumludur.
- Koleksiyonlar ilişkili belgeleri bir araya getirir; tabloya benzer ama daha esnek bir yapıdır. Koleksiyonlar bir şema dayatmaz; bu sayede belgeler farklı yapılara ve alanlara sahip olabilir. Koleksiyonlar MongoDB veritabanları içinde bulunur ve her veritabanı birden çok koleksiyon içerebilir.
Geleneksel ilişkisel veritabanlarında yeni bir alan eklemek tüm tablo yapısının değiştirilmesini gerektirirken, MongoDB aynı koleksiyon içindeki belgelerin tamamen farklı alanlara ve yapılara sahip olmasına izin verir. Bu, katı şemalara duyulan ihtiyacı ortadan kaldırır ve tekdüzeliği zorlamadan çeşitli verileri saklamayı kolaylaştırır.
PostgreSQL ve MongoDB Sorgulama Dilleri
Hangi veritabanını kullanırsanız kullanın —PostgreSQL veya MongoDB— veritabanlarınızla iletişim kurmak ve onları yönetmek için dili öğrenmeniz gerekir. PostgreSQL’de bu dil, son derece popüler, standartlaştırılmış ve kullanımı kolay bir programlama dili olan SQL’dir. SQL’e bizim SQL’e Giriş kursumuzla başlayabilirsiniz.
Buna karşılık MongoDB, veritabanıyla etkileşim için öncelikle kendi MongoDB Sorgulama Diline (MQL) dayanır. Ancak, MongoDB veritabanlarına bağlanmak ve etkileşim kurmak için Python, C ve Java gibi diğer popüler programlama dillerini kullanmak da mümkündür.
SQL ile MQL arasındaki temel farkları inceleyelim.
SQL ve MQL yetenekleri
PostgreSQL’in MongoDB’ye kıyasla en büyük avantajlarından biri SQL kullanmasıdır. SQL (“Structured Query Language”in kısaltması), ilişkisel veritabanları inşa etmek ve sürdürmek için temel bir dildir.
Neredeyse tüm ilişkisel veritabanı sistemleri —MySQL, SQL Server, SQLite ve elbette PostgreSQL gibi— tarafından kullanılan, basit ve alan-özel bir programlama dilidir.
SQL son derece güçlüdür; veri alma ve toplulama işlemlerinden veri temizleme ve birleştirme işlemlerine kadar her türlü veri operasyonunu yapmanıza olanak tanır. Ancak PostgreSQL söz konusu olduğunda imkânlar daha da geniştir; çünkü PostgreSQL, karmaşık analizler için şu gelişmiş yeteneklerle gelir:
- Fonksiyonlar ve prosedürler: PostgreSQL, çeşitli programlama dillerinde yazılabilen fonksiyonlar ve saklı yordamlar oluşturmayı destekler; bu da veritabanının karmaşık işlemleri ele alma yeteneğini artırır.
- Tam metin arama: PostgreSQL sağlam tam metin arama yetenekleri sunar ve metinsel veriler üzerinde verimli aramalara imkân tanır.
- JSON desteği: JSON veri tiplerine kapsamlı destek, PostgreSQL’in yarı yapılandırılmış veriyi etkin biçimde işlemesine olanak tanır ve ilişkisel ile belge odaklı veritabanları arasındaki boşluğu bir ölçüde kapatır.
Öte yandan MongoDB SQL’e dayanmasa da, güçlü sorgulama, indeksleme ve toplulaştırma yeteneklerine sahiptir; ayrıca belge veritabanlarında bilgi eklemek, güncellemek veya silmek için diğer işlevleri sunar. Dolayısıyla JSON veya Python sözlüklerine aşinaysanız, MQL söz dizimine alışmanız uzun sürmez.
MQL, belgelerin dinamik doğasını ele almak üzere özel olarak tasarlanmıştır. Sonuç olarak SQL’e kıyasla çok daha esnek bir dildir. Ayrıca, belgeler başka belgeleri gömebildiğinden MongoDB’de ilişkisel veritabanlarında sıklıkla gerekli olan karmaşık ve verimsiz join işlemlerine ihtiyaç yoktur.
İndeksleme stratejileri
İndeksler, veri alma işlemlerinin hızını artıran veritabanı nesneleridir. Tablodaki satırları hızla bulmak için işaretçi görevi görürler ve sorgu performansını artırırlar.
PostgreSQL güçlü indeksleme yetenekleriyle gelir ve şu indeks türleri de dâhil olmak üzere birden çoğunu destekler:
- B-Tree İndeksi: Varsayılan ve en yaygın kullanılan indeks türü
- Hash İndeksi: Eşitlik aramalarında hızlı
- GIN İndeksi: JSON, diziler ve tam metin arama için
- GiST İndeksi: Geometrik veya bulanık arama gibi karmaşık veri türleri için
- BRIN İndeksi: Doğal olarak sıralı büyük veriler (ör. zaman serisi günlükleri) için
- İfade İndeksi: Bir fonksiyon veya ifade tabanlı indeks
- Kısmi İndeks: Yalnızca bir alt küme satırı indeksleme (filtreleme için kullanışlı)
MongoDB de bir koleksiyondaki tüm belgeleri taramadan belgeleri bulmak için indekslemeyi destekler. Ancak yetenekleri sınırlıdır; PostgreSQL gibi ilişkisel veritabanlarında bulunan çeşitlilik ve sofistike indeksleme düzeyine sahip değildir. Şunları içerir:
- Tek alan İndeksi: Tek alan indeksleri, her belgedeki tek bir alandan veriyi toplar ve sıralar.
- Bileşik İndeks: Bileşik indeksler, her belgedeki iki veya daha fazla alandan veriyi toplar ve sıralar.
- Çok anahtarlı İndeks: Dizi içinde saklanan verileri toplar ve sıralar.
- Metin İndeksi: Dize içeriği barındıran alanlarda metin arama sorgularını destekler.
- Hash İndeksi: Hash sharding’i destekler. Hash indeksleri, bir alanın değerinin hash’ini indeksler.
SQL ve NoSQL veritabanlarınızda indeks kullanmak, özellikle büyük veri kümelerinde performansı artırmak ve sorgu sürelerini azaltmak için anahtardır.
Ancak bir indeks eklemenin yazma işlemleri için olumsuz bir performans etkisi olabileceğini unutmayın. Yüksek yazma/okuma oranına sahip tablolar veya koleksiyonlar için indeksler maliyetlidir; çünkü her ekleme, ilgili indekslerin de güncellenmesini gerektirir.
MongoDB ve PostgreSQL’de Performans ve Ölçeklenebilirlik
MongoDB ve PostgreSQL harika veritabanı araçlarıdır; ancak yalnızca özelliklerine bakarak birini diğerine tercih etmenin anlamı yoktur. Bunun yerine, her zaman kullanım senaryonuzun özelliklerini dikkate alarak seçiminizi yapmalısınız. Bunu akılda tutarak MongoDB ve PostgreSQL’in performans ve ölçeklenebilirlik farklarını inceleyelim.
İşlem (transaction) işleme
Diğer popüler ilişkisel veritabanı sistemleri gibi PostgreSQL de güçlü tür sistemi ve ACID (Atomicity, Consistency, Isolation, Durability) işlemlerine desteği sayesinde yüksek düzeyde veri bütünlüğü ve kalitesi sağlar.
ACID işlemleri veritabanı işlemlerinin güvenilir biçimde işlenmesini garanti eden bir özellikler kümesidir. Hatalar, çökmeler veya eşzamanlı erişim durumlarında dahi verinin doğru ve güvenli kalmasını sağlarlar. Bu özellikler, her projede veri kalitesini korumak için hayati önem taşır.
ACID işlemleri uzun süredir ilişkisel veritabanlarında veri bütünlüğünü sağlamanın altın standardı olmasına karşın, MongoDB gibi NoSQL veritabanları çoğunlukla katı işlem tutarlılığı yerine esneklik ve ölçeklenebilirliği önceler. Bu da ilişkisel veritabanlarında bulunan bazı ACID özelliklerinin gevşetilmesiyle sonuçlanır.
Örneğin bazı MongoDB kurulumları, anlık tutarlılık yerine sonuçta tutarlılığı (eventual consistency) önceler; yani değişiklikler tüm düğümlere anında yansımayabilir. Tutarlılık, erişilebilirlik ve performans arasındaki bu ödünleşim, daha iyi performans ve ölçeklenebilirlik sağlar; ancak veriye sıkı tutarlılıkla dayanan uygulamaları tasarlarken dikkatli olunmasını gerektirir.
Ölçeklenebilirlik kalıpları
Ölçekleme, veri hacmi ve trafikteki artışları karşılamak için çeşitli tekniklerin kullanılmasını içerir. Basitçe söylemek gerekirse bunu dikey ölçekleme ve yatay ölçekleme ile yapabiliriz. İlki, artan yükü karşılamak için aynı sunucunun iyileştirilmesini ve kaynak eklenmesini içerir. İkincisi ise kapasiteyi artırmak üzere dağıtık bir sisteme daha fazla sunucu veya düğüm ekleyerek gerçekleştirilir.
PostgreSQL kapasite artırımı için öncelikle dikey ölçeklemeye dayanır. Ancak diğer popüler SQL veritabanlarının aksine, PostgreSQL bölümlendirme (partitioning) yoluyla yatay ölçeklemeye de izin verir; yine de karmaşık yapılandırmalar gerektirir. PostgreSQL’de bölümlendirmenin tüm teknik detaylarını bizim PostgreSQL’de Sorgu Performansını Artırma kursumuzda öğrenebilirsiniz.
Buna karşılık MongoDB gibi NoSQL sistemlerinde artan veri trafiği ve hacmini yönetmek için başvurulan strateji yatay ölçeklemedir. MongoDB, bir veritabanını “shard” adı verilen daha küçük ve yönetilebilir parçalara bölüp bunları birden çok sunucuya dağıtmayı içeren sharding tekniğinden yararlanacak şekilde tasarlanmıştır; bu da sisteme büyük veri kümelerini ve yüksek trafik hacimlerini yönetme olana yönetme olanağı verir.
Bu popüler ölçekleme teknikleri hakkında her şeyi öğrenmek için Sharding vs Partitioning makalemize göz atın.
MongoDB ve PostgreSQL: Kullanım Senaryosu Analizi
Artık PostgreSQL ve MongoDB’nin temel özelliklerini ve güçlü yanlarını bildiğimize göre, en yararlı oldukları senaryoları analiz etme zamanı.
PostgreSQL için ideal senaryolar
Projeniz şu gereksinimlere sahip olacaksa PostgreSQL harika bir seçimdir:
- Güçlü tutarlılık: Tüm kullanıcıların aynı anda aynı veriyi görmesini sağlamak.
- Karmaşık sorgular: İçgörü elde etmek için birden çok tablodan verileri birleştirmek.
- Gelişmiş analitik: Veritabanı içinde karmaşık hesaplamalar veya veri dönüşümleri yapmanız gerekiyorsa PostgreSQL’in genişletilebilirliği paha biçilmezdir.
- Ölçeklenebilirlik: Önemli ölçüde büyümesi beklenen projelerde PostgreSQL’in dikey ölçekleme veya bölümlendirme yoluyla büyük veri kümelerini yönetebilmesi büyük bir avantajdır.
- ACID uyumluluğu: Kritik uygulamalar için güvenilir işlem işlemesini garanti etmek.
Bazı çarpıcı örnekler vermek gerekirse PostgreSQL şu durumlar için isabetli bir fikirdir:
- Finansal işlemler: Para transferi veya ödeme işlemede doğruluk ve tutarlılık kritik önemdedir.
- Stok sistemleri: Aşırı satış veya tutarsızlıkları önlemek için stok seviyelerinin doğru güncellenmesi hayati önem taşır.
- Sipariş işlemleri: E-ticarette müşteri memnuniyeti için siparişlerin doğru ve tutarlı biçimde işlenmesi gerekir.
En uygun MongoDB uygulamaları
MongoDB, veri yapılarının yeni bilgi ve şemalara dinamik olarak uyum sağlamasının yararlı olduğu, ölçeklenebilirlik ve performansın önemli olduğu ve yapılandırılmamış verilerin söz konusu olduğu durumlarda en iyi şekilde çalışır. MongoDB’nin şemasız tasarımı ve yatay ölçekleme ile birleşimi, şu kullanım alanları için harikadır:
- Sosyal medya akışları: Gelen verilerin büyük kısmı yapılandırılmamış ve öngörülemez olduğundan veri tutarlılığı daha az kritiktir; sistem duyarlı kaldığı sürece gönderiler veya beğenilerdeki geçici tutarsızlıklar kabul edilebilir.
- İçerik dağıtım ağları: Kullanıcılara en düşük gecikmeyle içerik sunmak, tutarlılıktan önceliklidir.
Hibrit mimariler
Çeşitli veri gereksinimleri için kapsamlı bir çözüm elde etmek üzere MongoDB ve PostgreSQL’in güçlü yönlerini birleştirmeniz gereken kullanım durumları olabilir. SQL ve NoSQL veritabanlarını birleştiren hibrit mimariler oluşturmak mümkündür ve işlemlerinizde güçlü tutarlılığı belli bir esneklikle birleştirmeniz gerekiyorsa harika bir fikirdir.
Örneğin, gerçek zamanlı analitikte hızlı yazmalar için MongoDB’yi kullanırken, karmaşık ilişkisel işlemler ve yapılandırılmış veriyi depolamak için PostgreSQL’den yararlanabilirsiniz. Ancak her iki veritabanının işlevlerini “birleştirmenin” şu an için bir yolu yoktur. Sadece aynı anda iki farklı veritabanı kullanıyor olursunuz; bu da sisteminizin karmaşıklığını artırır ve uygulamadan önce dikkatli analiz gerektirir.
Geçiş (Migrasyon) Hususları
Verileri MongoDB’den PostgreSQL’e veya tam tersi yöne taşımayı planlıyorsanız birkaç unsuru göz önünde bulundurmanız gerekir:
Veritabanı şemaları
MongoDB’den PostgreSQL’e geçiyorsanız, veri taşımadan önce önceden tanımlı bir şemaya sahip bir tablo veya birden çok tablo oluşturmanız gerekir; yani atanmış veri türleri ve olası kısıtları olan sütunlar listesi. Verinizi Mongo’ya taşımak istiyorsanız, verinin belgelere nasıl yerleştirileceğini tanımlamanız gerekir. Belgelerin esnek doğasına rağmen, mevcut veriyi konumlandırmak için bir miktar veri modelleme şart olacaktır.
Olası veri dönüşümleri
Dışa aktarmak istediğiniz veriler istenen formatta olmayabilir. Böyle bir durumda, taşımadan önce veriyi PostgreSQL veya MongoDB veritabanına eklemeden önce doğru formata dönüştürmek için bir tür veri hattı kurmanız gerekir.
Veri nasıl taşınır
Bir geçiş süreci yapmanın birden çok yolu vardır. Temel dışa aktarma/içe aktarma adımları için manuel yapabilirsiniz; ancak özellikle taşımak istediğiniz veritabanı çok veri içeriyorsa zaman alıcı, karmaşık ve hataya açık bir süreç olabilir. Bu nedenle işi yapmak için bir ELT seçmek daha iyi bir çözüm olabilir. PostgreSQL’den Mondo’ya ve tam tersine geçiş için pek çok mevcut çözüm vardır.
Geçiş sırasında performansı artırmaya yönelik teknikleri dikkate almak, özellikle karmaşık geçiş süreçlerinde kritik önemdedir. Yine, kaynağa ve hedefe bağlı olarak PostgreSQL ve MongoDB, süreci hızlandırmak için bağlantı havuzu (connection pooling), bölümlendirme (partitioning), shard anahtarı seçimi ve kapsanan sorgular (covered queries) gibi özel teknik ve stratejiler sunar.
Güvenlik ve Uyum
Veritabanı dağıtımınızı korumak, veri bütünlüğünü, erişilebilirliğini ve uyumu sağlamak için kritiktir. Hem MongoDB hem de PostgreSQL veritabanlarınızı güvenceye almak için çeşitli yöntemler sunar. Bu bölümde en yaygın tekniklerden bazılarını ele alıyoruz.
Kimlik doğrulama mekanizmaları
PostgreSQL, roller aracılığıyla etkin biçimde yönetilebilen bir dizi kimlik doğrulama yöntemiyle gelir. Roller, veritabanı nesnelerinin sahibi olabilen ve veritabanı ayrıcalıklarına sahip varlıklardır. Roller kimlik doğrulama, izin yönetimi ve kullanıcı erişim seviyelerini tanımlamak için kullanılabilir. PostgreSQL’de bir rol, bir kullanıcı veya bir kullanıcı grubu olarak işlev görebilir.
Yetkisiz erişimi önlemek için MongoDB’de de roller oluşturabilirsiniz. Rol tabanlı kontrol, güvenlik risklerini en aza indirmek için asgari ayrıcalık ilkesini izler. MongoDB, güvenli parola tabanlı kimlik doğrulama için varsayılan mekanizma olan Salted Challenge Response Authentication Mechanism (SCRAM) dâhil olmak üzere çeşitli kimlik doğrulama mekanizmalarıyla gelir.
Şifreleme uygulamaları
MongoDB, verilerinizi güvenceye almak için şu seçenekler de dâhil olmak üzere oldukça fazla sayıda şifreleme uygulaması sunar:
- TLS/SSL şifreleme: İstemciler ile veritabanı arasındaki iletişimi güvenceye almak için aktarım halindeki veriyi TLS/SSL ile şifreleyin.
- IP beyaz listeleme ve VPN’ler: Yalnızca güvenilir IP adreslerine izin vererek MongoDB örneklerinize erişimi kısıtlayın. Ek güvenlik için üretim veritabanlarına erişimde güvenli tüneller oluşturmak üzere VPN kullanın.
- Bekleyen verinin şifrelenmesi: WiredTiger depolama motorunda MongoDB’nin yerel desteğini kullanarak bekleyen verinin şifrelenmesini etkinleştirebilirsiniz. Bu, diskte saklanan hassas verileri korur.
- İstemci tarafı alan düzeyinde şifreleme: Yüksek güvenlik gereksinimleri için, belirli alanları veritabanına gönderilmeden önce şifrelemek üzere istemci tarafı alan düzeyinde şifreleme kullanın. Bu, veritabanı yöneticilerinin bile hassas bilgilere erişememesini sağlar.
PostgreSQL ise çeşitli düzeylerde şifreleme sunar ve verileri veritabanı sunucusunun çalınması, kötü niyetli yöneticiler ve güvensiz ağlar nedeniyle ifşa olmaktan korumada esneklik sağlar. Bazı seçenekler şunlardır:
- Parola şifreleme: Veritabanı kullanıcı parolaları özet olarak saklanabilir; böylece yönetici kullanıcının gerçek parolasını belirleyemez.
- Ağ üzerinden verinin şifrelenmesi: SSL bağlantıları ağ üzerinden gönderilen tüm verileri şifreler: parola, sorgular ve dönen veriler.
- Veri bölümü şifrelemesi: Depolama şifrelemesi dosya sistemi düzeyinde veya bölüm (partition) düzeyinde gerçekleştirilebilir.
- SSL ana bilgisayar kimlik doğrulaması: Hem istemci hem de sunucu birbirlerine SSL sertifikaları sunabilir.
Topluluk ve Ekosistem
Hem MongoDB hem de PostgreSQL son derece popüler araçlardır; büyüyen kullanıcı toplulukları ve gelişen ekosistemleri vardır. Gelin bunlara bakalım.
Eklenti/uzantı yetenekleri
PostgreSQL uzantıları, veritabanının yeteneklerini genişleten eklenti modülleridir. Python veya R’deki paketlere benzerler. Son yıllarda, PostgreSQL’in potansiyelini her türlü senaryo, disiplin ve kullanım alanında artırmak için zengin bir uzantı ekosistemi ortaya çıktı. Çoğu PostgreSQL Extension Network üzerinde bulunabilir.
Buna karşılık MongoDB daha sınırlı bir uzantı setiyle gelir ve çoğunlukla MongoDB’nin Visual Studio Code gibi IDE’ler ve Google Cloud gibi bulut sistemleriyle kullanılmasını etkinleştirmeyle sınırlıdır. Ancak, MongoDB’yi yönetmek için kullandığınız farklı programlama dilleri için başka üçüncü taraf paketler bulunabilir.
Benimsenme eğilimleri
Her iki araç da altın çağını yaşıyor; DB-Engines verilerine dayanan veritabanı motoru eğilimlerini gösteren aşağıdaki görselde olduğu gibi.

Kaynak: db-engines
İlişkisel veritabanı yönetim sistemleri hâlâ baskın olsa da (4. sırada yer alan PostgreSQL dâhil), grafik son yıllarda NoSQL veritabanlarında —MongoDB ve Redis gibi— kayda değer bir yükselişi de ortaya koyuyor. Bu yükseliş, yapılandırılmamış veriyi yönetmek ve yüksek trafikli uygulamaları barındırmak için bu esnek ve ölçeklenebilir çözümlerin artan şekilde benimsendiğini yansıtıyor.
PostgreSQL ve MongoDB Karşılaştırma Tablosu
İşte MongoDB veritabanları ile PostgreSQL arasındaki farkları özetleyen güzel bir tablo:
|
Özellik
|
MongoDB
|
PostgreSQL
|
|
Veri Yapısı
|
Verileri belgeler (ör. JSON, BSON) olarak saklar; esnek, hiyerarşik yapılara izin verir.
|
Verileri önceden tanımlı bir şemayı izleyerek satır ve sütunlara sahip tablolarda saklar.
|
|
Şema Esnekliği
|
Şemasız: Belgeler farklı yapılar, alanlar ve veri tiplerine sahip olabilir.
|
Sabit şema: Belirli sütunlar ve veri türleriyle önceden tanımlı bir şema gerektirir.
|
|
Sorgu Dili
|
Nesne tabanlı ve daha esnek olan MongoDB Sorgulama Dili’ni (MQL) veya benzerini kullanır.
|
Yapılandırılmış veriyi sorgulamak için SQL (Structured Query Language) kullanır.
|
|
Join’ler
|
İlişkili veriyi belgelerin içine gömerek (denormalizasyon) join’lerden kaçınır.
|
Tablolar arasında karmaşık join’leri (normalizasyon) destekler.
|
|
Performans
|
Yapılandırılmamış veya yarı yapılandırılmış veri için okuma ve yazmalarda daha hızlıdır. Join’lerin getirdiği yükten kaçınır.
|
Yapılandırılmış veri için güçlü performans; ancak join’ler sorguları yavaşlatabilir.
|
|
Ölçeklenebilirlik
|
Yatay ölçeklenebilir: Sharding kullanarak veriyi birden çok sunucuya dağıtabilir.
|
Genellikle dikey ölçeklenebilir: Daha güçlü donanıma dayanır; bazıları yatay ölçeklemeyi destekler (ör. bölümlendirme ile).
|
|
İşlem Desteği
|
(MongoDB 4.0 ve üstünden itibaren) çok belgeli ACID işlemlerini destekler; ancak başlangıçta işlemsel olmayan operasyonlar için tasarlanmıştır.
|
Güçlü tutarlılık ve güvenilirlik sağlayan, ACID uyumlu işlemler için tam destek.
|
|
Kullanım Alanları
|
Kullanıcı profilleri, günlükler, kataloglar ve esnek veri yapıları gibi yapılandırılmamış veya yarı yapılandırılmış veriler için en iyisidir.
|
Finansal kayıtlar veya kurumsal kaynak planlama (ERP) gibi net ilişkileri olan yapılandırılmış veriler için idealdir.
|
|
Veri İlişkileri
|
Gömülü veriyi (denormalizasyon) destekler; bu da ilişkili bilgiyi tek sorguda getirmeyi kolaylaştırır.
|
İlişkisel veritabanları, tablolar arası ilişkileri kurmak için yabancı anahtarlara dayanır (normalizasyon).
|
|
İndeksleme
|
İndekslemeyi destekler; ancak ilişkisel veritabanlarında mevcut çeşitlilik ve incelik düzeyinden yoksundur.
|
Daha iyi performans optimizasyonu için birden çok indeks türünü (ör. B-tree, hash) destekleyen güçlü indeksleme yetenekleri.
|
|
Tutarlılık
|
Dağıtık kurulumlarda sonuçta tutarlılık sağlar; ancak gerektiğinde (ACID işlemleriyle) güçlü tutarlılık da sunar.
|
ACID işlemleri ve ilişkisel bütünlük nedeniyle çoğu durumda güçlü tutarlılık sağlar.
|
|
Veri Hacmini Ölçekleme
|
Sunucu ekleyerek (sharding) büyük miktarda veriye kolayca ölçeklenir.
|
Dikey olarak ölçeklenebilir; ancak yatay ölçekleme (ör. bölümlendirme) daha karmaşık yapılandırma gerektirir.
|
|
Veri Bütünlüğü
|
Veri bütünlüğü her belgenin içinde yönetilir; ancak belgeler arası ilişkileri yönetmek daha zorlu olabilir.
|
Birincil ve yabancı anahtarlar ile UNIQUE ve NOT NULL gibi kısıtlar aracılığıyla veri bütünlüğü için güçlü yerleşik destek.
|
|
Geliştirici Dostluğu
|
Geliştirici dostu: Esnek veri modelleme; modern uygulamalarla (ör. JSON, REST API’ler) iyi çalışır.
|
Katı veri modelleme; ancak SQL ve yapılandırılmış veriye aşina geliştiriciler tarafından iyi anlaşılır.
|
Sonuç
MongoDB ve PostgreSQL, mevcut en popüler veritabanları arasındadır. SQL ve NoSQL veritabanlarına harika örneklerdir ve onları karşılaştırarak bu veritabanlarının farkları, güçlü yönleri ve yararlı olabilecek farklı kullanım alanları hakkında fikir edinebiliriz.
SQL ve NoSQL veritabanları hakkında öğrenilecek çok şey var. DataCamp olarak, sizi en kapsamlı ve güncel kurslar ve eğitimlerle desteklemek istiyoruz. Bazı özel veritabanı içeriklerimize buradan göz atın:
Yeni bir dijital uygulama başlatmayı planlıyorsanız, muhtemelen bazı verileri toplamanız ve saklamanız gerekecektir. Bu verileri nerede ve nasıl saklayacağınız, vermeniz gereken en önemli kararlardan biridir; zira yazılımın tamamı çalışmak için bu veriye dayanacaktır.
Geleneksel olarak veriler, belirli ilişkiler (ör. ortak sütunlar) aracılığıyla birbirine bağlanan satır ve sütunlardan oluşan tablolarda saklanır. İlişkisel verileri depolayan veritabanlarına ilişkisel veritabanları veya SQL veritabanları denir; zira çoğu, hatta tamamı tüm işlemler için SQL’e dayanır.
Bununla birlikte, son on yıllarda her saniye üretilen veri hacmi ve çeşitliliğindeki hızlı artışı karşılamak üzere yeni veritabanı yönetim sistemleri gelişti. NoSQL (Not only SQL) olarak adlandırılan veritabanları, belirli kullanım senaryolarına göre veriyi etkili biçimde toplamak için yeni şemalar ve stratejiler önerir; yine de belli ölçüde SQL’den yararlanır.
Bu yazıda iki popüler veritabanı yönetim sistemini analiz edeceğiz: PostgreSQL ve MongoDB. İlki en popüler SQL veritabanlarından biri, ikincisi ise en bilinen NoSQL veritabanıdır.
Her iki veritabanının temel özelliklerini ve güçlü yönlerini, en uygun kullanım alanlarını ve verilerinizi bu veritabanlarından birine taşımayı düşünüyorsanız hatırlamanız gereken önemli noktaları ele alacağız.
Her iki yöntemi de bizzat denemek istiyorsanız, mutlaka şu kurslarımıza göz atın: PostgreSQL Veritabanları Oluşturma ve Python ile MongoDB’ye Giriş.
Özet: PostgreSQL vs MongoDB
Doğru veritabanını seçmek her dijital uygulama için kritik önemdedir. SQL tabanlı güçlü bir ilişkisel veritabanı olan PostgreSQL, tutarlılık, karmaşık join’ler ve ACID işlemleri gerektiren yapılandırılmış veri senaryolarında öne çıkar. BSON kullanan esnek bir NoSQL belge veritabanı olan MongoDB ise dinamik, yapılandırılmamış veriyi yönetmek için idealdir ve yatay sharding ile daha yüksek ölçeklenebilirlik sunar. PostgreSQL ile MongoDB arasında seçim nihayetinde projenizin veri yapısına, ölçeklenebilirlik ihtiyaçlarına ve tutarlılık gereksinimlerine bağlıdır.
PostgreSQL ve MongoDB Veri Modeli Mimarileri
Veri modeli mimarisi açısından PostgreSQL ile MongoDB arasındaki temel farkları inceleyelim.
İlişkisel ve belge tabanlı yapılar
PostgreSQL gibi ilişkisel veritabanı yönetim sistemleri verileri tablolara göre düzenler; her tablo satır ve sütunlardan oluşur. Bu tablolar anahtarlar aracılığıyla birbirine bağlanabilir ve böylece SQL join’leri ve verimli sorgulama ile karmaşık veri ilişkileri kurulabilir.
İlişkisel veritabanı. Kaynak: DataCamp
Basitliği, benzersiz verimliliği ve güçlü tutarlılığı sayesinde ilişkisel veritabanları son on yıllarda son derece başarılı olmuş ve yaygın şekilde benimsenmiştir.
Ancak, tablo biçimine düzgünce uymayan yapılandırılmamış verilerle (ör. sosyal medya gönderileri, sensör verileri) çalışırken veya ölçeklenebilirliğin şart olduğu durumlarda —yani uygulamanızın çok sayıda sunucuya yatay olarak ölçeklenmesi gerektiğinde— en iyi seçenek olmayabilirler.
İşte burada NoSQL veritabanları devreye girer. İlişkisel muadillerinin aksine NoSQL veritabanları, sabit bir şemanın kısıtları olmadan yapılandırılmamış veya yarı yapılandırılmış veriyi işleyebilir.
Özel olarak MongoDB, belge veritabanı olarak adlandırılan bir NoSQL türüdür ve verileri BSON (Binary JSON) adı verilen bir formatı kullanarak JSON benzeri belgeler koleksiyonlarında saklar. Basitçe söylemek gerekirse belgeler, BSON’un sağladığı ek veri depolama ve işleme yetenekleriyle JSON anahtar-değer nesnelerine benzer.
MongoDB veriyi BSON olarak nasıl depolar. Kaynak: DataCamp
BSON’un esnek doğası, yapısı ve verisi anlık olarak değişebilen dinamik belge şemaları oluşturmaya imkân tanır. Bunu bir sonraki alt bölümde daha ayrıntılı göreceğiz.
Şema evrimi kalıpları
PostgreSQL gibi ilişkisel veritabanları, tablolarınızı oluşturduktan sonra değiştirilmesi zor olan sağlam şemalar sunar. Çalıştığınız verinin tablo doğasına sahip olduğu ve uygulamanıza her zaman aynı formatta geldiği durumlar için bu harika bir özelliktir. Ancak, sosyal medya gönderileri veya sensör verileri gibi, içeriği örnekten örneğe değişebilen yarı yapılandırılmış veya yapılandırılmamış verilerle uğraşıyorsanız, verinizi hazmetmek için belli bir esneklik seviyesine ihtiyaç duyabilirsiniz.
PostgreSQL’in aksine MongoDB, olağanüstü esneklik sunan şemasız tasarımlarla gelir. MongoDB’nin şemasız tasarımı verileri belgeler ve koleksiyonlar halinde organize eder:
Geleneksel ilişkisel veritabanlarında yeni bir alan eklemek tüm tablo yapısının değiştirilmesini gerektirirken, MongoDB aynı koleksiyon içindeki belgelerin tamamen farklı alanlara ve yapılara sahip olmasına izin verir. Bu, katı şemalara duyulan ihtiyacı ortadan kaldırır ve tekdüzeliği zorlamadan çeşitli verileri saklamayı kolaylaştırır.
PostgreSQL ve MongoDB Sorgulama Dilleri
Hangi veritabanını kullanırsanız kullanın —PostgreSQL veya MongoDB— veritabanlarınızla iletişim kurmak ve onları yönetmek için dili öğrenmeniz gerekir. PostgreSQL’de bu dil, son derece popüler, standartlaştırılmış ve kullanımı kolay bir programlama dili olan SQL’dir. SQL’e bizim SQL’e Giriş kursumuzla başlayabilirsiniz.
Buna karşılık MongoDB, veritabanıyla etkileşim için öncelikle kendi MongoDB Sorgulama Diline (MQL) dayanır. Ancak, MongoDB veritabanlarına bağlanmak ve etkileşim kurmak için Python, C ve Java gibi diğer popüler programlama dillerini kullanmak da mümkündür.
SQL ile MQL arasındaki temel farkları inceleyelim.
SQL ve MQL yetenekleri
PostgreSQL’in MongoDB’ye kıyasla en büyük avantajlarından biri SQL kullanmasıdır. SQL (“Structured Query Language”in kısaltması), ilişkisel veritabanları inşa etmek ve sürdürmek için temel bir dildir.
Neredeyse tüm ilişkisel veritabanı sistemleri —MySQL, SQL Server, SQLite ve elbette PostgreSQL gibi— tarafından kullanılan, basit ve alan-özel bir programlama dilidir.
SQL son derece güçlüdür; veri alma ve toplulama işlemlerinden veri temizleme ve birleştirme işlemlerine kadar her türlü veri operasyonunu yapmanıza olanak tanır. Ancak PostgreSQL söz konusu olduğunda imkânlar daha da geniştir; çünkü PostgreSQL, karmaşık analizler için şu gelişmiş yeteneklerle gelir:
Öte yandan MongoDB SQL’e dayanmasa da, güçlü sorgulama, indeksleme ve toplulaştırma yeteneklerine sahiptir; ayrıca belge veritabanlarında bilgi eklemek, güncellemek veya silmek için diğer işlevleri sunar. Dolayısıyla JSON veya Python sözlüklerine aşinaysanız, MQL söz dizimine alışmanız uzun sürmez.
MQL, belgelerin dinamik doğasını ele almak üzere özel olarak tasarlanmıştır. Sonuç olarak SQL’e kıyasla çok daha esnek bir dildir. Ayrıca, belgeler başka belgeleri gömebildiğinden MongoDB’de ilişkisel veritabanlarında sıklıkla gerekli olan karmaşık ve verimsiz join işlemlerine ihtiyaç yoktur.
İndeksleme stratejileri
İndeksler, veri alma işlemlerinin hızını artıran veritabanı nesneleridir. Tablodaki satırları hızla bulmak için işaretçi görevi görürler ve sorgu performansını artırırlar.
PostgreSQL güçlü indeksleme yetenekleriyle gelir ve şu indeks türleri de dâhil olmak üzere birden çoğunu destekler:
MongoDB de bir koleksiyondaki tüm belgeleri taramadan belgeleri bulmak için indekslemeyi destekler. Ancak yetenekleri sınırlıdır; PostgreSQL gibi ilişkisel veritabanlarında bulunan çeşitlilik ve sofistike indeksleme düzeyine sahip değildir. Şunları içerir:
SQL ve NoSQL veritabanlarınızda indeks kullanmak, özellikle büyük veri kümelerinde performansı artırmak ve sorgu sürelerini azaltmak için anahtardır.
Ancak bir indeks eklemenin yazma işlemleri için olumsuz bir performans etkisi olabileceğini unutmayın. Yüksek yazma/okuma oranına sahip tablolar veya koleksiyonlar için indeksler maliyetlidir; çünkü her ekleme, ilgili indekslerin de güncellenmesini gerektirir.
MongoDB ve PostgreSQL’de Performans ve Ölçeklenebilirlik
MongoDB ve PostgreSQL harika veritabanı araçlarıdır; ancak yalnızca özelliklerine bakarak birini diğerine tercih etmenin anlamı yoktur. Bunun yerine, her zaman kullanım senaryonuzun özelliklerini dikkate alarak seçiminizi yapmalısınız. Bunu akılda tutarak MongoDB ve PostgreSQL’in performans ve ölçeklenebilirlik farklarını inceleyelim.
İşlem (transaction) işleme
Diğer popüler ilişkisel veritabanı sistemleri gibi PostgreSQL de güçlü tür sistemi ve ACID (Atomicity, Consistency, Isolation, Durability) işlemlerine desteği sayesinde yüksek düzeyde veri bütünlüğü ve kalitesi sağlar.
ACID işlemleri veritabanı işlemlerinin güvenilir biçimde işlenmesini garanti eden bir özellikler kümesidir. Hatalar, çökmeler veya eşzamanlı erişim durumlarında dahi verinin doğru ve güvenli kalmasını sağlarlar. Bu özellikler, her projede veri kalitesini korumak için hayati önem taşır.
ACID işlemleri uzun süredir ilişkisel veritabanlarında veri bütünlüğünü sağlamanın altın standardı olmasına karşın, MongoDB gibi NoSQL veritabanları çoğunlukla katı işlem tutarlılığı yerine esneklik ve ölçeklenebilirliği önceler. Bu da ilişkisel veritabanlarında bulunan bazı ACID özelliklerinin gevşetilmesiyle sonuçlanır.
Örneğin bazı MongoDB kurulumları, anlık tutarlılık yerine sonuçta tutarlılığı (eventual consistency) önceler; yani değişiklikler tüm düğümlere anında yansımayabilir. Tutarlılık, erişilebilirlik ve performans arasındaki bu ödünleşim, daha iyi performans ve ölçeklenebilirlik sağlar; ancak veriye sıkı tutarlılıkla dayanan uygulamaları tasarlarken dikkatli olunmasını gerektirir.
Ölçeklenebilirlik kalıpları
Ölçekleme, veri hacmi ve trafikteki artışları karşılamak için çeşitli tekniklerin kullanılmasını içerir. Basitçe söylemek gerekirse bunu dikey ölçekleme ve yatay ölçekleme ile yapabiliriz. İlki, artan yükü karşılamak için aynı sunucunun iyileştirilmesini ve kaynak eklenmesini içerir. İkincisi ise kapasiteyi artırmak üzere dağıtık bir sisteme daha fazla sunucu veya düğüm ekleyerek gerçekleştirilir.
PostgreSQL kapasite artırımı için öncelikle dikey ölçeklemeye dayanır. Ancak diğer popüler SQL veritabanlarının aksine, PostgreSQL bölümlendirme (partitioning) yoluyla yatay ölçeklemeye de izin verir; yine de karmaşık yapılandırmalar gerektirir. PostgreSQL’de bölümlendirmenin tüm teknik detaylarını bizim PostgreSQL’de Sorgu Performansını Artırma kursumuzda öğrenebilirsiniz.
Buna karşılık MongoDB gibi NoSQL sistemlerinde artan veri trafiği ve hacmini yönetmek için başvurulan strateji yatay ölçeklemedir. MongoDB, bir veritabanını “shard” adı verilen daha küçük ve yönetilebilir parçalara bölüp bunları birden çok sunucuya dağıtmayı içeren sharding tekniğinden yararlanacak şekilde tasarlanmıştır; bu da sisteme büyük veri kümelerini ve yüksek trafik hacimlerini yönetme olana yönetme olanağı verir.
Bu popüler ölçekleme teknikleri hakkında her şeyi öğrenmek için Sharding vs Partitioning makalemize göz atın.
MongoDB ve PostgreSQL: Kullanım Senaryosu Analizi
Artık PostgreSQL ve MongoDB’nin temel özelliklerini ve güçlü yanlarını bildiğimize göre, en yararlı oldukları senaryoları analiz etme zamanı.
PostgreSQL için ideal senaryolar
Projeniz şu gereksinimlere sahip olacaksa PostgreSQL harika bir seçimdir:
Bazı çarpıcı örnekler vermek gerekirse PostgreSQL şu durumlar için isabetli bir fikirdir:
En uygun MongoDB uygulamaları
MongoDB, veri yapılarının yeni bilgi ve şemalara dinamik olarak uyum sağlamasının yararlı olduğu, ölçeklenebilirlik ve performansın önemli olduğu ve yapılandırılmamış verilerin söz konusu olduğu durumlarda en iyi şekilde çalışır. MongoDB’nin şemasız tasarımı ve yatay ölçekleme ile birleşimi, şu kullanım alanları için harikadır:
Hibrit mimariler
Çeşitli veri gereksinimleri için kapsamlı bir çözüm elde etmek üzere MongoDB ve PostgreSQL’in güçlü yönlerini birleştirmeniz gereken kullanım durumları olabilir. SQL ve NoSQL veritabanlarını birleştiren hibrit mimariler oluşturmak mümkündür ve işlemlerinizde güçlü tutarlılığı belli bir esneklikle birleştirmeniz gerekiyorsa harika bir fikirdir.
Örneğin, gerçek zamanlı analitikte hızlı yazmalar için MongoDB’yi kullanırken, karmaşık ilişkisel işlemler ve yapılandırılmış veriyi depolamak için PostgreSQL’den yararlanabilirsiniz. Ancak her iki veritabanının işlevlerini “birleştirmenin” şu an için bir yolu yoktur. Sadece aynı anda iki farklı veritabanı kullanıyor olursunuz; bu da sisteminizin karmaşıklığını artırır ve uygulamadan önce dikkatli analiz gerektirir.
Geçiş (Migrasyon) Hususları
Verileri MongoDB’den PostgreSQL’e veya tam tersi yöne taşımayı planlıyorsanız birkaç unsuru göz önünde bulundurmanız gerekir:
Veritabanı şemaları
MongoDB’den PostgreSQL’e geçiyorsanız, veri taşımadan önce önceden tanımlı bir şemaya sahip bir tablo veya birden çok tablo oluşturmanız gerekir; yani atanmış veri türleri ve olası kısıtları olan sütunlar listesi. Verinizi Mongo’ya taşımak istiyorsanız, verinin belgelere nasıl yerleştirileceğini tanımlamanız gerekir. Belgelerin esnek doğasına rağmen, mevcut veriyi konumlandırmak için bir miktar veri modelleme şart olacaktır.
Olası veri dönüşümleri
Dışa aktarmak istediğiniz veriler istenen formatta olmayabilir. Böyle bir durumda, taşımadan önce veriyi PostgreSQL veya MongoDB veritabanına eklemeden önce doğru formata dönüştürmek için bir tür veri hattı kurmanız gerekir.
Veri nasıl taşınır
Bir geçiş süreci yapmanın birden çok yolu vardır. Temel dışa aktarma/içe aktarma adımları için manuel yapabilirsiniz; ancak özellikle taşımak istediğiniz veritabanı çok veri içeriyorsa zaman alıcı, karmaşık ve hataya açık bir süreç olabilir. Bu nedenle işi yapmak için bir ELT seçmek daha iyi bir çözüm olabilir. PostgreSQL’den Mondo’ya ve tam tersine geçiş için pek çok mevcut çözüm vardır.
Performans optimizasyonu
Geçiş sırasında performansı artırmaya yönelik teknikleri dikkate almak, özellikle karmaşık geçiş süreçlerinde kritik önemdedir. Yine, kaynağa ve hedefe bağlı olarak PostgreSQL ve MongoDB, süreci hızlandırmak için bağlantı havuzu (connection pooling), bölümlendirme (partitioning), shard anahtarı seçimi ve kapsanan sorgular (covered queries) gibi özel teknik ve stratejiler sunar.
Güvenlik ve Uyum
Veritabanı dağıtımınızı korumak, veri bütünlüğünü, erişilebilirliğini ve uyumu sağlamak için kritiktir. Hem MongoDB hem de PostgreSQL veritabanlarınızı güvenceye almak için çeşitli yöntemler sunar. Bu bölümde en yaygın tekniklerden bazılarını ele alıyoruz.
Kimlik doğrulama mekanizmaları
PostgreSQL, roller aracılığıyla etkin biçimde yönetilebilen bir dizi kimlik doğrulama yöntemiyle gelir. Roller, veritabanı nesnelerinin sahibi olabilen ve veritabanı ayrıcalıklarına sahip varlıklardır. Roller kimlik doğrulama, izin yönetimi ve kullanıcı erişim seviyelerini tanımlamak için kullanılabilir. PostgreSQL’de bir rol, bir kullanıcı veya bir kullanıcı grubu olarak işlev görebilir.
Yetkisiz erişimi önlemek için MongoDB’de de roller oluşturabilirsiniz. Rol tabanlı kontrol, güvenlik risklerini en aza indirmek için asgari ayrıcalık ilkesini izler. MongoDB, güvenli parola tabanlı kimlik doğrulama için varsayılan mekanizma olan Salted Challenge Response Authentication Mechanism (SCRAM) dâhil olmak üzere çeşitli kimlik doğrulama mekanizmalarıyla gelir.
Şifreleme uygulamaları
MongoDB, verilerinizi güvenceye almak için şu seçenekler de dâhil olmak üzere oldukça fazla sayıda şifreleme uygulaması sunar:
PostgreSQL ise çeşitli düzeylerde şifreleme sunar ve verileri veritabanı sunucusunun çalınması, kötü niyetli yöneticiler ve güvensiz ağlar nedeniyle ifşa olmaktan korumada esneklik sağlar. Bazı seçenekler şunlardır:
Topluluk ve Ekosistem
Hem MongoDB hem de PostgreSQL son derece popüler araçlardır; büyüyen kullanıcı toplulukları ve gelişen ekosistemleri vardır. Gelin bunlara bakalım.
Eklenti/uzantı yetenekleri
PostgreSQL uzantıları, veritabanının yeteneklerini genişleten eklenti modülleridir. Python veya R’deki paketlere benzerler. Son yıllarda, PostgreSQL’in potansiyelini her türlü senaryo, disiplin ve kullanım alanında artırmak için zengin bir uzantı ekosistemi ortaya çıktı. Çoğu PostgreSQL Extension Network üzerinde bulunabilir.
Buna karşılık MongoDB daha sınırlı bir uzantı setiyle gelir ve çoğunlukla MongoDB’nin Visual Studio Code gibi IDE’ler ve Google Cloud gibi bulut sistemleriyle kullanılmasını etkinleştirmeyle sınırlıdır. Ancak, MongoDB’yi yönetmek için kullandığınız farklı programlama dilleri için başka üçüncü taraf paketler bulunabilir.
Benimsenme eğilimleri
Her iki araç da altın çağını yaşıyor; DB-Engines verilerine dayanan veritabanı motoru eğilimlerini gösteren aşağıdaki görselde olduğu gibi.
Kaynak: db-engines
İlişkisel veritabanı yönetim sistemleri hâlâ baskın olsa da (4. sırada yer alan PostgreSQL dâhil), grafik son yıllarda NoSQL veritabanlarında —MongoDB ve Redis gibi— kayda değer bir yükselişi de ortaya koyuyor. Bu yükseliş, yapılandırılmamış veriyi yönetmek ve yüksek trafikli uygulamaları barındırmak için bu esnek ve ölçeklenebilir çözümlerin artan şekilde benimsendiğini yansıtıyor.
PostgreSQL ve MongoDB Karşılaştırma Tablosu
İşte MongoDB veritabanları ile PostgreSQL arasındaki farkları özetleyen güzel bir tablo:
Özellik
MongoDB
PostgreSQL
Veri Yapısı
Verileri belgeler (ör. JSON, BSON) olarak saklar; esnek, hiyerarşik yapılara izin verir.
Verileri önceden tanımlı bir şemayı izleyerek satır ve sütunlara sahip tablolarda saklar.
Şema Esnekliği
Şemasız: Belgeler farklı yapılar, alanlar ve veri tiplerine sahip olabilir.
Sabit şema: Belirli sütunlar ve veri türleriyle önceden tanımlı bir şema gerektirir.
Sorgu Dili
Nesne tabanlı ve daha esnek olan MongoDB Sorgulama Dili’ni (MQL) veya benzerini kullanır.
Yapılandırılmış veriyi sorgulamak için SQL (Structured Query Language) kullanır.
Join’ler
İlişkili veriyi belgelerin içine gömerek (denormalizasyon) join’lerden kaçınır.
Tablolar arasında karmaşık join’leri (normalizasyon) destekler.
Performans
Yapılandırılmamış veya yarı yapılandırılmış veri için okuma ve yazmalarda daha hızlıdır. Join’lerin getirdiği yükten kaçınır.
Yapılandırılmış veri için güçlü performans; ancak join’ler sorguları yavaşlatabilir.
Ölçeklenebilirlik
Yatay ölçeklenebilir: Sharding kullanarak veriyi birden çok sunucuya dağıtabilir.
Genellikle dikey ölçeklenebilir: Daha güçlü donanıma dayanır; bazıları yatay ölçeklemeyi destekler (ör. bölümlendirme ile).
İşlem Desteği
(MongoDB 4.0 ve üstünden itibaren) çok belgeli ACID işlemlerini destekler; ancak başlangıçta işlemsel olmayan operasyonlar için tasarlanmıştır.
Güçlü tutarlılık ve güvenilirlik sağlayan, ACID uyumlu işlemler için tam destek.
Kullanım Alanları
Kullanıcı profilleri, günlükler, kataloglar ve esnek veri yapıları gibi yapılandırılmamış veya yarı yapılandırılmış veriler için en iyisidir.
Finansal kayıtlar veya kurumsal kaynak planlama (ERP) gibi net ilişkileri olan yapılandırılmış veriler için idealdir.
Veri İlişkileri
Gömülü veriyi (denormalizasyon) destekler; bu da ilişkili bilgiyi tek sorguda getirmeyi kolaylaştırır.
İlişkisel veritabanları, tablolar arası ilişkileri kurmak için yabancı anahtarlara dayanır (normalizasyon).
İndeksleme
İndekslemeyi destekler; ancak ilişkisel veritabanlarında mevcut çeşitlilik ve incelik düzeyinden yoksundur.
Daha iyi performans optimizasyonu için birden çok indeks türünü (ör. B-tree, hash) destekleyen güçlü indeksleme yetenekleri.
Tutarlılık
Dağıtık kurulumlarda sonuçta tutarlılık sağlar; ancak gerektiğinde (ACID işlemleriyle) güçlü tutarlılık da sunar.
ACID işlemleri ve ilişkisel bütünlük nedeniyle çoğu durumda güçlü tutarlılık sağlar.
Veri Hacmini Ölçekleme
Sunucu ekleyerek (sharding) büyük miktarda veriye kolayca ölçeklenir.
Dikey olarak ölçeklenebilir; ancak yatay ölçekleme (ör. bölümlendirme) daha karmaşık yapılandırma gerektirir.
Veri Bütünlüğü
Veri bütünlüğü her belgenin içinde yönetilir; ancak belgeler arası ilişkileri yönetmek daha zorlu olabilir.
Birincil ve yabancı anahtarlar ile UNIQUE ve NOT NULL gibi kısıtlar aracılığıyla veri bütünlüğü için güçlü yerleşik destek.
Geliştirici Dostluğu
Geliştirici dostu: Esnek veri modelleme; modern uygulamalarla (ör. JSON, REST API’ler) iyi çalışır.
Katı veri modelleme; ancak SQL ve yapılandırılmış veriye aşina geliştiriciler tarafından iyi anlaşılır.
Sonuç
MongoDB ve PostgreSQL, mevcut en popüler veritabanları arasındadır. SQL ve NoSQL veritabanlarına harika örneklerdir ve onları karşılaştırarak bu veritabanlarının farkları, güçlü yönleri ve yararlı olabilecek farklı kullanım alanları hakkında fikir edinebiliriz.
SQL ve NoSQL veritabanları hakkında öğrenilecek çok şey var. DataCamp olarak, sizi en kapsamlı ve güncel kurslar ve eğitimlerle desteklemek istiyoruz. Bazı özel veritabanı içeriklerimize buradan göz atın: