Birisi ne zaman MongoDB (veya benzerini) İlişkisel Bir DBMS üzerinden kullanır?


134

NoSQL meselesi hakkında kafam biraz karıştı. MongoDB gibi bir şeyi Oracle veya MySQL gibi bir şey için ne zaman kullanmayı tercih edersiniz? Kullanım aralarında gittiği sürece "farkı" gerçekten anlamıyorum.

Anladığım kadarıyla NoSQL tipi veritabanları RDBMS'lerin yerine geçme amaçlı değil, tam olarak ne yapmaları gerekiyor?


Ne okuyorsun? Bizim için alıntılar veya bağlantılar veya bazı arka plan sağlayabilir misiniz? Ne kadar bildiğini bilmiyoruz - ya da bilmiyoruz.
S.Lott

3
Buraya taşınmadan / sürece , StackOverflow'ta MongoDB veya diğer belge odaklı veritabanı sistemlerinin ne zaman kullanılacağı dahil olmak üzere çok benzer sorular var.
Nicole

1
Web ölçeğinde mongodb-is-web-scale.com / s
Froome

3
Sinirsel: Çünkü bu bir yutturmaca kelime ve birçok insan hileleri takip etmekten hoşlanıyor.
Sjoerd

@Pace: Ben yenmek zor olacak düşünüyorum bu yazıyı .
Robert Harvey,

Yanıtlar:


34

CouchDB'yi daha önce üç evcil hayvan projesi için kullandım.

  • Bir mikro blog sistemi.
  • Yaptığım uygulama alarak küçük bir not için bilgi kaydetmek için.
  • Genel amaçlı bir beyin fırtınası uygulaması.

Bunu MSSQL veya MySQL gibi bir şey için seçmemin ana nedeni, kullanırken elde ettiğiniz esnekliktir. Sert bir şema yok. Çizginin üç ay aşağısında, fazladan bir alana sahip olmak için belirli bir masaya ihtiyacınız varsa ve bu ve bu, onu değiştirirsiniz ve oradan dışarıya doğru fırlar.

Nasıl kullanılacağını öğrenmek için Apress by Beginning CouchDB kullandım.

Örneğin, CouchDB, veritabanına / veritabanından iletişim kurmak için json kullanır. Diliniz veri POST yapabiliyorsa, DB ile iletişim kurmak için onu kullanabilirsiniz.

Ayrıca şunu okuyun: İlişkisel veritabanı yerine neden belge tabanlı veritabanı kullanmalıyım? StackOverflow üzerinde


31
İlk iki örneğiniz geleneksel bir İlişkisel Veri Yönetim Sistemi için iyi bir etki alanı gibi görünüyor.
Jonas

4
@yati: Bu tür bir uygulama StackOverflow.com'a benziyor ve bunun geleneksel bir ilişkisel veritabanıyla çok iyi çalıştığını düşünüyorum.
Jonas

4
@yatisagade: Dinamik sosyal sitelerden bahsetmiyoruz. Ama uygulama ve bir mikro bloglama sistemi alarak küçük bir not .
Jonas

2
Tanımlanmış bir şemaya artı almak nasıl mümkün değildir? İlişkisel bir DB ile satırın üç ay aşağısında fazladan bir alana ihtiyacınız varsa, sadece alanı eklersiniz. İlişkisel bir DB ile dinamik olarak bir alan ekleyemezsiniz, ancak dinamik olarak eklenen bir alanla çalışmak için uygulama kodunuzu dinamik olarak değiştiremezsiniz.
Solomonoff'un Sırrı,

12
Bu cevap ilişkisel bir veritabanının şemasının değiştirilemediğini gösteriyor gibi görünmektedir. Birinin buna inanmasına neden olabilecek ne kadar yanlış anlama olduğunu anlayamıyorum. İlişkisel bir veritabanına yeni bir sütun eklemek çok önemlidir. Genelde hoş bir kullanıcı arayüzü vardır veya komut dosyasıyla yazmayı tercih ederseniz, tek bir SQL ifadesinde yapılabilir.
JacquesB

