Ne zaman MongoDB kullanmalıyız?


17

MongoDB, kullanımı oldukça kolay bulduğum bir NoSQL veritabanı. Son zamanlarda, HTTP isteklerini kullanarak bazı verileri toplamak ve verileri işledikten sonra bazı sonuçları depolamak için gereken basit bir uygulama geliştirmek zorunda kaldım ve MongoDB'yi kullanmayı denedim.

Bu deneyimlerden, geleneksel ilişkisel veritabanlarından çok daha hoş buldum ve bir DBA değil, bir geliştirici olduğum için çalışmam büyük ölçüde basitleştirildi.

Yine de, bazen SQL Server veya MySQL gibi geleneksel ilişkisel veritabanı yerine MongoDB'yi ne zaman kullanmam gerektiğinden emin değilim.

Bu durumda, ilişkisel veritabanları yerine MongoDB'yi ne zaman kullanabiliriz? Bazı karman var mı büyük bazı durumlar için uygunsuz hale getirir hakkında MongoDB ikaz?


8
Referans bütünlüğü (verilerin bozulmamasını garanti etmek için) gibi önemsiz küçük ayrıntılar umursadığınız zaman MongoDB'yi kullanın (verilerin gerçekte düşündüğünü gerçekten içerdiğinden emin olmak için) tutarlılık (verilerin eklediğiniz aslında kaydedilir ) veya veri kümenize önemsiz olmayan sorgu yazma yeteneği (böylece verilerle faydalı ve yaratıcı şeyler yapabilirsiniz.)
Mason Wheeler


2
@MasonWheeler Kabul etti. Bu bağlamda, "basit ve kullanımı güzel", "hata yazarken ve verileri
Andres F.

Yanıtlar:


17

Temelde:

  • Verilerinizi bir grup belge şeklinde temsil edebiliyorsanız, MongoDB iyi bir seçim olabilir.

  • Verilerinizi birbirine bağlı tablolar olarak hayal etmeyi tercih ediyorsanız, MongoDB iyi bir seçim olmayabilir.

İşte açıklayıcı bulduğum iki örnek:

  • Birkaç yıl önce bir blog motoru oluşturdum. Amacı, blog makalelerini barındırmak ve her makale için farklı sürümleri, bazı meta verileri, ziyaret istatistiklerini vb.

    Bu bir grup tablo olarak saklanabilir, ancak bir model oluşturmaya çalışırken, daha fazla değilse, bir düzine tabloya çok hızlı büyür. Bazı SQL sorguları çok joins ile çirkin olabilir ve ... iyi, resim olsun.

    Buradaki sorun, merkezi bir şey - bir blog makalesi - ve makalenin etrafında, belge tabanlı bir veritabanı için çok uygun hale getiren tüm bu şeylerin olmasıdır. MongoDB ile veritabanını modellemek son derece kolaydı: bir koleksiyon blog makalelerini tutar ve ikinci bir küçük koleksiyon makale yazmasına izin verilen kullanıcıların listesini içerir. İlk koleksiyondaki her belge, bir makaleyi görüntülerken ihtiyacım olan tüm bilgileri içerecektir, yazarın adı veya etiketler olurdu.

  • Şimdi çok farklı bir proje hayal edin. Bir şeyler yazabilen ve diğer kullanıcılar tarafından yazılanları paylaşabilen bazı kullanıcılar var. Bir kullanıcının sayfasında, bu kullanıcının yazdığı ve paylaştığı şeyleri bulmayı beklersiniz. Bir kısıtlama vardır: Birisi geçmişte yazdıklarını düzenlediğinde, değişiklik orijinal metnin paylaşıldığı her yerde görünür.

    Belge tabanlı bir yaklaşımla, belgenin ne olacağını bulmak zordur. Bir kullanıcı belki? Bu iyi bir başlangıç. Bir kullanıcı belgesi, bu kullanıcının yazdığı her şeyi içerir. Peki paylaştığı şeylere ne oldu?

    Olası bir yol, bunları aynı belgeye koymaktır. Bu yaklaşımla ilgili sorun, eğer birisi bir girişi düzenlerse, uygulamanın eski girişin her oluşumunu düzenlemek için veritabanındaki her kullanıcı belgesini gözden geçirmesi gerektiğidir. Veri tekrarı sayılmıyor.

    Bir alternatif, kullanıcı belgesinde yalnızca bu kullanıcının paylaştığı girişlerin listesini (yönlendirilen kullanıcının kimliği ve giriş ile birlikte) tutmak olabilir. Ancak şimdi farklı bir sorun ortaya çıkacaktır: bir kullanıcı binlerce kullanıcıdan binlerce giriş paylaştıysa, bu girişleri almak için binlerce belge açmanız gerekir.

    Ya da koleksiyonumuzu girişlerin kendileri etrafında modelleyebiliriz, her giriş yazarına atıfta bulunur ve onu paylaşan kullanıcıların bir listesine sahiptir. Burada yine, belirli bir kullanıcı tarafından yayınlanan belgeleri göstermek için tüm belgeleri gözden geçirmeniz gerektiğinde performans sorunları fark edilebilir hale gelebilir.

    İlişkisel bir veritabanı kullanıyorsanız şimdi ne kadar tabloya ihtiyacınız var? Doğru, üç. Modellenmesi kolay ve kullanımı da kolay olacaktır.


