MongoDB veya diğer belge tabanlı veritabanı sistemleri ne zaman kullanılır? [kapalı]


516

Video ve ses klipleri, fotoğraflar ve vektör grafikleri için bir platform sunuyoruz. MySQL ile veritabanı arka ucu olarak başladık ve yakın zamanda dosyaların tüm meta bilgilerinin depolanması için MongoDB'yi dahil ettik , çünkü MongoDB gereksinimlere daha iyi uyuyor. Örneğin: fotoğraflarda Exif olabilir bilgileri olabilir, videolarda meta bilgilerini de saklamak istediğimiz ses parçaları bulunabilir. Videolar ve vektör grafikleri ortak meta bilgileri vb. Paylaşmaz. Bu yüzden MongoDB'nin bu yapılandırılmamış verileri depolamak ve aranabilir tutmak için mükemmel olduğunu biliyorum.

Ancak platformumuzu geliştirmeye ve özellikler eklemeye devam ediyoruz. Şimdi sıradaki adımlardan biri kullanıcılarımız için bir forum sağlamak olacak. Şimdi ortaya çıkan soru şudur: forumları ve forum gönderilerini saklamak için iyi bir seçim olan MySQL veritabanını kullanın, ya da bunun için MongoDB'yi kullanın?

Yani soru şu: MongoDB ne zaman ve RDBMS ne zaman kullanılır. Eğer seçiminiz olsaydı ne alırdınız, mongoDB veya MySQL ve neden alırdınız?


12
Açıkça belirtilmediğinde bunun neden fikir tabanlı olarak işaretlendiğinden emin değilim. Burada açık bir doğru ya da yanlış cevap var.
Spencer

Yanıtlar:


659

In NoSQL: Bu kadar kolay mıydı Sadece takdirde hakkında MongoDB, yazar yazıyor:

MongoDB bir anahtar / değer deposu değil, biraz daha fazla. Kesinlikle bir RDBMS de değil. MongoDB'yi üretimde kullanmadım, ancak bir test uygulaması oluşturmak için biraz kullandım ve çok güzel bir kit parçası. Çok performanslı görünüyor ve hata toleransı ve otomatik parçalama var (ya da yakında olacak) (ya da ölçeklendirilecek). Bence Mongo, şimdiye kadar gördüğüm bir RDBMS değişimine en yakın şey olabilir. Tüm veri kümeleri ve erişim kalıpları için çalışmaz, ancak tipik CRUD öğeleriniz için tasarlanmıştır. Esasen büyük bir karma olanı depolamak ve bu anahtarlardan herhangi birini seçebilmek, çoğu insanın ilişkisel bir veritabanı kullanmasıdır.DB'niz 3NF ise ve herhangi bir birleşim yapmazsanız (sadece bir grup tablo seçiyorsunuz ve tüm nesneleri bir araya getiriyorsunuz, çoğu insanın bir web uygulamasında yaptıkları AKA), MongoDB muhtemelen sizin için kıçını tekmeleyecektir.

Sonra, sonuç olarak:

Gerçek şu ki, bir veritabanı seçemediğiniz için süper harika bir şey yapmaktan geri tutuluyorsanız, yanlış yapıyorsunuz. MySQL'i biliyorsanız, sadece kullanın. Gerçekten ihtiyacınız olduğunda optimize edin. Ak / v mağazası gibi kullanın, rdbms gibi kullanın, ama tanrı aşkına katil uygulamanızı oluşturun! Bunların hiçbiri çoğu uygulama için önemli değildir. Facebook hala MySQL kullanıyor. Wikipedia MySQL kullanıyor. FriendFeed çok fazla MySQL kullanıyor. NoSQL harika bir araçtır, ancak kesinlikle rekabet avantajınız olmayacak, uygulamanızı sıcak hale getirmeyecek ve en önemlisi, kullanıcılarınız bunların hiçbirini umursamayacak.