24

Başka bir cevap eklediğim için üzgünüm ama cevapların hiçbiri tatmin edici değil. Bu cevap, MongoDB'ye özgüdür (orada ilişkisel veritabanları olmayan çok sayıda diğer veri depolama seçeneği dizisinin aksine).

Artıları:

  • MongoDB'nin sorgu başına daha düşük gecikme süresi vardır ve sorgu başına daha az CPU zamanı harcar, çünkü çok daha az iş yapar (örneğin birleşme, işlem yok). Sonuç olarak, saniye başına sorgulama açısından daha yüksek bir yükü kaldırabilir ve bu nedenle sık sayıda kullanıcı varsa sık sık kullanılır.
  • MongoDB'nin parçalanması kolaydır (bir kümede kullanım) çünkü işlemler ve tutarlılık konusunda endişelenmenize gerek yoktur.
  • MongoDB'nin yazma hızı daha hızlıdır, çünkü işlemler veya geri dönüşler konusunda endişelenmenize gerek yoktur (ve böylece kilitleme konusunda endişelenmenize gerek yoktur).
  • MongoDB , bundan faydalanabilecek özel bir kullanım durumunuz olması durumunda şemaya sahip değildir .

Eksileri:

  • MongoDB işlemleri desteklemiyor . Bu, faydalarının çoğunu böyle elde eder.
  • Genel olarak, MongoDB müşteri sunucusu için daha fazla iş (örneğin daha fazla CPU maliyeti) yaratır . Örneğin, verilere katılmak için, birden çok sorgu yayınlamak ve istemcide birleştirmek gerekir.
  • 2017 yılında bile , MongoDB için, daha yeni olduğu için ilişkisel veritabanlarına göre daha az takım desteği var. Ayrıca ilişkisel meslektaşlarından daha az MongoDB uzmanı var .

Sıklıkla Yanlış Anlaşılan Puanlar:

  • Hem MongoDB hem de ilişkisel veritabanları endekslemeyi destekler. Sorgu performansları, büyük sorguların yürütülmesi açısından benzerdir .
  • MongoDB, şemalarınız geliştikçe mevcut verilerinizi güncelleyerek geçiş gereksinimini veya daha spesifik olarak ortadan kaldırmaz . Örneğin: Belirli verileri içeren bir kullanıcı tablosuna dayanan bir uygulamanız varsa ve bu tabloyu farklı veriler içerecek şekilde değiştirirseniz (diyelim ki, bir profil resmi alanı eklediğinizi varsayalım),
    • Bu özelliğin tanımsız olduğu nesneleri işlemek için size başvuru yazın VEYA
    • Bu özellik için varsayılan bir değer koymak üzere bir kerelik geçiş yazın VEYA
    • Bu alan mevcut değilse, sorgu zamanında varsayılan bir değer sağlamak için kod yazın VEYA
    • Eksik alanı başka bir şekilde ele al