Bu cevabın şu anda bir güncellemeye ihtiyacı var MongoDB, 4.0 sürümü ACID'yi
Carmine

@Carmine: Güncel bir cevap verecek kadar bilgim yok. Lütfen (1) sizinkini aşağıda bir cevap olarak gönderebilir misiniz ve (2) bir kez bunu yaptığınızda buraya yorum ekleyebilir misiniz, bu yüzden MongoDB 4'ten başlayarak geçerli olmadığını söyleyerek cevabınıza bir bağlantı ile bir feragatname ekleyebilir miyim?
Arseni Mourzenko

9

Her teknolojinin avantajları vardır.

İlişkisel veritabanlarının avantajları, RDBMS'nin sizin için bazı şeyler yapmasıdır:

  • Referans bütünlüğünü zorunlu kılma (ait olduğu fatura mevcut değilse fatura ayrıntısının eklenmesine izin vermeme)
  • Fazlalıktan kaçının: işler sadece bir kez saklanır.
  • Karmaşık sorgular, olgun, zamanla kanıtlanmış ve yaygın olarak kullanılan bir bildirim dili (SQL) ile yapılabilir.

Tüm bunlar , RDBMS sizin için bir şeyler uyguladığından daha az kod yazmanız gerektiğine dayanır .

Ek olarak, veri bağımsızlığı: çoğu zaman standart SQL yapıları kullanırsanız ve satıcıya özgü yapıları yoksa, verilerinizi bir RDBMS'den diğerine en az güçlükle geçirebilirsiniz, oysa NOSQL veritabanları hiç standartlaştırılmamıştır.

Öte yandan, NOSQL veritabanlarının avantajlarından biri, milyonlarca satır için daha iyi bir koruma performansı sağlamalarıdır. Belge tabanlı depolama, yani yapılandırılmamış veriler için daha uygundur. Ancak çoğu uygulamanın bu özelliklere ihtiyacı yoktur.


5
MongoDB eksik işlemleri büyük bir dezavantajdır. Her zaman ırk koşulları için endişelenmek, kıçta böyle bir acıdır.
CodesInChaos

1
Not: MongoDB artık ASİT işlemlerini desteklemektedir.
Milan Velebit

5

Sizin durumunuz için, MongoDB iyi bir seçim gibi geliyor, ancak en iyi seçim olmayacağı birçok senaryo (muhtemelen çoğu) var.

MongoDB daha çağrı / okuma yazma o senaryolarda uygun olan bir çok işlem güvenliği çok vurgu olmadan, verinin (bazı veriler bazen bir sunucu kazasında kaybolması durumunda, bu büyük bir anlaşma değil), 'ölçek Big bekliyoruz ve don Gerçekten istikrarlı bir şemamız yok.