Bir sonraki uygulamamı ne üzerine kuracağım? Muhtemelen Postgres. NoSQL kullanacak mıyım? Olabilir. Ayrıca Hadoop ve Hive kullanabilirim. Her şeyi düz dosyalarda tutabilirim. Belki de Maglev'i hacklemeye başlarım. İş için en iyi olanı kullanacağım. Raporlamaya ihtiyacım olursa, NoSQL kullanmayacağım. Önbelleğe almam gerekirse Tokyo Tyrant kullanacağım. ACIDity'ye ihtiyacım varsa NoSQL kullanmayacağım. Bir ton sayaca ihtiyacım olursa Redis kullanacağım. İşlemlere ihtiyacım olursa Postgres kullanacağım. Bir tonluk tek tip belgem varsa, muhtemelen Mongo kullanacağım. Günde 1 milyar nesne yazmam gerekirse, muhtemelen Voldemort'u kullanırdım. Tam metin araması gerekirse, muhtemelen Solr kullanırdım. Uçucu verilerin tam metin aramasına ihtiyacım varsa, muhtemelen Sphinx'i kullanırdım.

Bu makaleyi beğendim, çok bilgilendirici buluyorum, NoSQL manzara ve hype hakkında iyi bir genel bakış sunuyor. Ancak, bu en önemli kısım, RDBMS ve NoSQL arasında seçim yapmak konusunda kendinize doğru soruları sormanıza yardımcı olur. IMHO okunmaya değer.

Makaleye alternatif bağlantı


4
teşekkürler, gerçekten çok ilginç bir makale.
aurora


48
@iddqd ROFL! Dostum, bu çok komikti. "Sadece ölçütleri almak için güvenilirliği tamamen göz ardı /dev/nulledecek kadar
aptalsanız

3
Hype farkında cevap için teşekkürler.
deamon

2
Umarım BJ Clark tüm bu teknolojileri aynı projede kullanmayı tercih etmez . Bu biraz bir öğrenme eğrisi olurdu.
Adam Monsen

186

MongoDb'yi sosyal bir uygulama için kullandıktan iki yıl sonra, bir SQL RDBMS olmadan yaşamanın gerçekten ne anlama geldiğini gördüm.

  1. Bir RDBMS'nin sizin için otomatik olarak yapacağı, farklı tablolardan / koleksiyonlardan verilere katılma gibi şeyler yapmak için işleri yazıyorsunuz.
  2. NoSQL ile sorgu yetenekleriniz büyük ölçüde sakatlanmıştır. MongoDb, SQL'e en yakın şey olabilir, ancak yine de son derece geride. Güven Bana. SQL sorguları süper sezgisel, esnek ve güçlüdür. MongoDb sorguları değildir.
  3. MongoDb sorguları yalnızca bir koleksiyondan veri alabilir ve yalnızca bir dizinden yararlanabilir. Ve MongoDb muhtemelen en esnek NoSQL veritabanlarından biridir. Birçok senaryoda bu, ilgili kayıtları bulmak için sunucuya daha fazla gidiş-dönüş anlamına gelir. Ve sonra verileri normalleştirmeye başlarsınız - bu arka plan işleri anlamına gelir.
  4. İlişkisel bir veritabanı olmaması, verilerinizin tutarlı olmasını sağlamak için (bazılarının kötü performans gösterdiği düşünülür) yabancı anahtar kısıtlamalarına sahip olmayacağınız anlamına gelir. Bunun sonunda veritabanınızda veri tutarsızlıkları oluşturacağından eminim. Hazır ol. Büyük olasılıkla, veritabanınızı tutarlı tutmak için işlemler veya denetimler yazmaya başlayacaksınız, bu da RDBMS'nin sizin için yapmasına izin vermekten daha iyi performans göstermeyecektir.
  5. Hazırda bekletme gibi olgun çerçeveleri unutun.

Tüm projelerin% 98'inin tipik bir SQL RDBMS ile muhtemelen NoSQL'den çok daha iyi olduğuna inanıyorum.


10
ilginç düşünceler ...
luigi7up