2
Çok fazla şey eklerdim, bu bir şekilde birçok NoSQL ve RDBMS tartışmasında cevapsızdır: NoSQL veritabanları geçici sorgulama için çok daha zordur (bu "SQL yok" dır. Bu bir geliştirici olup olmadığınız doğrudur. Ayrıca , ciddi bir iş için çok önemli olan raporlar oluşturmak için çok daha zordur
Michael

Heh, veri tabanlarımla bu tür bir etkileşimi engellediğim için MongoDB için neredeyse bir özellik diyebilirim. Bununla birlikte, Mongo'nun geçici bir sorgu dili ve grafiksel geçici bir istemcisi (Pusula) var. SQL kadar zengin özelliklere sahip olmadığı için potansiyel bir eksiklik olduğuna katılıyorum, ancak şahsen benim için hangi veritabanının kullanılacağına karar verdiğimde asla bir fark yaratmayacak.
Pace

1
Veritabanınızdaki verileri araştırmayı neden istemezsiniz? Bu veritabanının işletme için faydalı bir bilgisi varsa, mümkün olduğu kadar erişilebilir olması gerekir. Açıkçası, üretime yük eklememekle birlikte, bunun için kopyalarını okudunuz.
Michael,

Bu muhtemelen kendi başına ilginç bir sorudur ve birçok insanın farklı bakış açılarına sahip olacağını hayal ediyorum. Şahsen bunu önlüyorum çünkü bu bir bakım sorunu haline geliyor. Web uygulamaları oluşturuyorum ve performansı korumak ve optimize etmek için taahhüt ettiğim REST API'lerini sergiliyorum. Çok fazla satış mühendisinin sorgu komut dosyasını kıracağı için veritabanında toptan değişiklikler yapamadığım durumlarda bulundum ve şimdi bu senaryodan kaçınmaya çalışıyorum. Örneğin, kısa süre önce yüksek performans için PostgreSQL'den Cassandra'ya db'nin bir parçası oldum ve API'mı değiştirmek zorunda değildim.
Pace

Sonunda verilere bakmakla her zaman ilgilenen paydaşlarınız olacaktır. Bir SQL sorgusu ya da bir tür ipython notebook betiği ile mi yoksa re: dash yoluyla mı olduğu. Bu yüzden veritabanı değişiklikleri yaptığınızda, daima bu bağımlılıkları bozmamaya dikkat etmeniz gerekecektir. SQL (RDBMS değil) verileri daha erişilebilir hale getirir ve bunun için bir işletme için iyi bir şeydir.
Michael,

13

Utanmadan Renesis'ten çalmak için (aslında bu cevabı CW yapıyorum):


Diğer türlerin yerine RDBMS'lerin kullanılması:


4
"RDBMS'ler performans için endekslemeyi yoğun kullanıyor" MongoDB ile de endeksleme kullanılmıyor mu?
Rotareti

MongoDB veya diğer doküman odaklı veritabanı sistemleri ne zaman kullanılır? şu anda SO'da silinmiş ... daha fazla .. soruyu iyi koruduğu gibi yeniden açtım. Silme işleminin gerekçesinden emin değilim.
Rahul

9

Verileriniz ilişkisel olmadığında, performans ve ölçeklenebilirlik gibi NoSQL veritabanlarını kullanmanın büyük yararları olabilir (koşullara bağlı olarak). CQRS gibi bazı tasarım patlayıcıları, geleneksel olarak bir SQL veritabanının özel kullanımını gerektiren alanlarda ilişkisel olmayan verilerden yararlanmayı çok daha kolaylaştırır.

Önbelleğe alınmış veriler için mongo gibi veritabanlarını kullanmak yaygındır. Örneğin, bir rapor oluşturmanız gerekiyorsa, anında bir demet veriyi birleştiren ve toplayan karmaşık bir SQL sorgusu yapabilir ya da sadece oluşturmanız gereken her şeye sahip olan mongo veritabanınızdan tek bir json belgesi alabilirsiniz. rapor. Bu, veri okumayı gerçekten kolay (ve hızlı!) Hale getirir, ancak veri yazma işlemini oldukça karmaşık hale getirebilir (CQRS'nin geldiği yer).


8

MongoDB gibi veritabanları genellikle verilerinizin nerede olduğunu bildiğiniz zaman harikadır (birkaç karmaşık sorgu yazmak yerine). Mongo ile "ilgili" veriler ana verinin içine yerleştirilir veya birincil / yabancı anahtarlara sahiptir. Örneğin, Gönderiler ve Yorumlarınız varsa bu harika; Genel olarak yorumları bir gönderi bağlamı dışında görüntülemeyeceksiniz, bu nedenle bir gönderi içinde yorumların yer alması mantıklı geliyor (bu şekilde yazının tüm yorumlarını ayrı bir tabloyu sorgulamaya gerek kalmadan alabilirsiniz).

MongoDB şemadır. Bu, attığınız verinin yapısını büyük oranda alacağı anlamına gelir.

Öte yandan, toplu işlevleri kullanmanız ve verileri Mongo'daki katıştırmalar ya da basit ilişkiler yoluyla elde edilemeyecek karmaşık yollarla sorgulamanız gerektiğine inanıyorsanız, o zaman MySQL ya da PostgreSQL gibi bir RDBMS kullanma zamanı geldiğini biliyorsunuzdur.

MongoDB, SQL'in yerini almaz. Basitçe farklı ihtiyaçları karşılar ve MongoDB ve RDBMS birlikte kullanılabilir. Bana göre, verilerinizin esnek olmasına veya bir ana belgeye gömülü olmasına ihtiyacınız yoksa, MongoDB gerekli değildir. MongoDB ile geliştirme çok eğlenceli, çünkü bir projenin (Rails'te) çalışmaya başlaması için çok daha az adım var. Bir değişiklik yapmanız mı gerekiyor? Sorun değil. Modelinize bir özellik ekleyin. Bitti.

Diğer birçok NoSQL veritabanı için konuşamıyorum, ancak genellikle benzer şekilde bir RDBMS tarafından karşılanamayan belirli bir ihtiyacı karşılamak üzere tasarlandıklarını biliyorum. Bazıları tamamen bellekte bulunur veya çok kolay bir şekilde paylaştırılabilir veya ölçeklenebilir. Bir düğüm düştüğünde Cassandra'nın veri kaybı olmadan çalışmaya devam etmek üzere tasarlandığından eminim. Redis, temel olarak bellekte bulunan (kalıcılık için yazılan periyodik disklerle yazılan) önemli bir değer deposudur, ancak aynı zamanda setler gibi veri tiplerini saklama ve bunları sıralama özelliğine de sahiptir.


6

En büyük kazanç, verileri parçalamak istediğinizde ya da çoklu ana veritabanlarına sahip olduğunuz zamandır. Verileri MySQL'de parçalayabilirsiniz ancak bu büyük bir acıya dönüşür. Çok fazla yazma işlemi yapıyorsanız, verileri birden fazla sunucuya ayırmak genellikle yararlıdır, sorun şu ki eğer bunu yaparken güçlü bir referans tutarlılığı elde etmek istiyorsanız, CAP teoremine bakmak imkansız değilse de çok zor olabilir.

SQL veritabanları çok iyi bir tutarlılığa sahip ama gerçekten kötü bölümleme desteği var, NoSQL veritabanları diğer tarafa gitme eğilimindedir. Bölünmesi kolaydır, ancak çoğu zaman tutarlılık denir. Tamam bir mesajlaşma sitesi inşa ediyorsanız, bir banka için muhtemelen Tamam değil.

Buna ek olarak, artık verilerin depolanmasının birden fazla modeli olduğu için her şeyden önce SQL veritabanları varken bir şeyleri nasıl uygulayacağınızla ilgili bir seçenek var.

SE Radio bu konuda birkaç iyi bölüm yaşadı.


Paylaşımın büyük ölçüde veri merkezinizin mimarisine bağlı olduğu unutulmamalıdır. Bir sunucu rafınız varsa performansı mükemmeldir. Dağıtılmış DC'lerde, çok değil. NoSql DB'lerin genel kullanım kolaylığı hakkında söylediklerinize karar verdiniz - ancak güvenilirlik kilit bir konudur.
Apoorv Khurasia,

Çok fazla yazı yazarsanız, 2 modele sahip olabilirsiniz: denormalize edilmiş güçlü bir indeks okuma modeli VE bir deekslanmamış yazma modeli. Karmaşıklık katan doğal olarak çoğaltma gereklidir. Sizin için dezavantajlı olanı değerlendirmek zorunda kalacaksınız: NoSQL sınırlamaları ile başa çıkmak, yani java alanındaki kayıtları eşleştirmek için kendiniz için çok daha fazla programlama yapın ya da mevcut DB replikasyon teknolojisinin bu işi yapması ya da daha pahalıya mal olması gerekir. yapılandırma ve donanım.
Lawrence

1

MongoDB, çok fazla veri yazdığınızda ve sorgulama gereksinimleriniz çok karmaşık olmadığında iyi çalışır. Bu nedenle, MongoDB, Command tarafında Event Sourcing ile CQRS uyguladığınızda çok uygundur - yani, olay mağazanız bir MongoDB veritabanıdır.

Sorgulama tarafında, esnekliği nedeniyle yine de görünümleri ve WCF Veri Hizmetleri olan bir SQL Server db kullanıyoruz. Bence çoğu durumda sorgulama için ilişkisel bir DB'nin gücüne ihtiyacınız olacak.


Çok fazla veri yazarsanız, küresel yazma kilitleri sizi olumsuz yönde etkilemeyecek mi?
Apoorv Khurasia,

1
Mongodb'un artık global bir yazma kilidi kullanmadığını unutmayın (ve yukarıdaki yorum yayınlandığında istenmeyecek şekilde güncellendi).
Jules,

1

MongoDB ve RDBMS arasındaki acil ve temel fark, temel veri modelidir. İlişkisel bir veritabanı, verileri tablolar ve satırlar halinde yapılandırırken, MongoDB verileri JSON belgeleri koleksiyonları halinde yapılandırır. JSON, kendini tanımlayan, insan tarafından okunabilen bir veri formatıdır. Başlangıçta tarayıcı ve sunucu arasındaki hafif alışverişler için tasarlanmış olup, birçok uygulama için yaygın olarak kabul edilmiştir.

JSON belgeleri özellikle çeşitli nedenlerden dolayı veri yönetimi için kullanışlıdır. Bir JSON belgesi, kendisi için anahtar / değer çiftleri olan bir alan kümesinden oluşur. Bu, her JSON belgesinin, insan tarafından okunabilir şema tasarımını, nereye giderse gitsin, belgelerin anlamlarını kaybetmeden veritabanı ve istemci uygulamaları arasında kolayca hareket etmesine izin vererek taşır.

JSON ayrıca uygulama katmanında kullanım için doğal bir veri formatıdır. JSON, sütunlardan ve satırlardan oluşan tablolardan daha zengin ve daha esnek bir veri yapısını destekler. Sayı, string, Boolean, vb. Gibi destekleyici alan tiplerine ek olarak, JSON alanları diziler veya iç içe geçmiş alt nesneler olabilir. Bu, uygulamalarımızın birlikte çalıştığı nesnelerin daha yakın bir temsili olan bir dizi karmaşık ilişkiyi temsil edebileceğimiz anlamına gelir. JSON belgelerini veritabanımızda kullanmak, veritabanımızla hizmet verdiği uygulamalar arasında nesne ilişkisel bir eşleştiriciye ihtiyacımız olmadığı anlamına gelir. Verilerimizi doğru biçimde tutabiliriz


1

Verileriniz çok fazla sorgulamaya ihtiyaç duyuyorsa, bir NoSQL çözümü iyi değildir ve işlem desteğine (ACID) ihtiyaç duyduğunuzda, bir NoSql en uygun değildir. Bence hızlı okunması gereken çok sayıda okumanız olduğunda ve yapı biraz geçici olduğunda, doküman ya da sayfa yapısıyla böyle bir şey alırsanız, NoSQL'in parladığını düşünüyorum. Ancak çok sayıda NoSQL çözümü oldukça hızlı bir şekilde gelişiyor, bu yüzden belki de yakında eksikler olacak. Neyse, ilişkisel veritabanlarının çoğu uygulama için hala uygun olduğunu düşünüyorum.

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.