MongoDB, aşağıdakileri gerektiren senaryolar için uygun değildir :

  1. Güçlü ASİT garantileri: MongoDB, yinelenen verilerin saklanmasına, tutarsız okumalara ve hatta veri kaybına izin verir. Bunlar bazı uygulamalarda iyidir, ancak çoğunda iyi değildir.
  2. Çok Nesneli İşlemler: MongoDB, yalnızca tek bir nesne / belge için ASİT işlemlerini destekler. Bu, banka havaleleri, rezervasyon vb. Gibi daha karmaşık işlemler için kesilmez.
  3. Geleneksel BI: Orada sadece geleneksel SQL ile iyi oynayan birçok BI aracı var.
  4. SQL: MongoDB'nin çok spesifik bir sorgu dili vardır, ancak SQL birçok insan tarafından çok iyi bilinir (dikkate alınması gereken önemli bir husus olabilir), birçok karmaşık şey yapabilir (MongoDB ile basit bir performans ve birçok uygulama arasında aktarılabilir).

MongoDB daha hızlıdır ve bütünlük kontrolleri gibi RDBMS'nin varsayılan olarak uyguladığı birçok şeyi ortadan kaldırarak sistemden daha fazla performans eklemenize izin verir (yine de RDBMS'yi bu amaçlar için de ayarlayabilirsiniz), ancak gerçek şu ki, çoğu senaryoda, buna gerek yoktur. Ayrıca, değişim güvenilirlik ve esnekliktir (daha sonra mevcut verilerle daha karmaşık işlemler yapmanız gerektiğine karar verirseniz sorun yaşarsınız).

Her şey inşa ettiğiniz uygulamanın ihtiyaçlarına bağlıdır. Hız ve kullanılabilirlik mi yoksa güvenlik, güvenilirlik ve esneklik mi? Verilerinizde (ve verilerinizin bağlantılarında) nerede daha fazla değer bulunduğunu bilmelisiniz. Henüz bilmiyorsanız, gelecekte sizi bir köşeye boyamayacak bir şey seçmeniz ve özellikleri eklemenize ve uygulamanızın gerektirdiği işlemleri gerçekleştirmenize izin vermesi muhtemelen en iyisidir.


3

MongoDB, verilerinizi bağımsız bilgi paketleri olarak sunabildiğinizde mükemmeldir. Google Haritalar posta kodları var, posta koduna gömülü şirketler ve şirketlerin içinde çalışanlar var. Tüm posta kodları birbirinden bağımsızdır ve tüm bilgileri basit, güzel ve hızlı bir şekilde alabilirsiniz. Bu, SQL dışı bir çözüm için iyi bir senaryodur.

Bir kez söyledim, ben tamamen mevcut trendi katılmıyorum MongoDB RDBMS için bir tür yazı ve üstün bir çözüm olduğunu ve noSQL varsayılan olarak çözüm olması gerektiğini ima arıyorum. Bütün bunlar saçma. MongoDB bir niş veritabanı ve projelerin% 90'ı ilişkisel ve raporlarınızı oluşturmak ve dağıtmak veri aramak için SQL gibi güçlü bir sorgu çözümü istiyorum çünkü bir RDBMS seçeneği gerekir: "katıldı" bir profesyonel, bir con değil. Ayrıca, modern RDBMS, BSON koleksiyonlarını ve jeo-uzamsal entegrasyonu desteklemektedir, bu nedenle belki noSQL için niş artık daha da dardır.


2

MongoDB, bir web sayfasının belirli bir örneğini oluşturmak için gereken tüm yapılandırılmış verileri depolamak için kullanışlıdır. Belirli bir sayfanın verilerini alabilir, daha sonra işleyebilecek istemci uygulamanıza iletebilirsiniz.

Böyle bir bağlamda, MongoDB çok hızlı ve güvenilirdir. Ancak veritabanınızda ilişkisel bilgilerinizin olmadığını asla unutmayın. Bu, web sayfanızın yapısında bir şeyi değiştirirseniz, zaten depolanmış sayfalarınızdaki delikleri dolduramayabileceğiniz anlamına gelir, çünkü bunu yapmak için gerekli verilere sahip değilsiniz. Burada daha fazlası: http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.