3
Öte yandan, sorgu yetenekleri ve açıkladığınız birleştirmeler bir sorun olmamalıdır: MongoDB kullanıyorsanız, koleksiyonlarınızı ve hangi verileri içine koyacağınızı karmaşık bir şekilde ihtiyacınız olmayacak şekilde tasarlamak için yine de biraz iş yapmanız gerekir. BAĞLANTILAR vb. Neyse DB'ler bir darboğaz değildir ve bazı kullanım durumları için Memcache gibi geçici çözümler vardır. Yine de sıfırdan başlıyorsa, MongoDB'yi tasarlamanın ve kullanmanın daha basit ve daha hızlı olduğunu görebilirsiniz (nesne koduyla çalışan bir geliştirici olarak bir ORM'ye ihtiyacım yok). Tabii birkaç senaryo yazmak zorundasınız, ama aslında o kadar da zor değil ve kodu tekrar kullanıyorsunuz
Aki

1
Çoğu insan, daha sonra birçok tekerleği yeniden icat ederek, yaratıldıkları çok özel kullanım durumu için NoSQL veritabanlarını kullanmayacaktır. NoSQL SQL vs tartışma onlar için, zamanda geriye 20-30 yıl gittiğini sanki çok insan NoSQL kullanarak maruz kalmaları gösterileri -Codd öncesi, ön-ilişkisel, ön SQL kez . Veya, Michael Stonebraker'in dediği gibi: "Etrafında Ne Var"
Lukas Eder

1
3. madde, "ve yalnızca tek bir dizinden yararlanın" bugün hala geçerli mi? Ben sadece şimdi MongoDB giriyorum ve şimdiye kadar okudum / görüntülediğimden görünüyor birden çok dizin destekleyebilir?
Jeach

1
@Jeach: Hayır, # 3 artık doğru değil. MongoDB 2.6, indeks kesişimini tanıttı .
Rob Garrison

26

bu yapılandırılmamış verileri depolamak için

Dediğiniz gibi, MongoDB yapılandırılmamış verileri depolamak için en uygunudur. Bu da verilerinizi belge biçiminde düzenleyebilir. NoSQL veri depoları ( MongoDB , CouchDB , Voldemort ) adı verilen bu RDBMS alternatifleri , büyük ölçekli ölçeklenen ve bu büyük veri depolarından daha hızlı veri erişimi gerektiren uygulamalar için çok kullanışlıdır.

Ve bu veritabanlarının uygulanması normal RDBMS'den daha basittir. Bunlar basit anahtar değerli veya doğrudan disk içine serileştirilmiş belge tarzı ikili nesneler olduğundan. Bu veri depoları, ACID özelliklerini ve şemaları . Bu herhangi bir işlem yeteneği sağlamaz . Böylece bu büyük ölçeklenebilir ve daha hızlı erişim sağlayabiliriz (hem okuma hem de yazma).

Ancak bunun aksine, RDBM veriler üzerinde ACID ve şemaları uygular. Yapısal verilerle çalışmak istiyorsanız RDBM ile devam edebilirsiniz.

Bu tür şeyler için forumlar oluşturmak için MySQL'i seçerdim . Çünkü bu büyük ölçekli olmayacak. Ve bu veriler arasında ilişkileri yapılandırmış çok basit (yaygın) bir uygulamadır.


10
"Ben forum tür şeyler oluşturmak için mysql seçiyor." Gerçekten mi? Forumlar gibi şeyler belge odaklı bir veritabanı kullanarak yazmak için ilişkisel (daha sıfırdan yazdıysanız) çok daha kolay olacağını düşünüyorum. Özellikle bir RDBMS'nin özelliklerine ihtiyacınız yoksa, kullanım kolaylığı ve ölçeklendirme için MongoDB veya benzer bir veritabanıyla git diyebilirim.
Sasha Chedygov

2
CouchDB'nin ASİT desteği vardır. couchdb.apache.org/docs/overview.html
Sonia

2018:
MongoDB'nin

10

Mongo'nun esas olarak JSON'u sakladığını unutmayın. Uygulamanız çok sayıda JS Nesnesi ile uğraşıyorsa (yuvalama ile) ve bu nesneleri devam ettirmek istiyorsanız, Mongo'yu kullanmak için çok güçlü bir argüman vardır. DAL ve MVC katmanlarınızı ultra ince yapar, çünkü tüm JS nesne özelliklerini paketinden çıkarmazlar ve bunları doğal olarak sığmadıkları bir yapıya (şema) zorla sığdırmaya çalışırlar.

Kalbinde birkaç karmaşık JS Nesnesi olan bir sistemimiz var ve Mongo'yu seviyoruz çünkü her şeyi gerçekten, gerçekten kolay bir şekilde devam ettirebiliriz. Nesnelerimiz de oldukça şekilsiz ve yapılandırılmamış ve Mongo bu komplikasyonu yanıp sönmeden emiyor. İnsan tüketimi için amorf verileri deşifre eden özel bir raporlama katmanımız var ve bunun geliştirilmesi zor değildi.


7

Karmaşık işlemlere ihtiyacınız varsa bir RDBMS kullanın diyebilirim. Aksi takdirde MongoDB ile giderdim - çalışmak için daha esnek ve ihtiyacınız olduğunda ölçeklenebileceğini biliyorsunuz. (Yine de önyargılıyım - MongoDB projesi üzerinde çalışıyorum)


7
Karmaşık işlemler MongoDB'de çalışmaz, ancak MarkLogic gibi diğer NoSQL veritabanlarında çalışırlar (MarkLogic için geliştirici topluluğunu çalıştırdığım için ben de yanlıyım).
Eric Bloch

MarkLogic'e ipucu için teşekkürler - bilmiyordum.
aurora

Bunu mdirolf'tan duymak istiyorum. MongoDB neden işlem yapmamayı seçti?
Aki

7

Kimler dağıtılmış, parçalanmış forumlara ihtiyaç duyar? Belki Facebook, ancak bir Facebook rakibi oluşturmazsanız, Mysql, Postgres veya en rahat olduğunuz şeyi kullanın. Eğer MongoDB'yi denemek istiyorsanız, tamam, ama sizin için sihir yapmasını beklemeyin. Her şeyde olduğu gibi tuhaflıkları ve genel hırsızlığı olacak, çünkü gerçekten üzerinde çalışıp çalışmadığınızı zaten keşfettiğinizden eminim.

Tabii ki, MongoDB hiper olabilir ve yüzeyde kolay görünebilir, ancak daha olgun ürünlerin zaten üstesinden geldiği problemlerle karşılaşırsınız. Bu kadar kolay yemlenmeyin, aksine "nosql" olgunlaşana veya ölene kadar bekleyin.

Şahsen, "nosql" parçalanmış ve solmuş olacağını düşünüyorum, çünkü belirlenmiş standartlar yok (neredeyse tanım gereği). Bu yüzden uzun vadeli projeler için şahsen bahse girmeyeceğim.

Kitabımda "nosql" 'i kurtarabilecek tek şey, Ruby veya benzer dillere sorunsuz bir şekilde entegre olabilmesi ve dili kodlama ve tasarımda herhangi bir ek yük olmadan "kalıcı" hale getirebilmesidir. Bu geçebilir, ama o zamana kadar bekleyeceğim, şimdi değil, ve tabii ki daha olgun olması gerekiyor.

Btw, neden sıfırdan bir forum oluşturuyorsun? Gerçekten Yeni Nesil Forumlar (şüpheliyim) oluşturmazsanız, çoğu gereksinime uyacak şekilde ayarlanabilen tonlarca açık kaynak forumu vardır.


5
Cevabınız için teşekkürler. bir forumu entegre etmek bir karışıklıktır - bunu zaten yaptık ve bir daha bu şekilde gitmemeye karar verdik: binlerce özelliğe değil, yazılımımızla tam bir entegrasyona ihtiyacımız var.
aurora

4

Birçok şirkette uygulama kayıtlarından gerçek zamanlı analizler için MongoDB kullandığını gördüm. Şema-ekransızlığı, kayıt şemasının zaman zaman değişme eğiliminde olduğu uygulama günlüklerine gerçekten uyar. Ayrıca, Sınırlı Koleksiyon özelliği, verileri belleğe sığdırmak için eski verileri otomatik olarak temizlediği için kullanışlıdır.

Bu gerçekten MongoDB için uygun olduğunu düşünüyorum bir alandır, ancak MySQL / PostgreSQL daha genel olarak tavsiye edilir. Web üzerinde birçok dokümantasyon ve geliştirici kaynağı, bunların yanı sıra işlevselliği ve sağlamlığı vardır.


4

Moğol'u tercih etmenizin 2 ana nedeni:

  • Şema tasarımında esneklik (JSON tipi belge deposu).
  • Ölçeklenebilirlik - Sadece düğümleri toplayın ve yatay olarak oldukça iyi ölçeklenebilir.

Büyük veri uygulamaları için uygundur. RDBMS, büyük veriler için iyi değildir.


3

Biliyorsunuz, birleşmeler ve 'karmaşık işlemler' ile ilgili tüm bu şeyler - ama yıllar önce COMMIT / ROLLBACK'in “ihtiyacını” açıklayan Monty'nin kendisi 'mantık sınıflarında yapılan her şeyi açıkladı' (ve veritabanını değil) zaten '- yani her şey tekrar aynı. İhtiyaç duyulan şey, web uygulamalarının% 99'u için aptal ama inanılmaz derecede düzenli ve hızlı bir veri depolama / alma motorudur.


Teşekkürler, burada ilginç bir noktaya değindiniz. Birden fazla tablodaki güncellemelerin karmaşık geri dönüşlerinin saf uygulama mantığına nasıl ulaştığından emin olmadığım için gerçekten Monty'nin açıklamasıyla ilgileneceğim - bu gerçekten mümkün olup olmadığından emin değilim?
aurora

'En iyi' yoldan da emin değilim. Her zaman DB'ye yapılan her şeyi izledik ve sonra uygulama düzeyinde kodla izin veriyoruz veya geri alıyoruz. Hiçbir zaman, hiçbir yerde, işlemlere güvenmedik. Moğol dokümanlar, geri alınabilir işlemin hangi bölümlerinin gerçekleştiğini, işlemin hangi durumda olduğunu, kırılması ve geri alınması gerektiğinde izlemek için meta verileri kullanmanızı önerir. Komik olan şey, bunu zaten MySQL ve diğerleriyle birlikte yapıyorduk. Çok daha fazla iş değil ve siyah boks yapmak yerine neler, ne zaman, nerede ve neden olduğuna odaklanıyor.
FYA

Bu konuda 10gen web sitesinde bir not var ... çok aşamalı bir sürecin durumunu belirtmek için 'kenetleme' alanlarının veya 'kilitlerin' elle nasıl kullanıldığından bahsediliyor. Bana öyle geliyor ki, MySQL motorunun kendisine yakınlaştırırsanız, "blok işlemi" ne olursa olsun yine de bir dizi adıma genişler; sadece kilitlerin veya kilitlerin veritabanı alanlarında izlemeyi manuel olarak yapmaktan çok daha küçük ve daha hızlı bir şekilde yapılmasıdır.
FYA

MongoDB arka plan programını sınırlamak için henüz iyi bir yol bulamadık - diğer procs'lara ihtiyaç duyduğunda hızlı bir şekilde bellek verirken, indeksi ve bellekteki veri depolaması için neredeyse tüm RAM'leri silip süpürüyor. Yine de, MongoDB'nin kaçmadığından ve sunucuyu takas atma işlemine göndermediğinden emin olmak için 'use_max_memory' veya başka kolay tanımlanabilir sınırlara sahip olmak güzel olurdu (bunu en son sürümde bile birkaç kez gördük). En azından MySQL her türlü tanımlanabilir limiti ve çalışma ipucunu kabul eder.
FYA

Doğrudan ilgili değil, ancak tür: Memcached kullanıyorduk ama hala çözülmemiş Memcache / Memcached PHP sürücüsü fiyasko nedeniyle vazgeçtik. Hızlı ve geçici bir anahtar olarak MongoDB'yi kullandık: val store (bunun için harika çalıştı!) Ne kadar hızlı ve kolay olduğunu keşfedene kadar apc_store (). APC'nin memcached'de stach yapmak için kullandığımız geçici kabuk (önceden derlenmiş PHP'ye karşı) doldurduğunu tespit edersek, anahtar: val depolama için MongoDB'ye döneceğiz.
FYA

1

Daha önce de belirtildiği gibi, birçok seçenek arasından seçim yapabilir, tüm bu seçeneklere göz atabilirsiniz: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

Önerdiğim en iyi kombinasyonu bulmak: ACID'e ihtiyacınız varsa ve bazı tablolara katılmak istiyorsanız MySQL + Memcache gerçekten harika MongoDB + Redis belge deposu için mükemmel Neo4J grafik veritabanı için mükemmel

Ne yapmam: MySQl + Memcache ile başladım çünkü kullanıyorum, sonra başkalarının veritabanı çerçevesini kullanmaya başladım. Tek bir projede, örneğin MySQL ve MongoDB'yi birleştirebilirsiniz!


MySQL + memcached size Nihai Tutarlılık verir. Hangi ben bir RDMB bağlamında ASİT düşünmüyorum.
R. van Twisk
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.